Today I Learned_220726
Spring Framework
Dependency Injection(의존관계 주입)
생성자 주입, 수정자 주입, 필드 주입, 메소드 주입 등 여러 방법이 있지만, 가급적이면 생성자 주입을 선택하자.
생성자 주입을 선택해야 하는 이유
-
불변
생성자 주입은 객체를 생성할 때 딱 1번만 호출되어 이후에 호출되는 일이 없음 -> 불변하게 설계 가능
수정자 주입의 경우 set 메소드를 열어놓아야 함 -> 누군가가 수정할 가능성이 있음
대부분의 의존관계 주입은 한 번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다.
-
누락
생성자 주입을 사용하면 주입 데이터를 누락했을 때 컴파일 오류가 발생
수정자 주입을 사용하면 컴파일 단계에서 오류를 잡기 힘들다.
-
final
생성자 주입을 사용하면 필드에 final 키워드 사용 가능 -> 값이 설정되지 않는 오류를 컴파일 단계에서 막아준다.
생성자 주입 외에 다른 방법은 생성자 이후에 호출되므로 final 키워드를 사용할 수 없음.
생성자 주입을 선택하는 이유는 프레임워크에 의존하지 않고 순수한 자바 언어의 특징을 잘 살리는 방법이다.
기본적으로 생성자 주입을 사용하고 옵션으로 수정자 주입을 사용하자 -> 그냥 웬만하면 생성자 주입 사용하자
Lombok을 이용한 생성자 주입
Lombok : 라이브러리의 일종으로, getter/setter/생성자 등을 만들어준다.
@RequiredArgeConstructor : final이 붙은 필드를 모아서 생성자를 자동으로 만들어준다.
장점 : 의존관계 추가할 때 편하다.
Lombok 라이브러리 추가 방법
build.gradle에 추가
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
//dependencies 내부에 추가
dependencies {
...
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
...
}
Preference
- Plugin -> lombok 설치(웬만하면 그냥 깔려있음)
-
Annotation Processors -> Enable annotation processing
Lombok은 AnnotationProcessor를 통해 동작하며, 컴파일 시점에 코드를 자동으로 생성해 준다.
- 임의의 테스트 클래스에서 @Getter, @Setter가 생성되는지 확인
다수의 빈이 조회될 때
- @Autowired의 필드명 매칭 사용
- @Qualifier
- @Primary
@Autowired의 필드명 매칭
@Autowired는 기본적으로 타입 매칭을 시도하되, 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈을 매칭한다.
타입 매칭이 완료되면 필드 매칭은 추가적으로 진행하지는 않는다.
@Qualifier
수정자 주입, 필드 주입 등에서도 사용이 가능하다.
빈의 이름을 변경하는 것은 아니고 구분 시의 추가적인 옵션을 제공하는 것이다.
@Qualifier(“구분값”) 과 같이 사용하며, 빈 등록 시 @Qualifier 사용, 주입 시 @Qualifier 사용 후 등록한 이름을 적어준다.
@Qualifier 매칭 순서
- @Qualifier끼리 매칭
- @Qualifier(“이름”) 이름에 해당하는 빈 찾아서 매칭
- 1, 2, 전부 없다면 NoSuchBeanDefinitionException 발생
@Qualifier의 구분값은 string이므로, 값을 잘못 입력했을 때에도 컴파일 오류가 발생하지 않는다 -> 이를 방지하기 위해 annotation을 직접 만들어 사용하는 방법도 있다.
annotation 재정의의 경우 편리하긴 하지만, 자바 기본 기능이 아니라 스프링이 제공하는 기능이다. 웬만한 것은 스프링 annotation으로 해결한 경우가 아니니 무분별하게 사용하지는 말자.
@Primary
우선순위를 정하는 방법으로, 편하긴 하나 한계점이 있다.
빈 등록 시, @Primary가 붙은 빈을 우선적으로 등록
@Qualifier vs. @Primary
@Primary : 일반적으로 많이 사용하는 기본값에 적용
@Qualifier : Primary 다음으로 선택하는 것. 차선책
-> 우선권은 @Primary보다 @Qualifier가 더 높다.
전체 우선권은 @Qualifier - @Primary - @Autowired 필드명 매칭 순서대로 이루어진다.
Map, List를 통한 다수의 빈 조회
다수의 빈이 조회될 때, 생성자에서 Map, List를 이용하면 여러 개의 빈을 조회해서 등록할 수 있다.
예시 : 회원에 따라서 할인 비율을 다르게 하고 싶을 때 사용하는 등…
IntelliJ
command + shift + T : 테스트로 이동
command + F12 : 파일 구조 확인
command + O : 클래스로 이동
인터페이스에서 command + option + B : 구현체로 이동
ctrl + R : 모든 테스트 수행
command + B : 정의로 이동 및 이미 정의일 경우 사용처로 이동