스프링

생성자 주입의 장점, 룸복사용

salmon16 2023. 7. 21. 17:08

여러 가지 의존관계 주입방법이 있지만 생성자 주입을 사용하는 것이 권장된다.

  • 대부분의 의존관계 주입이 일어나면 종료시점까지 의존관계를 변경할 일이 없고 대부분의 의존관계는 변하면 안 된다.  생성자 주입은 객체 생성 시 딱 1번만 호출되므로 불변하게 설계할 수 있다.
  • 수정자 주입을 사용하면 setter 메서드를 public으로 열어 두어야 하는데 이러면 실수로 누군가 변경할 수 있다. 
  • 프레임워크 없이 순수한 자바 코드를 단위 테스트 하는 경우에 쉽게 가능하다.
  • 필드에 final 키워드를 사용할 수 있다. 그러면 설정되지 않으면 컴파일 오류로 막아준다.

위와 같은 장점으로 생성자 주입을 선택하는 것이 좋다. 그리고 가끔 필요하면 수정자 주입을 선택하면 된다.

 

생성자 주입을 좀 더 편하게 이용하기 위해 롬복 라이브러리를 이용할 수 있다.

롬복

롬복이란 자바 라이브러리로 생성자, setter, getter 등의 메서드를 작성해 주는 라이브러리다.

기존 코드는 생성자도 만들어야 하고 주입 받은 값을 대입하는 코드도 만들어야 한다.

롬복을 활용하면 코드가 간결해 지고 생성자를 직접 만들지 않아도 돼서 편하다.

 

롬복을 이용하려면 라이브러리를 적용해야한다 build.gradle에 라이브러리 및 환경을 추가하자.

//lombok 설정 추가 시작
configurations {
   compileOnly {
      extendsFrom annotationProcessor
   }
}
//lombok 설정 추가 끝
dependencies {
   implementation 'org.springframework.boot:spring-boot-starter'
   testImplementation 'org.springframework.boot:spring-boot-starter-test'
   //lombok 라이브러리 추가 시작
   compileOnly 'org.projectlombok:lombok'
   annotationProcessor 'org.projectlombok:lombok'
   testCompileOnly 'org.projectlombok:lombok'
   testAnnotationProcessor 'org.projectlombok:lombok'
//lombok 라이브러리 추가 끝
}

위 코드를 bulid.gradle에 추가하면 된다.

그리고 윈도우에서 file -> setting -> plugin -> lombok을 설치해야 한다.

그리고 file -> setting -> Annotation Processors -> Enable annotation processing 체크를 해야 한다.

이후 재시작하고 이용하면 된다.

 

롬복을 이용해 보자

@Component
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

생성자가 1개 이므로 @Autowired는 지워줘도 된다.

기존코드의 생성자를 지우고 @RequiredArgsConstructor애노테이션을 붙여 주면 된다.

 

@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
    

 

코드가 간결해 졌다. 코드 작성 시에도 편할 것이다.

롬복라이브러리를 잘 활용하자.

 

출처 : 인프런 스프링 핵심 원리 - 기본 편  김영한