웹 프로젝트를 개발할 때 프레임워크를 사용하면(스프링 기준)
빈 객체들의 의존관계 주입을 위해 생성자와 @Autowired를 사용하여 의존관계를 주입해준다.
그런데 생성자도 만들어야 하고, 주입받은 값을 대입하는 코드도 만들어야 하고
개발자들이 해야할 일이 많아진다.
위와 같은 불편한 점을
lombok이라는 라이브러리를 사용하여 해결할 수 있다.
먼저 롬복을 사용하려면 설치와 설정이 필요하다.
● lombok 설치
1. 프로젝트에 build.gradle에서 라이브러리 및 환경을 추가해준다.
build.gradle
plugins {
id 'org.springframework.boot' version '2.6.2'
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'
// web 라이브러리 추가
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'javax.inject:javax.inject: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 라이브러리 추가 끝
}
test {
useJUnitPlatform()
}
주석 처리가 된 부분을 추가해주면 된다.
2. lombok 설치
윈도우(Windows) : File > Settings > Plugins > lombok 검색 및 설치
맥(Mac) : Preferences >Settings > Plugins > lombok 검색 및 설치
● 설정
1. annotation processing 활성화
윈도우(Windows) : File > Settings > Annotation Processors > Enable annotation processing 체크박스 활성화
맥(Mac) : Preferences > Annotation Processors > Enable annotation processing 체크박스 활성화
이제 설치 및 설정은 끝났다.
lombok을 활용해보자.
● lombok 활용
간단한 예를 통해 lombok을 활용해보자.
HelloLombok.java
package hello.core;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
// lombok 테스트
@Getter
@Setter
@ToString
public class HelloLombok {
private String name;
private int age;
public static void main(String[] args) {
HelloLombok helloLombok = new HelloLombok();
helloLombok.setName("asda"); // lombok으로 자동 getter, setter 생성
String name = helloLombok.getName();
System.out.println("name = " + name);
System.out.println("helloLombok = " + helloLombok); // ToString도 지원
}
}
클래스 안에 name, age 필드를 생성하고,
클래스 상단에 @Getter, @Setter, @ToString을 입력하였다.
그리고 main 메서드를 실행하면..
setName과 getName이 lombok에 의해 자동으로 생성되고
잘 실행되는 것을 볼 수 있다.
● lombok을 활용한 의존관계 주입
lombok을 활용하여 의존관계 주입을 할 수 있다.(@Autowired)
예시 빈 객체를 통해 알아보자.
OrderServiceImpl.java
package hello.core.order;
import hello.core.annotation.MainDiscountPolicy;
import hello.core.discount.DiscountPolicy;
import hello.core.member.Member;
import hello.core.member.MemberRepository;
import hello.core.member.MemoryMemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class OrderServiceImpl implements OrderService{
// final을 통해 생성자에서 값이 설정되지 않을 경우 오류 발생
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.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);
}
}
빈 객체(MemberRepository) 를 필드로 입력하고
생성자를 통해 의존관계를 주입한다.
이제는 lombok을 사용해보자.
package hello.core.order;
import hello.core.annotation.MainDiscountPolicy;
import hello.core.discount.DiscountPolicy;
import hello.core.member.Member;
import hello.core.member.MemberRepository;
import hello.core.member.MemoryMemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor // 추가됨!
public class OrderServiceImpl implements OrderService{
// final을 통해 생성자에서 값이 설정되지 않을 경우 오류 발생
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
// @Autowired
// public OrderServiceImpl(MemberRepository memberRepository,DiscountPolicy discountPolicy) {
// this.memberRepository = memberRepository;
// this.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);
}
}
클래스명 상단에 @RequiredArgsConstructor 를 입력해주면
생성자를 통해서 의존관계를 주입하는 것과 동일한 효과를 준다.
(이때 필드는 final로 필수 입력을 받아야 한다.)
롬복 라이브러리가 제공하는 @RequiredArgsConstructor 기능을 사용하면
final이 붙은 필드를 모아서 생성자를 자동으로 만들어준다.
롬복이 자바의 애노테이션 프로세서라는 기능을 이용해서
컴파일 시점에 생성자 코드를 자동으로 생성해준다.
'Java > Spring' 카테고리의 다른 글
[Spring] 빈 스코프란? | 싱글톤(singleton) | 프로토타입(prototype) | 웹 관련 스코프 (0) | 2022.01.28 |
---|---|
[Spring] 스프링 빈 생명주기 콜백 (0) | 2022.01.26 |
[Spring] 의존관계 주입 방법(@Autowired) | 생성자 주입 | 수정자 주입(setter 주입) | 필드 주입 | 일반 메서드 주입 (0) | 2022.01.24 |
[Spring] 스프링 필터(Spring Filter) | FilterType 옵션 (0) | 2022.01.22 |
[Spring] 컴포넌트 스캔 (@Component) | 의존관계 자동 주입(@Autowired) (0) | 2022.01.22 |