반응형

목표 

스프링 부트 웹 프로젝트 에노테이션 정리 


들어가기 전에..

주제가 web인 만큼 web 스타터를 한번 살펴보겠다. 

스프링 부트 웹 스타터에 내부에는 어떤 의존성을 갖고 있는지 확인해보겠다.

 

먼저 자신의 스타터 버전을 확인하고 싶으면 Intellij 기준으로 왼쪽 project 탭 아래에 External Libraies에서 starter 라이브러리를 찾으면 된다.(현재 2.4.4 버전 starter를 사용 중인 것을 확인할 수 있다.)

 

 

아래 url에서 자신의 스프링 부트 버전 브랜치를 선택하면 스타터에 명시된 버전의 의존성을 확인할 수 있다.

- github.com/spring-projects/spring-boot/tree/2.4.x/spring-boot-project/spring-boot-dependencies

 

스프링 부트 버전에 따라 달라진 점 확인은 아래 링크에서 확인 가능하다.

- github.com/spring-projects/spring-boot/wiki

 

에노테이션 정리

Lombok을 사용하면 생성자도 자동으로 생성할 수 있습니다. 

@NoArgsConstructor - 어노테이션은 파라미터가 없는 기본 생성자를 생성 

@AllArgsConstructor - 어노테이션은 모든 필드 값을 파라미터로 받는 생성자를 생성

@RequiredArgsConstructor - 어노테이션은 final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 생성

 

@GeneratedValue - 기본 키가 자동으로 할당되도록 설정하는 어노테이션

@Enumerated - Enum 타입 매핑용 에노테이션 (EnumType.STRING으로 사용을 권장, ORDINAL 사용 시 나중에 칼럼이 추가되거나 순서 변경될 때 심각한 오류 발생 우려가 있다.)

 

@Autowired - 의존성 주입하는 어노테이션 아래와 같이 권장하지 않는다.(생성자 주입 방식 권장)

 

친절한 intellij 해당 에노테이션을 추천하지 않는다고 해서 궁금해서 찾아보았다.

의존성을 주입하는 방식은 3가지가 있다.

1. 생성자 주입(Constructor Injection) - 권장

생성자 주입

2. 필드 주입(Field Injection)

필드 주입

3. 수정자 주입(Setter Injection)

수정자 주입

생성자 주입 방식과 필드, 수정자 주입 방식의 차이점

여러 가지 차이점이 있지만 대표적으로 객체 생성 시점이 아닌가 싶다.

객체 생성시점에서 순환 참조가 일어나는 것(생성자 주입) 객체생성 후 비즈니스 로직상에서 순환참조가 일어나는 것(필드, 수정자 주입)

필드 주입이나, 수정자 주입은 객체 생성 시점에는 순환참조가 일어나는지 아닌지 발견할 수 있는 방법이 없다.

생성자 주입은 컨테이너가 빈을 생성하는 시점에서 순환 참조가 있다면 객체 생성에 사이클관계가 생기기 때문에 앱구동 자체가 실패한다.

 

생성자 주입 방식 권장하는 이유

  • 의존관계 설정이 되지 않으면 객체생성 불가
  • 의존성 주입이 필요한 필드를 final로 선언 가능 - 객체 불변성 보장
  • 순환 참조 - 순환 참조 시 앱 구동 실패
  • 테스트 코드 작성 용이 - 필드 주입을 하면 단위 테스트 시 의존관계를 가지는 객체를 생성해서 주입할 수가 없다.
728x90
반응형

+ Recent posts