이 글은 강의 : 김영한님의 - "스프링 핵심원리 - 기본편"을 듣고 정리한 내용입니다. 😁😁
개발을 하면 대부분 불변이므로 필드에 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 검색 설치
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를 함께 사용하면 기능은 다 제공하면서 코드는 깔끔하게 정리된다!
(지금은 배우는 단계니 생성자를 작성해주면서 하자!)