Jhipster에 Lombok 적용하기

Updated:

Jhipster 프로젝트에 Lombok 적용하기

Jhipster는 기본적으로 Lombok을 지원하지 않고 있다. 그렇기 때문에 Jhipster를 사용해 애플리케이션을 생성하면 getter, setter 등 모든 코드가 생성되어있는 상태이다.

하지만! Lombok API를 직접 추가하여 Jhipster 애플리케이션에서도 Lombok을 사용할 수 있다.

pom.xml 수정하기

먼저 각 마이크로서비스 프로젝트의 pom.xml을 아래와 같이 수정한다.


<junit.utReportFolder>${project.testresult.directory}/test</junit.utReportFolder>
        <junit.itReportFolder>${project.testresult.directory}/integrationTest</junit.itReportFolder>	        
        <!-- jhipster-needle-maven-property -->	       
        <lombok.version>1.18.12</lombok.version>
    </properties>

	    <dependencyManagement>

  <artifactId>metrics-core</artifactId>
     </dependency>
        <!-- jhipster-needle-maven-add-dependency -->	       
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
    </dependencies>


    <build>	   
        <version>${jaxb-runtime.version}</version>
        </path>	                           
         <!-- jhipster-needle-maven-add-annotation-processor -->	                            
                <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <version>${lombok.version}</version>
        </path>
    </annotationProcessorPaths>	                        
</configuration>	                    
</plugin>

위와 같이 수정한 후, 프로젝트를 재빌드하면 Lombok을 적용할 수 있다. 만약 재빌드 후에도 Lombok 을 사용할 수 없다면 개발환경의 OS에 맞게 Lombok을 설치해보자. (Lombok 설치과정은 이 포스팅에서는 생략한다.)

Lombok을 적용하여 소스코드 Diet시키기!

이제 Lombok Annotation을 사용하여 소스코드를 다이어트 시켜보자.

기존의 Entity와 DTO에는 Getter, Setter, ToString, EqualsAndHashCode 등의 코드가 모두 작성되어있을 것이다. 이를 삭제하고 아래와 같이 수정하여 사용해보자.

먼저 Getter와 Setter를 먼저 삭제하자. equalsAndHashCode나 ToString을 삭제하지 않는 이유는 간혹 빌드 시 충돌에러가 발생하기 때문이다. 따라서, Getter와 Setter를 먼저 적용해보고, 직접 테스트해보며 다른 어노테이션들을 적용하길 권장한다.

@Entity
@Table(name = "book")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Data
@ToString
public class Book implements Serializable {

-> 위와 같이 Entity에는 @Data와 @ToString을 적용하였다. 사실 @Data에 ToString 메소드 자동생성도 포함되어있으나, ToString 어노테이션을 명시하지 않으면 에러가 발생하는 경우가 있어 위와 같이 작성하였다. 또한, @Data에 EqualsAndHashCode 메소드 생성도 포함되어있으나 기존의 EqualsAndHashCode메소드를 삭제하면 에러가 발생하여 해당 기존 메소드는 삭제하지 않고 남겨두었다.

DTO의 경우 아래와 같이 적용한다.

@Getter
@Setter
@EqualsAndHashCode
@ToString
public class RentalDTO implements Serializable {

-> DTO의 경우 Constructure가 있는 경우 에러가 날 수 있다. 특히 Feign 을 적용할 때 그러한 에러가 발생한다. 따라서 @Data어노테이션은 적용하지 않아야한다. Constructure가 필요한 경우, 필드 포함 유무에 따라 @AllArgsConstructure나 @NoArgsConstructure를 사용하였다. 또한 위와 같이 어노테이션을 명시한 DTO도 있고 equals와 hashcode, toString 메소드가 충돌하는 경우엔 @EqualsAndHashCode, @ToString 어노테이션을 명시하지 않고 기존의 equalsAndHashcode 메소드와 toString 메소드를 그대로 사용하였다.따라서, 직접 테스트해보며 적용하길 권장한다.

Lombok 적용시 주의 사항

Lombok은 소스코드를 매우 간결하게 해주며 Powerful한 기능을 갖고 있다. 하지만 그만큼 위험성도 크기 때문에 Jhipster에서는 기본 개발환경 설정에 Lombok을 적용하지 않기도 했다. 따라서, 테스트를 통해 필요한 Annotation을 잘 선택하여 적용하는 것이 중요하다.

프로젝트에서 주로 사용한 어노테이션은 다음과 같다.

  • @Data : @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor 메소드 자동 생성
  • @Getter : Getter 메소드 생성
  • @Setter : Setter 메소드 생성
  • @ToString : ToString 메소드 생성 (Class 내의 필드를 문자열로 변환)
  • @EqualsAndHashCode : 객체 비교 등의 용도로 사용되는 equals()와 hashCode() 생성
  • @AllArgsConstructure : 모든 필드를 포함한 생성자 메소드 생성
  • @NoArgsConstructure : 모든 필드가 포함되지 않은 빈 생성자 메소드 생성

이외의 자세한 사항은 아래 Lombok 공식 홈페이지 자료를 통해 확인해보자.

https://projectlombok.org/features/all