의존관계 주입 방법
생성자 주입
생성자 호출 시 딱 1번만 호출
불변, 필수 의존관계에 사용됨
스프링 빈 인데 생성자가 1개만 존재할 시 @Autowired를 생략해도 됨
수정자 주입 (setter)
선택(required = false), 변경 의존관계에 사용됨
자바빈 프로퍼트 규약을 지켜야함
필드 주입
이름 그대로 필드에 바로 주입
코드가 간결함
DI 프레임워크를 통하지 않으면 아무것도 할 수 없음 (getBean 등)
외부 변경이 불가능하여 테스트 하기 어려움
일반 메서드 주입
생성자가 아닌 아무 메서드에다 @Autowired를 넣어 사용할 수 있음
생성자 주입, 수정자 주입으로 커버할 수 있기에 일반적으로 사용하지 않음
참고. 생성자 자동 주입은 빈 등록 시 클래스를 만들어야 하기에 가장 먼저, 자동으로 일어남
참고. 스프링은 크게 2가지 라이프 사이클로 나뉨
빈을 전부 등록
의존관계 자동 주입
참고. 자바빈 프로퍼티 규약 : 필드의 값을 직접 변경하지 않고 getter, setter를 setXxx, getXxx 라는 이름의 메서드를 통해 값을 읽고 쓰는 작업을 하도록 함
애플리케이션 실행 중 의존관계는 불변해야한다
수정자 주입 사용 시 setter를 public으로 열어야 한다
테스트에 용이하다 (생성 후 setter, 일반 메서드 등 호출이 필요 없음)
불변, 누락이 일어나지 않는다
코드의 편의성, 가독성을 높여주는 라이브러리
@Getter : getter 자동 생성
@Setter : setter 자동 생성
@ToString : ToString 메서드 자동 생성
@RequiredArgsConstructor : final값이 있는 필드를 파라미터로 받는 생성자 자동 생성
@Component 를 통해 자동으로 등록된 빈이 자동으로 의존관계 주입을 해야할 때, 타입으로 빈을 조회하기 때문에 조회된 빈이 2개 이상일 경우 오류가 발생한다.
따라서 조회된 빈 중 어떤 것을 선택해야할지 자동 의존관계 주입에서는 알 수가 없다.
@Autowired 필드 명 매칭
빈 여러 개가 매칭된 경우 빈의 필드 명, 파라미터 명을 확인하고 해당 이름으로 빈을 검색한다.
@Quilifier 사용
@Quilifier 와 함께 컴포넌트에 이름을 지정할 수 있다.
이후 파라미터, 필드 값에 @Quilifier 와 지정했던 이름을 넣으면 알아서 매핑해준다.
지정하지 않은 이름으로 매핑할 시 해당 이름을 가진 빈 까지 검색하게 된다.
@Primary 와 같이 사용 시 우선 순위가 더 높다.
문자열로 매핑하기 때문에 컴파일 타임에 오류를 알 수 없다 → 어노테이션을 재정의하여 해결할 수 있음
@Primary 사용
여러 개의 빈 이 조회 되었을 때, @Primary 어노테이션이 사용된 컴포넌트가 우선으로 매핑된다.
가장 널리 사용됨
List나 Map으로 파라미터, 필드를 설정하면 여러 개의 빈이 주입된다.
편리한 자동 기능을 기본으로 사용할 것
자동으로 설정해도 OCP, DIP를 지킬 수 있다.
생산성이 높아짐
기술 지원 빈 은 수동으로 등록해주면 좋다.
업무 로직은 문제 발생 시 어디가 문제인지 파악하기 쉬움
기술 지원 로직은 광범위하게 적용되어 어디서 문제가 발생했는지 파악하기 어려움
따라서 수동 빈으로 등록하여 설정 정보에 바로 나타나게 하는 것이 유지보수에 수월함
참고.
업무 로직 빈: 핵심 비즈니스 로직이 있는 서비스
기술 지원 빈: 업무 로직을 지원하기 위한 하부 기술이나 공동 기술