Spring 핵심 원리 기본편 (7) - 다양한 의존관계 주입(DI) 방법 / 롬복(Lombok)

김정욱·2021년 2월 23일
0
post-thumbnail

다양한 의존관계 주입 방법

의존관계를 주입하는 4가지 방법이 있다.
(주로 생성자 주입을 사용하며 어쩌다 한번 setter 주입사용)

  • 종류
    1) 생성자 주입
    2) setter 주입(수정자 주입)
    3) 필드 주입
    4) 일반 메서드 주입

1. 생성자 주입

  • 불변 / 필수 의존관계에 적용
  • 생성자 호출시점1번만 호출되는것이 보장
  • 생성자가 1개일 때 @Autowired생략 가능
  • 시점
    --> 스프링 컨테이너가 빈 등록 하면서 의존관계가 함께 설정된다
           (빈 등록시 생성자가 실행되기 때문에)

2. setter 주입

  • 선택 / 변경 의존관계에 적용
  • 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법
  • 시점
    --> 사용자가 생성된 객체를 직접 set~메서드를 호출해서 넣어준다
    (즉, 스프링 컨테이너가 빈을 등록하는 1단계가 지난 후의 시점에서 적용하는 것)
  • @Autowired(required = false)
    : 필수적으로 주입할 대상인지에 대한 명시 / true인데 주입 안해주면 오류 발생!
    (기본적으로 required 속성은 true로 되어있다)

3. 필드 주입

  • 애플리케이션의 실제 코드와 관계 없는 테스트 코드에 사용
  • 실제 코드에 사용하기에는 적합하지 않음
  • 외부에서 변경이 불가능해서 테스트하기 힘들다는 단점이 있음
  • 서로 객체를 참조하는 순환 참조의 경우 문제가 발생
    --> 생성자 주입발생하지 X
    --> 생성자 주입먼저 빈을 찾고 그 다음에 없으면 생성하기 때문

4. 일반 메서드 주입

  • 일반적인 메서드를 사용해서도 의존관계를 주입할 수 있다
  • 실제 사용 할 일은 없음

[ 정리 ] - 생성자 의존관계 주입을 사용하자!

  • 의존관계 주입시 99%는 생성자 의존관계 주입을 사용
  • 어~쩌다 한번 setter 의존관계 주입을 사용
  • 불변
    • 대부분의 의존관계 주입은 변경할 일이 없다
      --> 오히려 변하면 안되는 경우가 많다
    • 수정자 주입을 사용하면 public 으로 열어두어야 한다
      --> 누군가가 실수로 수정할수도 있고, 불변성이 필요한 속성을 열어두는 것은 좋지 않음
  • 누락
    • setter 생성자를 사용할 때 의존관계를 주입하지 않고 호출할 경우에
      NPE(Null Point Exception)이 발생
      --> 생성자 의존관계 주입 + final키워드 사용하면 반드시 주입된 이 후 사용을 할 수 있어 이러한 오류가 예방된다
  • 생성자 의존관계 주입프레임워크에 의존하지 않고 순수한 자바 언어의 특징을 잘 살리는 방법

옵션 처리

: 주입할 스프링 빈이 없어도 동작해야 할 때가 있다
즉, 자동 주입 대상을 옵션으로 처리하는 방법은 크게 3가지가 있다.


  • 3가지 처리 방법
    1) @Autoriwed(required = false)
         : 아예 해당 메서드를 실행하지 않게 하는 것 !
    2) @Nullable
         : 해당 메서드를 실행하기는 하지만 null로 출력하게 하는 것 !
    3) Optional<>
         : Optional로 감싼 객체이기 때문에 Optional.empty 출력 !

롬복 (Lombok) ?

생성자 의존관계 주입을 할 때 우리는 생성자코드를 반드시 삽입해야 했다.
그러나,
이러한 것Getter / Setter 조차 간편하게 처리해주는 플러그인이 바로 롬복(Lombok)


[ 설정 ]

1) build.gradle

/* Lombok 설정 추가 */
configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}
...
dependencies {
/* Lombok 라이브러리 의존성에 추가 */
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testCompileOnly 'org.projectlombok:lombok'
	testAnnotationProcessor 'org.projectlombok:lombok'
...
}

2) 인텔리제이 설정

  • Preferences -> Annotation Preocessors -> Enable annotation processing

[ 적용 ]

  • @RequiredArgsConstuctor
    : 생성자를 만들어서 필드를 넣어주는 코드를 대체한다

  • @Getter / @Setter
    : getter / setter를 어노테이션으로 대체!
profile
Developer & PhotoGrapher

0개의 댓글