오봉이와 함께하는 개발 블로그
Spring - 의존관계 자동 주입(롬복과 최신 트랜드, 조회 빈이 2개 이상 - 문제) 본문
728x90
롬복과 최신 트랜드
막상 개발하면 대부분 불변이고, 생성자에 final 키워드를 사용하게 된다.
그런데 막상 의존관계 주입을 자동으로 할 때 생성자 주입을 하면 생성자도 만들어야 하고, 주입 받은 값을 대입하는 코드도 만들어야 해서 코드가 너무 많아진다.
그래서 등장한게 롬복이다.
롬복 적용 방법
build.gradle에 라이브러리 및 환경 설정 추가
plugins {
id 'org.springframework.boot' version '2.7.0'
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()
}- Preference -> plugin -> lombok 설치 후 재시작
- Preference -> Annotaion Process -> Enable annotation processing 체크 후 재시작
롬복 설치 후 코드
- 롬복을 적용하자.
- 롬복 라이브러리가 제공하는 @RequiredArgsConstructor 기능을 사용하면 final이 붙은 필드를 모아서 생성자를 자동으로 만들어준다.
@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;
}
}
위 코드가 아래와 같아진다
@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
}
정리
최근 생성자를 딱 한 개만 두고 @Autowired를 생략하는 방법을 주로 사요한다.
여기에 Lombok 라이브러리의 @RequiredArgsConstructor를 함께 사용하면 기능을 다 제공하며 코드는 깔끔하게 유지할 수 있다.
조회 빈이 2개 이상 - 문제
@Autowired는 타입(Type)으로 조회하기 때문에 ac.getBean(DiscountPolicy.class)과 유사하게 동작하는데, 타입으로 조회할 때 선택된 빈이 2개 이상일 때 문제가 발생한다.
DiscountPolicy의 하위 타입인 fixDiscountPolicy, rateDiscountPolicy 모두 스프링 빈으로 선언하면 오류를 확인할 수있다.
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
// and
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
NoUniqueBeanDefinitionException: No qualifying bean of type
'hello.core.discount.DiscountPolicy' available: expected single matching bean
but found 2: fixDiscountPolicy,rateDiscountPolicy
하나의 빈을 기대했는데 fixDiscountPolicy, rateDiscountPolicy 2개가 발견되었다고 알려준다.
이때 하위 타입으로 지정할 수도 있지만, 하위 타입으로 지정하는 것은 DIP를 위배하고 유연성이 떨어진다.
이름만 다르고, 완전히 똑같은 타입의 스프링 빈이 2개 있을 때 해결되지 않는 문제도 있다.
출처 : 인프런 김영한 지식공유자님의 스프링 완전 정복 로드맵 강의
728x90
'BE > Spring' 카테고리의 다른 글
| Spring - 의존관계 자동 주입(조회한 빈이 모두 필요할 때 List&Map, 자동 등록?수동 등록? 올바른 운영 기준) (0) | 2022.06.11 |
|---|---|
| Spring - 의존관계 자동 주입(@Autowired 필드 명, @Qualifier, @Primary, 어노테이션 직접 만들기 (0) | 2022.06.10 |
| Spring - 의존관계 자동 주입(옵션 처리, 생성자 주입을 선택하자) (0) | 2022.06.10 |
| Spring - 의존관계 자동 주입(다양한 의존관계 주입 방법) (0) | 2022.06.09 |
| Spring - 컴포넌트 스캔(필터, 중복 등록과 충돌) (0) | 2022.06.09 |
Comments