Spring Boot
@Builder 사용시 초기화 필드는 어떻게 될까?
Account 클래스는 컬렉션을 참조하고 있고 null 방지를 위해 필드에서 초기화를 진행한 엔티티에 Tag 를 컬렉션에 추가하는 상황에 null 이 발생하는 이슈를 정리하는 글입니다. 아래와 같은 Account 클래스가 있다. @Builder @Entity public class Account { @Id @GeneratedValue private Long id; private String name; @ManyToMany private Set tags = new HashSet(); } 위의 Account 클래스를 빌더로 인스턴스를 생성하여 저장하고 Tag 도 저장한다. @DisplayName("계정에 태그를 추가하는 테스트") @Test @Transactional void addTag() { Accoun..
[Spring boot] 순환 참조 이슈
@ManyToOne 과 @OneToMany 의 양방향 관계 매핑을 하여 대댓글을 구현하는데 만난 이슈를 적어보려합니다. 먼저 클라이언트에서 서버로 데이터를 주고 받을 수 있는 방법은 직렬화를 통해서 데이터를 주고 받고 한다. spring에선 jackson 라이브러리를 활용하여 json으로 통신이 가능하다. jackson은 공개 필드에 관해서만 직렬화를 가능하게 해준다. 비공개 필드는 Getter을 활용하고 Setter로 접근하여 역직렬화를 시도한다. 참조: https://www.baeldung.com/jackson-field-serializable-deserializable-or-not 이슈의 과정을 살펴보자. 대댓글과 같은 계층 구조를 아래와 같이 연관관계 설정을 하였다. @ManyToOne(fetch..
[Spring Boot] Spring 에서 비동기 처리 방식은 어떻게 하고 왜 사용해야 할까?
들어가기전. 동기식과 비동기식을 이해하고 있어야 한다. 이 방식을 이해하고 넘어가면 Spring에서 간단히 에노테이션만 붙여주면 적용법은 끝날 것이다. 먼저 동기식을 설명하겠다. 동기식은 개념은 동시에 처리 하는 방식이라 생각하면 된다. 요청과 응답이 시간이 얼마나 걸리던지 요청한 자리에서 결과가 주어져야 한다. 비동기식의 개념은 동시에 처리 하는 방식이 아니라 생각하면 된다. 즉, 요청을 보내면 동시에 응답이 일어나지 않는다. 동기식의 구현은 매우 간단하고 직관적이지만 응답이 내려질 때까지 아무것도 못하고 대기해야 하고 교착 상태와 기아 상태가 발생할 수 있다는 단점이 있다. 비동기식의 동기식보다 복잡하지만 응답이 내려지는데 시간이 걸리더라도 다른 스레드가 다른 작업을 할 수 있다. 하지만 스레드 안정..
[Spring Boot] Interceptor 는 어떻게 사용하고 왜 사용해야 할까?
들어가기전. Interceptor 는 filter와 유사하다. 요청 응답의 정보가 전달 되면 전 후 처리를 할 수 있다. 정보를 가로 채서 컨트롤 할 수 있다. 주로 인증 단계나 필터와 같이 로깅 작업을 할 수 있다. Interceptor는 계층 구조로 하나의 interceptor가 실행되고 또 하나의 interceptor를 추가해 단계 별로 인증체크를 할 수 있다. 사용법을 알아가기 전에 Filter와의 차이점은 무엇일까? 아래의 구성도를 살펴보자. 필터는 스프링 컨텍스트 외부에서 적용이 되고 인터셉터는 스프링 컨텍스트 내부에서 적용이 되고 있다. 필터의 doFilter() 메서드의 매개변수도 살펴보자. 컨텍스트의 Object가 존재하지 않는다. 인터셉트의 메서드의 매개변수를 살펴보자. 핸들러를 할 수..
[Spring Boot] Filter를 왜 사용해야하고 어떻게 사용하는 걸까?
Servlet 에서 제공하는 기능이자 스프링 프레임워크에서도 제공하는 기능이다. 말 그대로 앞단에서 무언가를 걸러줄 때 사용한다. 아래 그림은 대표적인 구성도다. DisPatherServlet 앞단에서 존재하고 있고 DisPatherServlet이 요청과 응답을 다루기 전과 후에 동작을 한다. 위 그림만 보면 라이프 사이클이 예상 될 것이다. 클라이언트로부터 오는 모든 요청과 응답의 순수한 정보에 대해서 컨트롤 할 수 있다는 것을 기대한다. 특징 순수한 RequestBody와 ResponseBody를 확인을 할 수 있다. 유일하게 servletRequest, servletResponse의 객체를 변환 할 수 있다. 인증과 관련된 로직들을 해당 필터에서 처리한다. 왜 Filter 사용해야할까? 요청으로 들..
[Spring Boot] Validation을 왜 해야하고 어떻게 할까?
Validation 사전적 의미를 찾아보자 출처 : https://ko.wikipedia.org/wiki/밸리데이션 밸리데이션 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. 밸리데이션(Validation)이란 '특정 공정이 설정된 규격과 품질 요소들을 만족하고 있는 제품을 지속적으로 생산하고 있음을 보증하기 위한 증거를 문서화하는 것' ko.wikipedia.org 시스템이 사전 설정된 허용 기준에 부합하는 결과를 일관되게 만들어내는 점을 문서화된 프로그램으로 정의하는 것이라 나와 있다. 즉, 서버에 들어온 데이터가 서버에서 요구하는 스펙이랑 일치하는지의 검사를 말한다. 그렇다면 왜 이러한 검사를 해야할까? null 인 데이터를 받아 객체를 인스턴스화를 하면 인스턴스를 만들 수 없..
[Spring Boot] 예외처리를 왜 해야하고 어떻게 처리할까?
예외와 오류에 대해 알아보자. 먼저 예외(Exception) 과 오류(Error)는 다르다는 것을 명심하자. 오류(Error)는 시스템이 정상 활동 되다가 갑자기 종료되거나 서비스가 작동작하지 않고 먹통 상태가 되는 심각한 영향을 준다. 오류 처리를 왜 해야하는가? 2가지만 명심하자. 시간 돈 오류 해결에 의해 시간과 돈이 들어간다. 서비스가 먹통이 되면 엄청난 손실이 올 것이다. 예외(Exception)는 개발자 즉, 프로그램을 만든 사람의 실수에서 나온다. 개발 당시에 생각하지 못한 부분에서 프로그램에 잘못된 영향을 준다. 예외 처리를 왜 해야하는가? 사용자에 임시적인 가이드를 제공 예외도 서비스를 사용하는 사람 입장에서 불편함이 있겠지만 프로그램이 완전히 죽는 것 보단 나을 것이다. 예외, Erro..
ModelMapper
[Spring] ModelMapper ModelMapper는 엔티티와 DTO 간에 변환 시 자동으로 Object를 매핑시켜주는 라이브러리다. 기본적으로 제공해주는 map() 메서드로 소스로 제공 할 object와 매핑할려는 object를 매개 변수로 받는다. 아래와 같은 UserSaveRequestDto 라는 DTO 가 있다. @Data @NoArgsConstructor public class UserSaveRequestDto { ....// 코드 생략 } 이를 User 엔티티로 매핑을 시켜주고 싶을 때 modelMapper 를 사용한다. @Getter @Entity @Table(name = "users") @NoArgsConstructor(access = AccessLevel.PROTECTED) @To..
[Spring Boot] Spring Dependency Injection 동작 원리와 Ioc Container를 알아보자
학습 목차 @Component 애노테이션을 사용하면 왜 싱글톤 인스턴스가 생성이 되지? reflection 기능을 이해해보자 애노테이션을 사용해보자 Dependency Injection 을 만들어보자 Spring IOC Container 가 무엇인지? @Component 애노테이션을 사용하면 왜 싱글톤 인스턴스가 생성이 되지? BookRepository 의 의존성을 가진 BookService 가 있습니다 public class BookRepository { } public class BookService { public BookRepository bookRepository; } 테스트 코드를 사용하여 BookService의 인스턴스를 생성하지 않고 null 인지 테스트를 해보겠습니다. BookServic..