티스토리 뷰
롬복과 최신 트렌드
막상 개발을 해보면, 대부분이 다 불변이고, 그래서 다음과 같이 필드에 final 키워드를 사용하게 된다.
그런데 생성자도 만들어야 하고, 주입 받은 값을 대입하는 코드도 만들어야 하고…
필드 주입처럼 좀 편리하게 사용하는 방법은 없을까? 
다음 기본 코드를 최적화해보자.
OrderServiceImpl - 원래 코드
@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 를 생략할 수 있다.
@Component
public class OrderServiceImpl implements OrderService {
	private final MemberRepository memberRepository;
	private final DiscountPolicy discountPolicy;
	public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
		this.memberRepository = memberRepository;
		this.discountPolicy = discountPolicy;
	}
}
롬복을 이제 적용한다.
# 의존성 추가 - build.gradle
plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.16'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'inflearn'
version = '0.0.1-SNAPSHOT'
java {
    sourceCompatibility = '11'
}
//lombok 설정 추가 시작
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}
repositories {
    mavenCentral()
}
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.junit.jupiter:junit-jupiter:5.8.1'
    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 라이브러리 추가 끝
}
tasks.named('test') {
    useJUnitPlatform()
}

롬복 라이브러리가 제공하는 @RequiredArgsConstructor 기능을 사용하면 final이 붙은 필드를 모아서
생성자를 자동으로 만들어준다. (다음 코드에는 보이지 않지만 실제 호출 가능하다.)
수정 후 최종 결과 코드
@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {
	private final MemberRepository memberRepository;
	private final DiscountPolicy discountPolicy;
}

public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
	
    this.memberRepository = memberRepository;
	this.discountPolicy = discountPolicy;
}
정리

728x90
    
    
  반응형
    
    
    
  '[개발] - Spring > 핵심 원리 구현' 카테고리의 다른 글
| 조회 빈이 2개 이상 - 해결 (0) | 2024.02.07 | 
|---|---|
| 조회 빈이 2개 이상 - 문제 (0) | 2024.02.06 | 
| 생성자 주입을 선택하라 (1) | 2024.02.05 | 
| 옵션 처리 (0) | 2024.02.04 | 
| 다양한 의존관계 주입 방법 (1) | 2024.02.03 | 
 
                            Comments
                            
                        
                        
                        
                    
                    
                    
                        
                    
                 
                                                     
                                                     
                                                    