본 게시물은 김영한 선생님의 강의를 학습하며 작성하였습니다.
막상 개발을 해보면, 대부분이 다 불변이고, 그래서 생성자에 final 키워드를 사용하게 된다.
🤔 그러나 생성자도 만들어야 하고, 주입 받은 값을 대입하는 코드도 만들어야 하고… 필드 주입처럼 간편하게 사용하는 방법은 없을까?!
아래 코드를 최적화하도록 해보겠다.
- 롬북 라이브러리 셋팅
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') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } } test { useJUnitPlatform() }
- 롬복 간단 체험
package com.hello.core; import lombok.Getter; import lombok.Setter; @Getter @Setter public class HelloLombok { private String name; private int age; public static void main(String[] args) { HelloLombok helloLombok = new HelloLombok(); helloLombok.setName("hello"); helloLombok.getName(); } }
- 이거 정말 미쳤다
RequiredArgsConstructor
: final이 붙은 필드를 모아서 생성자를 자동으로 만들어준다.
package com.hello.core.order; import com.hello.core.discount.DiscountPolicy; import com.hello.core.member.Member; import com.hello.core.member.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor public class OrderServiceImpl implements OrderService { // final 키워드를 통해서 생성자에서만 값을 정할 수 있게 해준다. private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); int discountPrice = discountPolicy.discount(member, itemPrice); return new Order(memberId, itemName, itemPrice, discountPrice); } //테스트 용도 public MemberRepository getMemberRepository() { return memberRepository; } }
롬북이 자바의 애노테이션 프로세서라는 기능을 이용해서 컴파일 시점에 생성자 코드를 자동으로 생성해준다.
정리
최근에는 생성자를 딱 1개 두고,@Autowired
를 생략하는 방법을 주로 사용한다. 여기에Lombok
라이브러리의@RequiredArgsConstructor
함께 사용하면 기능은 다 제공하면서, 코드를 깔끔하게 사용할 수 있다.
'Backend > Spring' 카테고리의 다른 글
[Spring MVC] 로깅(Logging) (0) | 2024.04.01 |
---|---|
[섹션 7] 조회 빈이 2개 이상 - Autowired 필드명, @Qualifier, @Primary (0) | 2024.03.18 |
[섹션 7] 생성자 주입을 선택해라 (0) | 2024.03.18 |
[섹션 7] 옵션 처리 (0) | 2024.03.18 |
[섹션 7]의존관계 자동 주입 - 다양한 의존관계 (0) | 2024.03.18 |