[스프링 핵심원리] - 6. 의존관계 자동 주입 (3)

Chooooo·2022년 11월 5일
0
post-thumbnail

이 글은 강의 : 김영한님의 - "스프링 핵심원리 - 기본편"을 듣고 정리한 내용입니다. 😁😁


롬복과 최신 트렌드

개발을 하면 대부분 불변이므로 필드에 final 키워드를 사용하게 된다.
생성자 주입 방식은 생성자도 만들어야하고 주입 받은 값을 대입하는 코드도 만들어야하는데, 필드 주입처럼 편하게 사용하기 위해 롬복 라이브러리를 사용한다.

기본 코드


@Component
public class OrderServiceImpl implements OrderService{
    // 1. 필드에 final 키워드 사용
    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    // 2. 생성자 만들기
    @Autowired	// 생성자가 1개면 생략O
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
  	// 3. 주입받은 값을 대입하기
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
    ...
}

롬복 라이브러리 적용 방법

1) build.gradle 에 라이브러리 및 환경 추가
gradle 파일을 변경한 후에는 코끼리를 클릭하거나 Gradle>reload 를 해주어야 한다

plugins {
   id 'org.springframework.boot' version '2.6.7'
   id 'io.spring.dependency-management' version '1.0.11.RELEASE'
   id 'java'
}

group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

//lombok 설정 추가 시작
configurations {
   compileOnly {
      extendsFrom annotationProcessor
   }
}
//lombok 설정 추가 끝

repositories {
   mavenCentral()
}

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter'

   //lombok 라이브러리 추가 시작
   compileOnly 'org.projectlombok:lombok'
   annotationProcessor 'org.projectlombok:lombok'

   testCompileOnly 'org.projectlombok:lombok'
   testAnnotationProcessor 'org.projectlombok:lombok'
   //lombok 라이브러리 추가 끝

   testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
   useJUnitPlatform()
}

2) plugin > lombok 검색 설치

  • 임의의 테스트 클래스 생성 후 @Getter, @Setter 동작 확인
    롬복 라이브러리 기능을 테스트하기 위해 HelloLombok 이라는 클래스를 만들어 @Getter, @Setter, @ToString동작을 확인한다. 코드 상에는 안보이지만 해당 어노테이션을 추가함으로써 getter, setter, toString메서드가 자동으로 생성된다!!
package hello.core;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter // getter 자동 생성
@Setter // setter 자동 생성
@ToString   // toString() 자동 생성
public class HelloLombok {

    private String name;
    private int age;

    public static void main(String[] args) {
        HelloLombok helloLombok = new HelloLombok();
        helloLombok.setName("asdfas");

        System.out.println("helloLombok = " + helloLombok);
    }
}

결국! Lombok 라이브러리를 적용한 최종 코드로 기본 코드와 비교하면 정말 간결해졌다. 롬복 라이브러리가 제공하는 @RequiredArgsConstructor 기능을 사용하면 final이 붙은 필드를 모아서 생성자를 자동으로 만들어 준다. (코드에는 보이지 않지만 실제 호출이 가능!)

@Component
@RequiredArgsConstructor    // final이 붙은 필드를 파라미터로 갖는 생성자 자동으로 생성
public class OrderServiceImpl implements OrderService{
    // 생성자 주입을 쓰면 final 키워드를 사용해 생성자에서 초기화 누락을 방지, 불변하도록 설계O
    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
	...
}

위의 최종 결과 코드는 이전의 기본 코드와 완전히 동일하다. 롬복이 자바의 애노테이션 프로세서라는 기능을 이용해 컴파일 시점에 생성자 코드를 자동으로 생성해준다. (실제 class를 열어보면 아래의 코드가 추가되어 있음)

🎀 정리

최근에는 생성자를 딱 1개 두고, @Autowired를 생략하는 방법을 주로 사용한다.
여기에 Lombok 라이브러리의 @RequiredArgsConstructor를 함께 사용하면 기능은 다 제공하면서 코드는 깔끔하게 정리된다!
(지금은 배우는 단계니 생성자를 작성해주면서 하자!)

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글