전체 글

꾸준하게 열심히..
💐 Spring/개념 및 이해

Spring MVC | @Valid는 어떻게 동작하는거야? (feat. DispatcherServlet)

@Valid Spring Boot에서 @Valid를 @RequestBody 객체에 붙이게 되면, 이때 스프링은 Hibernate Validator(javax.validation 패키지에 있는 JSR-303/JSR-380인 BeanValidation을 활용함)를 사용하게 됩니다. Spring MVC에서는 Validation이 어떻게 동작하는지 MVC 동작원리와 함께 살펴보겠습니다. Dispatcher Servlet 아래는 Spring MVC의 동작구조를 도식화한 것입니다. 하나하나 차근히 살펴보겠습니다. 클라이언트 요청을 제일 먼저 받는 디스패처 서블릿(프론트 컨트롤러)입니다. DispatcherServlet의 HandlerMapping 전략을 통해 클라이언트의 요청을 처리해 줄 Controller를 찾습..

🌧️ ORM/JPA

JPA 복합키 사용 시 주의사항 (feat. 테스트 케이스로 알아보자)

Intro 다대다 테이블을 보통 일대다 ↔ 다대일 테이블로 풀어서 구성하곤 합니다. 중간에 이어주는 테이블을 중간 테이블이라고 부르는데 이 테이블의 PK가 양쪽 테이블의 PK를 가지고 복합키를 구성할 수 있습니다. JPA에서 복합키로 PK를 구성했을 때, 저장 또는 PK를 업데이트를 해야할 때 주의해야 할 점에 대해서 알아보도록 하겠습니다. 개발환경 SpringBoot 2.5.11 Java 11 H2 memory db 테스트용 엔티티 소개 @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Member { @Id @GeneratedValue private Long id; private String name; @Ma..

💐 Spring

Spring Validation을 통해 데이터 유효성 검증하기

Validation 요청 데이터의 유효성 검증(사용자의 아이디의 길이라던지 정규표현식에 만족하는지에 대한 검증 등등)과 비즈니스 로직은 보통 Service 로직에 담겨있습니다. DB 중복 체크 등 비즈니스 로직은 서비스에 두고, 이 데이터의 유효성 검사를 스프링 부트에서 제공해주는 Validation 기능을 이용하면 손쉽게 검증할 수 있을 뿐더러 서비스에는 오직 핵심 비즈니스 로직만 둘 수 있는 장점을 가져갈 수 있을 것 같습니다. 아래 실습을 통해 자세하게 알아보겠습니다. 개발환경 SpringBoot 2.7.9 JDK 11 Gradle 의존성 추가 SpringBoot 2.3.0 이상부터는 의존성이 포함되어 있지 않기 때문에 직접 추가해줘야 합니다. implementation 'org.springfram..

💐 Spring

Springdoc을 이용한 API 문서 자동화 (Swagger, SpringBoot 3.x)

Spring Boot 3.x.x 부터는 JavaEE → Jakarta EE로 교체되었습니다. 그렇기 때문에 이전에 사용했던 Springfox는 현재 Spring Boot 3.x.x에 대한 업데이트가 이뤄지지 않고 현시점에는 사용할 수 없었습니다. Springdoc 공식문서에서 어떻게 적용할 수 있는지에 대한 자세한 방법이 나와있으니 참고하시면 좋을 것 같습니다. springdoc-openapi v2.0.2 의존성 추가 Spring Boot 3.x.x부터는 아래 의존성을 추가해주면 Swagger-ui 설정은 끝입니다. implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2" springdoc-openapi-ui → springdoc-..

🌻 JAVA/디자인 패턴

Factory Pattern (feat. 추상 팩토리, 팩토리 메소드)

1. 간단한 팩토리 패턴 먼저 간단한 팩토리를 만들어보고 이를 점진적으로 패턴을 적용하여 업그레이드 하는 식으로 진행해보겠습니다. 먼저 아래에 노트북을 생성하는 함수가 있습니다. 매개변수 type에 따라서 노트북을 생성하고 준비, 설정, 포장해서 최종적으로 노트북을 반환하게 됩니다. public NoteBook creatNoteBook(String type) { NoteBook noteBook; if(type.equals("Macbook")) { noteBook = new MackBook(); } else if (type.equals("LG Gram")) { noteBook = new LGGram(); } else if (type.equals("GalaxyBook")) { noteBook = new Ga..

⚙️ Devops/🌈 Jenkins

Jenkins, Docker를 이용한 무중단 배포 시작하기

시작하기 예전에는 배포하는 날이면 접속하는 사용자가 적은 새벽시간에 했다고 본적이 있습니다. 배포를 할 때에는 새로운 버전의 jar 파일을 배포할 서버로 복사시키고, 직접 SSH로 접속하여 jar를 변경하여 실행하는 것이였습니다. 이렇게 배포를 진행하면, 배포를 할 때마다 개발자의 많은 리소스가 들어간다는 단점과 jar를 바꿔끼는 그 찰나에 서비스가 끊긴다는 치명적인 단점이 존재합니다. 그래서 이번 시간에는 어떻게 하면 배포를 자동화하고, 또 기존 서비스를 정지시키지 않고 배포할 수 있는지 알아보도록 하겠습니다. 위에서 말한 이 무중단 배포에는 여러 방법들이 있습니다. Nginx로 무중단 배포 AWS에서 Blue-Green 무중단 배포 도커를 이용한 무중단 배포 이번 시간에는 하나의 서버가 있다고 가정하..

iseunghan
iseunghan