Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

프로그래밍 끄적끄적

[SpringBoot] 의존관계 주입 본문

백엔드/스프링

[SpringBoot] 의존관계 주입

soeunkk 2021. 9. 7. 17:22

🌳 의존관계 주입 방법

    ▪ 생성자 주입

    ▪ 수정자 주입 (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을 사용할 경우: 초기화 이후 값 수정이 불가하다.

 

Comments