본문 바로가기

Spring Boot

[SpringBoot] 코드 다이어트를 위한 Lombok 프로젝트

롬복( Lombok )은 자바 컴파일 시점에 특정 어노테이션에 해당하는 코드를 추가 / 변경하는 라이브러리이다.

 

롬복을 이용하여 보일러플레이트 코드( boileplate code )의 절감을 도모한다.

 

 

※ 보일러플레이트 코드란?

프로그래밍 언어에 사용구 코드를지 지칭하는 말로,

예를 들어 getter, setter 메서드가 있다.

이런 메서드는 꼭 필요하지만 코드의 길이가 길어지게 한다는 단점이 있다.

 


 

STEP#01. IDE( Eclipse, STS )에서 롬복 설정하기

 

 

https://projectlombok.org/download 에 접속하여

 

lombok.jar 파일을 다운받자.

 

 

다음으로 PowerShell을 관리자 권한으로 실행하고

 

다운 받은 lombok.jar가 있는 경로로 이동하여 lombok.jar 파일을 실행한다.

 

 

java> javaw -jar lombok.jar

 

설치할 IDE를 선택하고 Install / Update 버튼을 클릭해주면 사용하는 IDE에 lombok이 추가된다.

 

 

 

만약 사용하는 IDE를 찾지 못한다면 Specify location 버튼을 클릭하여 IDE의 설치 경로를 추가해 주면된다.

 

 


 

STEP#02. 롬복 의존성 설정하기

 

 

롬복 어노테이션을 사용하려면 의존성 먼저 설정해야 한다.

 

#01. 메이븐 의존성 설정하기

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
  <scope>compile</scope>
</dependency>

 

 

#02. 그레이들 의존성 설정하기

dependencies {
  ...
  compileOnly( 'org.projectlombok:lombok' )
}

 

 

롬복 어노테이션은 컴파일시 필요한 코드를 추가할 때만 사용되기 때문에

 

런타임에서는 의존성이 필요하지 않는다.

 

따라서 컴파일 시에만 의존성을 확인하도록 메이븐의 경우 compile, 그레이들의 경우 compileOnly(  )로 설정한다.

 

 


 

STEP#03. @Getter와 @Setter

 

자바 객체를 생성할 때 보통은 IDE의 도움을 받아 게터( getter )와 세터( setter )를 생성한다.

 

이렇게 생성한 메서드는 기본적인 역할만 수행하고 보통은 코드를 따로 수정하지 않는다.

 

그래서 필드값이 늘어날수록 불필요한 코드양이 많아지는 단점이 존재한다.

 

 

예제01) name과 age 값을 갖는 Human 객체의 게터와 세터

public class Human {


  private String name;

  private int age = 0;


  public String getName() {

    return name;

  }


  public void setName( String name ) {

    this.name = name;    

  }


  public void getAge() {

    return age;

  }


  public void setAge( int age ) {

    this.age = age;

  }

}

 

예제02) lombok(  @Getter와 @Setter ) 를 이용한 코드 경량화

import lombok.*;


@Getter

@Setter

public class Human {

  private String name;

  private int age = 0;

}

 

롬복의 @Getter@Setter 어노테이션을 사용하여 위와 같은 기능을 수행하는 코드를 경량화 시켜보았다.

 

 


 

STEP#04. @EqualsAndHashCode

 

@EqualsAndHashCode는 자바의 equals( ) 메서드와 Hashcode( ) 메서드를 구현한다.

 

Human 객체에 equals( )와 Hashcode( ) 메서드를 직접 구현해 보자.

 

이클립스, STS를 사용한다면 Alt + Shift + S   R 키로 생성할 수 있다.

 

// @See Human 객체에 equals( )와 Hascode( ) 메서드 직접 구현
// @File Human.java

import lombok.Getter;
import lombok.Setter;


@Getter
@Setter
public class Human {

        private String name;
        private int age = 0;

        @Override
        public boolean equals( Object o ) {

                if( this == 0 ) { return true; }
                if( o == null || getClass() != o.getClass() ) { return false; }
                Human human = ( Human ) o;
                return age == human.age && Objects.equals( name, human );
        }

        @Override
        public int hashCode() {

                return Objects.hash( name, age );
        }
}

 

@EqualsAndHashCode를 적용하면 다음과 같이 변경할 수 있습니다.

 

// @See @EqualsAndHashCode를 적용한 코드
// @File Human.java

import lombok.Getter;
import lombok.Setter;
import lombok.EqualsAndHashCode;

@Getter
@Setter
@EqualsAndHashCode
public class Human {

        private String name;
        private int age = 0;
}

 

특정 필드값만 적용하고 싶다면 어노테이션의 파라미터에 추가하여 적용할 수 있다.

 

// @See @EqualsAndHashCode를 적용한 코드
// @File Human.java

import lombok.Getter;
import lombok.Setter;
import lombok.EqualsAndHashCode;

@Getter
@Setter
@EqualsAndHashCode( of = { "name" } )
public class Human {

        private String name;
        private int age = 0;
}

 


 

STEP#05. @AllArgsContructor, @NoArgsConstructor, @RequiredArgsConstructor

 

생성자를 만드는 롬복의 어노테이션을 알아보자.

 

@AllArgsContructor는 객체의 모든 필드값을 인자로 받는 생성자이다.

 

다음은 Human의 모든 필드값을 인자로 받는 생성자를 구현한 코드이다.

 

// @See 모든 필드값을 인자로 받는 생성자를 구현한 코드
// @File Human.java

import lombok.Getter;
import lombok.Setter;
import lombok.EqualsAndHashCode;

@Getter
@Setter
@EqualsAndHashCode( of = { "name" } )
public class Human {

        private String name;
        private int age = 0;

        public Human( String name, int age ) {

                this.name = name;
                this.age = age;
        }
}

 

@AllArgsContructor를 사용하면 다음과 같이 생략 가능하다.

 

// @See @AllArgsContructor 적용
// @File Human.java

import lombok.Getter;
import lombok.Setter;
import lombok.EqualsAndHashCode;
import lombok.AllArgsConstructor;

@Getter
@Setter
@EqualsAndHashCode( of = { "name" } )
@AllArgsConstructor
public class Human {

        private String name;
        private int age = 0;
}

 

자바에서 객체에 생성자를 임의로 구현하지 않았다면 아무런 인자값 없는 기본 생성자를 자동으로 추가해 준다.

 

만약 인자값이 존재하는 생성자를 한개라도 추가하였다면 기본 생성자를 수동으로 추가해 주어야 한다.

 

롬복은 이러한 기본 생성자를 @NoArgConstructor 어노테이션을 사용해 간편하게 추가할 수 있다.

 

// @See 기본 생성자를 생성하는 @NoArgConstructor 추가
// @File Human.java

import lombok.Getter;
import lombok.Setter;
import lombok.EqualsAndHashCode;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@Getter
@Setter
@EqualsAndHashCode( of = { "name" } )
@AllArgsConstructor
@NoArgsConstructor
public class Human {

        private String name;
        private int age = 0;
}

 

@RequiredArgsConstructor@NonNull이 적용된 필드값만 인자로 받는 생성자를 만드는 어노테이션이다.

 

// @See @NonNull이 추가된 name 필드만 인자로 받는 코드
// @File Human.java

import lombok.Getter;
import lombok.Setter;
import lombok.EqualsAndHashCode;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.NonNull;

@Getter
@Setter
@EqualsAndHashCode( of = { "name" } )
@AllArgsConstructor
@NoArgsConstructor
@RequiredArgsConstructor
public class Human {

        @NonNull private String name;
        private int age = 0;
}

 

 


 

STEP#06. @Data

 

@Data는

@ToString @EqualsAndHashCode @Getter
@Setter @RequiredArgsConstructor  

위 어노테이션을 합쳐놓은 편리한 어노테이션이다.

 

다음은 @Data 어노테이션을 사용해서 변경한 예이다.

 

// @See @Data 어노테이션을 추가한 Human 객체
// @File Human.java

import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.NonNull;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Human {

        @NonNull private String name;
        private int age = 0;
}

 


 

STEP#07. @Builder

 

롬복의 @Builder도 가장 핵심적이며 환상적인 어노테이션이다.

 

기존에는 빌더 패턴을 구현하기 위해 많은 코드를 손수 짜야했다면 @Builder 하나만 추가함으로써완벽하게 코드양을 줄일 수 있다.

 

 

다음은 Human 객체에 빌더 패턴을 직접 코딩한 예제이다.

 

// @See Human 객체에 빌더 패턴 적용
// @File Human.java

import lombok.Getter;
import lombok.Setter;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import com.sun.istack.NotNull;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Human {

        @NotNull
        private String name;
        private int age = 0;

        public static HumanBuilder builder() {
        
                return new HumanBuilder();
        }

        public static class HumanBuilder {

                private String name;
                private int age;
                
                private HumanBuilder() { }
                public HumanBuilder name( String name ) {

                        this.name = name;
                        return this;
                }

                public HumanBuilder age( int age ) {

                        this.age = age;
                        return this;
                }

                @Override
                public String toString() {

                        return "HumanBuilder( name = " + name + ", age = " + age + ")";
                }

                public Human build() {

                        return new Human( name, age );
                }
        }
}

 

 

다음은 롬복의 @Builder 어노테이션을 사용한 예제이다.

 

어노테이션 하나로 위의 긴 코드를 짧게 줄일 수 있다.

 

// @See @Builder 어노테이션 적용
// @File Human.java

import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import com.sun.istack.NotNull;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Human {

        @NotNull
        private String name;
        private int age = 0;
}