반응형
# 스프링 핵심 원리 기본편
# 롬복과 최신 트랜드
- lombok의 대표적인 기능 : getter, setter 자동으로 만들어주고, 생성자 관련해서도 지원을 해주는 등 개발을 편하게 도와준다.
- build.gradle
plugins {
id 'org.springframework.boot' version '2.4.2'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
//lombok 설정 추가 시작
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
//lombok 설정 추가 끝
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'
}
test {
useJUnitPlatform()
}
- 플러그인이 설치되어 있지 않다면 아래와 같이 진행
윈도우의 경우 File > Settings > plugins 들어가서..
lombok 찾아서 설치.
- build.gradle에 작성 완료 후 아래 진행
File > Settings 들어가서 아래 검색하여 찾기
Compiler > annotation processors 들어가서...
Enable annotation processing 체크하여 켜기
- HelloLombok
package hello.core;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class HelloLombok {
private String name;
private int age;
public static void main(String[] args) {
HelloLombok helloLombok = new HelloLombok();
helloLombok.setName("aaaa");
String name = helloLombok.getName();
System.out.println("name = " + name);
System.out.println("helloLombok = " + helloLombok);
}
}
- 롬북 라이브러리가 제공하는 @RequiredArgsConstructor 기능을 사용하면 final이 붙은 필드를 모아서 생성자를 자동으로 만들어준다.
@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
}
- 위 코드와 이전 코드(생성자를 이용해 직접 생성)는 완전히 동일하다. 롬복이 자바의 애노테이션 프로세서라는 기능을 이용 해서 컴파일 시점에 생성자 코드를 자동으로 생성해준다. 실제 class 를 열어보면 다음 코드가 추가되어 있 는 것을 확인할 수 있다.
- 정리 : 최근에는 생성자를 딱 1개 두고, @Autowired 를 생략하는 방법을 주로 사용한다. 여기에 Lombok 라이브 러리의 @RequiredArgsConstructor 함께 사용하면 기능은 다 제공하면서, 코드는 깔끔하게 사용할 수 있다.
# 조회 할 빈이 2개 이상일 때의 문제
@Autowired
private DiscountPolicy discountPolicy
- @Autowired는 타입(Type)으로 조회하기 때문에, 마치 다음 코드와 유사하게 동작한다.
ac.getBean(DiscountPolicy.class)
- 타입으로 조회 시 선택된 빈이 2개 이상일 때 문제가 발생한다.
- DiscountPolicy 의 하위 타입인 FixDiscountPolicy , RateDiscountPolicy 둘다 스프링 빈으로 아래와 같이 선언
package hello.core.discount;
import hello.core.member.Grade;
import hello.core.member.Member;
import org.springframework.stereotype.Component;
@Component
public class FixDiscountPolicy implements DiscountPolicy {
private int discountFixAmount = 1000; // 1000원 할인
@Override
public int discount(Member member, int price) {
if(member.getGrade() == Grade.VIP) {
return discountFixAmount;
} else {
return 0;
}
}
}
package hello.core.discount;
import hello.core.member.Grade;
import hello.core.member.Member;
import org.springframework.stereotype.Component;
@Component
public class RateDiscountPolicy implements DiscountPolicy {
private int discountPercent = 10;
@Override
public int discount(Member member, int price) {
if (member.getGrade() == Grade.VIP) {
return price * discountPercent / 100;
} else {
return 0;
}
}
}
- 그 후 아래와 같이 의존관계 자동 주입을 실행 시 NoUniqueBeanDefinitionException 오류가 발생한다.
@Autowired
private DiscountPolicy discountPolicy
NoUniqueBeanDefinitionException: No qualifying bean of type
'hello.core.discount.DiscountPolicy' available: expected single matching bean
but found 2: fixDiscountPolicy,rateDiscountPolicy
- 하위 타입으로 지정할 수 도 있지만, 하위 타입으로 지정하는 것은 DIP를 위배하고 유연성이 떨어진다.
- 그리고 이름만 다르고, 완전히 똑같은 타입의 스프링 빈이 2개 있을 때 해결이 안된다.
- 스프링 빈을 수동 등록해서 문제를 해결해도 되지만, 의존 관계 자동 주입에서 해결하는 여러 방법이 있다.
출처 : 인프런 스프링 핵심 원리 기본편
반응형
'인프런 강의 학습 > HTTP 기본 지식' 카테고리의 다른 글
재학습 2일차_URI와 웹 브라우저 요청 흐름 (0) | 2022.03.31 |
---|---|
재학습 1일차_인터넷 네트워크 (0) | 2022.03.30 |
HTTP 웹 기본 지식 20일차 (0) | 2021.02.08 |
HTTP 웹 기본 지식 19일차 (0) | 2021.01.31 |
HTTP 웹 기본 지식 18일차 (0) | 2021.01.25 |