Today I Learned_220726

2 분 소요

Spring Framework

인프런 스프링 강의 수강

Dependency Injection(의존관계 주입)

생성자 주입, 수정자 주입, 필드 주입, 메소드 주입 등 여러 방법이 있지만, 가급적이면 생성자 주입을 선택하자.

생성자 주입을 선택해야 하는 이유

  1. 불변

    생성자 주입은 객체를 생성할 때 딱 1번만 호출되어 이후에 호출되는 일이 없음 -> 불변하게 설계 가능

    수정자 주입의 경우 set 메소드를 열어놓아야 함 -> 누군가가 수정할 가능성이 있음

    대부분의 의존관계 주입은 한 번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다.

  2. 누락

    생성자 주입을 사용하면 주입 데이터를 누락했을 때 컴파일 오류가 발생

    수정자 주입을 사용하면 컴파일 단계에서 오류를 잡기 힘들다.

  3. 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

  1. Plugin -> lombok 설치(웬만하면 그냥 깔려있음)
  2. Annotation Processors -> Enable annotation processing

    Lombok은 AnnotationProcessor를 통해 동작하며, 컴파일 시점에 코드를 자동으로 생성해 준다.

  3. 임의의 테스트 클래스에서 @Getter, @Setter가 생성되는지 확인

다수의 빈이 조회될 때

  • @Autowired의 필드명 매칭 사용
  • @Qualifier
  • @Primary

@Autowired의 필드명 매칭

@Autowired는 기본적으로 타입 매칭을 시도하되, 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈을 매칭한다.

타입 매칭이 완료되면 필드 매칭은 추가적으로 진행하지는 않는다.

@Qualifier

수정자 주입, 필드 주입 등에서도 사용이 가능하다.

빈의 이름을 변경하는 것은 아니고 구분 시의 추가적인 옵션을 제공하는 것이다.

@Qualifier(“구분값”) 과 같이 사용하며, 빈 등록 시 @Qualifier 사용, 주입 시 @Qualifier 사용 후 등록한 이름을 적어준다.

@Qualifier 매칭 순서

  1. @Qualifier끼리 매칭
  2. @Qualifier(“이름”) 이름에 해당하는 빈 찾아서 매칭
  3. 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 : 정의로 이동 및 이미 정의일 경우 사용처로 이동

카테고리:

업데이트: