You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
💡 참고@Autowired의 기본 동작은 주입할 대상이 없으면 오류가 발생함. 주입할 대상이 없어도 동작하게 하려면 @Autowired(required = false)로 지정하면 됨
💡 참고
스프링 라이프 사이클은 크게 스프링 빈 등록과 의존관계 주입 두 단계로 나뉘는데 생성자 주입의 경우 빈을 등록할 때 생성자가 필요하고 그에 따라 의존관계도 생성자 생성 시에 이루어진다. 스프링 빈 등록과 의존관계 주입 단계가 명확하게 나뉘지 않는 것이다. 반면에 setter 주입의 경우 먼저 스프링 빈 등록을 하고 @Autowired를 통해 의존관계를 주입하는 단계로 나뉘는 것을 확인할 수 있다. 따라서 생성자 주입과 setter 주입이 함께 있으면 생성자 주입이 더 먼저 이루어지는 것을 확인할 수 있다.
3️⃣ 필드 주입
필드에 바로 주입하는 방법
코드가 간결하다는 장점은 있지만 외부에서 변경이 불가능해 테스트 하기 힘들다는 치명적인 단점이 있음
DI 컨테이너가 없으면 아무것도 할 수 없음
➡️ 사용하지 말자!
애플리케이션의 실제 코드와 관계없는 테스트 코드나 스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만 특별한 용도로 사용
생성자 코드를 애노테이션으로 대체하여 간결한 코드를 확인할 수 있다.
최근에는 생성자를 딱 1개 두고, @Autowired를 생략하는 방법을 주로 사용한다. 여기에 롬복 라이브러리의 @RequiredArgsConstructor를 함께 사용하면 기능은 다 제공하면서 코드를 깔끔하게 사용할 수 있다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
다양한 의존관계 주입 방법
1️⃣ 생성자 주입
2️⃣ 수정자 주입 (setter 주입)
3️⃣ 필드 주입
4️⃣ 일반 메서드 주입
1️⃣ 생성자 주입
불변,필수의존 관계에 사용⭐️ 스프링 빈에 해당하면
@Autowired를 생략해도 자동 주입된다.2️⃣ 수정자 주입 (setter 주입)
선택,변경가능성이 있는 의존 관계에 사용💡 참고
@Autowired의 기본 동작은 주입할 대상이 없으면 오류가 발생함. 주입할 대상이 없어도 동작하게 하려면@Autowired(required = false)로 지정하면 됨💡 참고
스프링 라이프 사이클은 크게 스프링 빈 등록과 의존관계 주입 두 단계로 나뉘는데 생성자 주입의 경우 빈을 등록할 때 생성자가 필요하고 그에 따라 의존관계도 생성자 생성 시에 이루어진다. 스프링 빈 등록과 의존관계 주입 단계가 명확하게 나뉘지 않는 것이다. 반면에 setter 주입의 경우 먼저 스프링 빈 등록을 하고
@Autowired를 통해 의존관계를 주입하는 단계로 나뉘는 것을 확인할 수 있다. 따라서 생성자 주입과 setter 주입이 함께 있으면 생성자 주입이 더 먼저 이루어지는 것을 확인할 수 있다.3️⃣ 필드 주입
DI 컨테이너가 없으면 아무것도 할 수 없음➡️ 사용하지 말자!
@Configuration같은 곳에서만 특별한 용도로 사용4️⃣ 일반 메서드 주입
💡 참고 의존관계 자동 주입은 스프링 컨테이너가 관리하는
스프링 빈이어야 동작함. 스프링 빈이 아닌Member와 같은 클래스에서@Autowired애노테이션을 적용해도 아무 기능도 동작하지 않음옵션 처리
주입할 스프링 빈이 없어도 동작해야 할 때가 있다.
@Autowired만 사용하면required의 기본 옵션이true로 되어 있어 자동 주입 대상이 없으면 오류가 발생한다.@Autowired(required = false): 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출이 안 됨org.springframework.lang.@Nullable: 자동 주입할 대상이 없으면null이 입력된다.Optional<>: 자동 주입할 대상이 없으면Optional.empty가 입력된다.실행결과
생성자 주입을 선택해라
불변
누락
setter 의존관계일 경우 의존관계가 누락하는 경우에 NPE가 발생한다.
반면 생성자 주입을 사용하면 주입 데이터를 누락했을 때 컴파일 오류가 발생하여 오류를 사전에 차단할 수 있다.
final 키워드
생성자 주입을 사용하면
final키워드를 사용할 수 있다. 생성자에게 혹시라도 값이 설정되지 않는 오류를 컴파일 시점에 막아준다.⭐️ **컴파일 오류는 세상에서 가장 빠르고 좋은 오류다! ⭐️
수정자 주입을 포함한 나머지 주입 방식은 모두 생성자 이후에 호출되므로 필드에
final키워드를 사용할 수 없고 오직 생성자 주입만final키워드를 사용할 수 있다.생성자 주입 정리
롬복과 최신 트렌드
롬복 라이브러리가 제공하는
@RequiredArgsConstructor기능을 사용하면 final이 붙은 필드를 모아서 생성자를 자동으로 만들어준다.생성자 코드를 애노테이션으로 대체하여 간결한 코드를 확인할 수 있다.
최근에는 생성자를 딱 1개 두고,
@Autowired를 생략하는 방법을 주로 사용한다. 여기에 롬복 라이브러리의@RequiredArgsConstructor를 함께 사용하면 기능은 다 제공하면서 코드를 깔끔하게 사용할 수 있다.롬복 라이브러리 적용 방법
build.gradle에 라이브러리 및 환경 추가Enable annotation processing체크All reactions