프로그래밍 끄적끄적
[SpringBoot] 의존관계 주입 본문
🌳 의존관계 주입 방법
▪ 생성자 주입
▪ 수정자 주입 (Setter 주입)
▪ 필드 주입
▪ 일반 메서드 주입
🌳 생성자 주입
생성자를 통해 의존관계를 주입한다. (해당 객체가 빈에 등록될 때 생성자를 호출하며, 이 때 필요한 객체들이 주입된다.)
🍃 특징
▪ 생성자 호출시점에 딱 한 번만 호출되는 것이 보장된다. (반대로, setter 주입을 사용하면 실수로 데이터를 변경할 수 있기 때문에 위험하다. 가급적 데이터는 열린 환경을 제공하지 않아야 한다.)
▪ 불변, 필수 의존관계에 사용한다.
▪ 생성자가 하나만 있다면 @Autowired 어노테이션을 사용하지 않아도 자동으로 주입한다.
🍃 생성자 주입을 선택해야 하는 이유
1) 불변하다.
대부분의 의존관계 주입은 종료시점까지 의존관계를 변경할 일이 없다. 오히려 불변해야 하는데, 생성자 주입은 객체를 생성할 때 딱 한 번만 호출되므로 불변하게 설계할 수 있다. 반대로 수정자 주입을 사용하면 public으로 열어두어야 하기 때문에 누군가 실수로 변경할 수도 있고, 변경하면 안되는 메서드를 열어두는 것은 좋은 설계 방법이 아니다.
2) 누락을 막을 수 있다.
또한 테스트케이스를 짤 때 new 키워드를 통해 객체를 생성할 경우 빈이 자동으로 주입되지 않는다. 따라서 개발자가 직접 주입해주어야 하는데, 누락되었을 때 생성자 주입은 컴파일 오류로 알아낼 수 있지만 수정자 주입은 런타임 오류가 발생하므로 오류를 잡아내기 조금 더 복잡하다.
3) final 키워드를 사용할 수 있다.
생성자 주입을 사용하면 해당 주입 필드에 대해 final 키워드를 사용할 수 있다. final 키워드를 사용하면 값이 누락시 컴파일 오류를 내기 때문에 쉽게 실수를 잡을 수 있다.
🌳 수정자 주입 (Setter 주입)
자바빈 프로퍼티 규약의 setter라 불리는 수정자 메서드를 통해 의존관계를 주입한다.
🍃 특징
▪ 선택, 변경 가능성이 있는 의존관계에 사용한다. (@Autowired(required=false)와 같이 사용하기도 함)
🌳 필드 주입
필드에 @Autowired 어노테이션을 붙여 바로 주입한다. (권장하지 않음)
🍃 특징
▪ 코드가 간결하지만 외부 변경이 불가능하므로 테스트하기 어렵다. (new를 통해 생성하는 객체는 자동주입 X)
▪ DI 프레임워크가 없으면 아무것도 할 수 없다.
▪ @Configuration 같은 특수 용도로만 사용하자
🌳 일반 메서드 주입
일반 메서드를 통해 주입받을 수 있다.
🍃 특징
▪ 한번에 여러 필드를 주입 받을 수 있다.
▪ 일반적으로 잘 사용하지 않는다.
결론: 기본으로 생성자 주입을 사용하고 옵션이 필요할 경우에 수정자 주입을 선택하도록 하자!
🌟 final
Java 프로그램 언어의 final 키워드는
한 번만 할당 할 수 엔티티를 정의하기 위해 사용된다.
한눈에 알아보기
▪ 클래스에 final을 사용할 경우: 상속이 불가하다.
▪ 메서드에 final을 사용할 경우: 오버라이딩이 불가하다.
▪ 변수에 final을 사용할 경우: 초기화 이후 값 수정이 불가하다.
'백엔드 > 스프링' 카테고리의 다른 글
[SpringBoot] 롬복(Lombok) (0) | 2021.09.08 |
---|---|
[SpringBoot] 자동주입(@Autowired) (0) | 2021.09.07 |
[SpringBoot] 컴포넌트 스캔 필터링 (0) | 2021.09.03 |
[SpringBoot] 컴포넌트 스캔과 자동 주입 (0) | 2021.09.03 |
[SpringBoot] 싱글톤 (0) | 2021.09.01 |