스프링 생산성 향상, Lombok 라이브러리 사용

    스프링 생산성 향상, Lombok 라이브러리 사용


    막상 개발을 해보면 대부분 불변 키워드인 final을 사용한다고 한다. final을 사용하게 되면 생성자도 만들어야 하며 Getter/Setter를 만들어야한다. 따라서, 필드 변수가 많은 경우에는 이런 코드를 하나하나 직접 생성하는 것 자체가 부담이 될 수 있다. 이런 것들을 자동화해주는 것이 Lombok이다.

     

    Lombok은 스프링, 혹은 자바를 지원하는 라이브러리고 @Getter @Setter 같은 어노테이션을 달아서 관습적인 수정자, 생성자들을 자동으로 만들어주는 라이브러리다. Lombok을 등록하는 방법을 알아보자. 가장 쉬운 방법은 Spring Boot에서 Dependencies에서 Lombok 라이브러리를 추가하는 것이다. 그렇지만, 개발을 한창 하던 중에 Lombok 라이브러리를 추가하는 경우도 있을 수 있다. 

     

    Lombok 라이브러리 추가 방법


    1. Build.Gradle로 이동한 후, 바깥 쪽에 아래 코드를 추가해준다.

    // Lombok 설정 추가 시작
    configurations {
    	compileOnly{
        extendsFrom annotationProcessor
        }
    }
    // Lombok 설정 추가 끝

    2. Build.Gradle의 Dependencies에 아래 코드를 추가해준다.

    // Lombok 라이브러리 추가 시작
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    
    testCompileOnly 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'
    
    // lombok 라이브러리 추가 끝

    3. 코드를 추가 한 후에 reload All Gradle Project를 클릭해주거나, 오른쪽에 있는 코끼리 그림을 클릭해준다. 

    4. File - Settings 가서 plugins로 이동. "Lombok"을 검색해서 설치되어 있지 않았다면 설치해준다.

    5. File - Settings에서 "Annotation Processor" 검색 후, 'enable' 해준다.

     

    Lombok을 활용한 Constructor, Getter/Setter, toString 코드 최소화 적용


    Lombok 설정을 완료했으면 OrderServiceImpl에서 생성자 주입 상태로 코드를 최소화 할 수 있다.

    @Component
    @RequiredArgsConstructor @Getter @Setter
    public class OrderServiceImpl implements OrderService{
    
        private final DiscountPolicy discountPolicy;
        private final MemberRepository memberRepository;
    
    
    // lombok 라이브러리 적용 시, 아래 코드들이 생략 가능하다. 
    /*
        @Autowired
        public OrderServiceImpl(DiscountPolicy discountPolicy, MemberRepository memberRepository) {
            this.discountPolicy = discountPolicy;
            this.memberRepository = memberRepository;
        }
    
        public MemberRepository getMemberRepository(){
            return memberRepository;
        }
    
        public DiscountPolicy getDiscountPolicy() {
            return discountPolicy;
        }
    */

    @RequiredArgsConstructor

    @RequiredArgsConstructor는 NotNull, Final 필드 변수들을 모아서 그것들에 대한 생성자를 만들어준다. 이 어노테이션은 스프링 컨테이너에서 '생성자가 1개인 클래스는 @Autowired가 없어도 자동으로 의존관계 주입을 해준다'는 특성과 함께 찰떡궁합을 이룬다. 

    @RequiredArgsConstrucotr를 달면 생성자가 하나가 생성된다. 그리고 클래스 내에 다른 생성자가 없을 경우, 자동으로 생성된 생성자 하나만 있다. 그러므로 스프링 컨테이너는 이 생성자에 자동으로 @Autowired를 붙여서 의존 관계를 주입시켜준다. 

     

    // @RequiredArgsConstructor
    // 아래 코드 대신한다. 
    
        @Autowired
        public OrderServiceImpl(DiscountPolicy discountPolicy, MemberRepository memberRepository) {
            this.discountPolicy = discountPolicy;
            this.memberRepository = memberRepository;
        }

     

    @Getter

    @Getter 어노테이션은 아래 메서드를 대신해준다.

    //@Getter
    //@Getter는 아래 코드를 대신한다. 
    
        public MemberRepository getMemberRepository(){
            return memberRepository;
        }
    
        public DiscountPolicy getDiscountPolicy() {
            return discountPolicy;
        }


    Lombok은 쓰는게 좋을까?


    내가 강의를 듣고 있는 김영한 선생님은 Lombok을 쓰는게 좋다고 한다. 개인적으로는 작성해야 할 코드가 많이 줄어들기 때문이 아닌가 싶다. 반면에 Lombok의 단점도 있다. 수정하면 안되는 필드 변수들에 대한 Setter 값을 제공하기 때문에 값이 변하는 일들이 발생할 수 있다. 따라서 Lombok은 적재적소에만 사용하는 것이 좋으며, 무분별한 사용은 지양해야한다. 

     

    댓글

    Designed by JB FACTORY