Lombok이란? Lombok 이클립스에 적용하는 방법
Lombok(롬복)은 Java 라이브러리로 반복되는 getter, setter, toString 등의 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리입니다. 보통 Model 클래스나 Entity 같은 도메인 클래스 등에는 수많은 멤버변수가 있고 이에 대응되는 getter와 setter 그리고 toString() 메서드 그리고 때에 따라서는 멤버변수에 따른 여러개의 생성자를 만들어주게 되는데, 거의 대부분 이클립스같은 IDE의 힘만으로 생성한다고 하지만 이 역시도 번거로운 작업이 될 수 있습니다. 뿐만 아니라 코드 자체가 반복되는 메서드로 인해 매우 복잡해지게 됩니다.

Lombok은 여러가지 어노테이션을 제공하고 이를 기반으로 코드를 컴파일과정에서 생성해 주는 방식으로 동작하는 라이브러리입니다. 즉 코딩 과정에서는 롬복과 관련된 어노테이션만 보이고 getter와 setter 메서드 등은 보이지 않지만 실제로 컴파일된 결과물(.class)에는 코드가 생성되어 있다는 뜻입니다.




Lombok 사용시의 장점과 주의사항
롬복은 복잡하고 반복되는 코드가 줄어듦으로써 코드의 가독성을 높일 수 있고 코딩 생산성 또한 높일 수 있습니다. 다만 롬복이 개발자마다 호불호가 나뉘는 라이브러리로 특정 개발자들은 코드가 직접 눈에 보임으로써 직관성을 유지하는것이 좋다고 보는 의견도 있는 만큼 자신의 프로젝트나 프로젝트 리더의 성향에 따라 사용하면 좋을 것 같습니다.

또한 편리성을 제공하는 라이브러리일수록 주의할 사항으로 API 설명과 내부 동작을 어느정도 숙지하고 사용해야 한다는 점 입니다. 예를 들어 Lombok의 @Data 어노테이션이나 @ToString 어노테이션으로 자동 생성되는 toString()메서드는 순환 참조 또는 무한 재귀 호출 문제로 인해 StackOverflowError가 발생할수도 있습니다. 물론 이 문제를 인지한 Lombok에서 해결할 수 있는 속성들을 제공하지만 롬복이 편리하다는 이유만으로 마구 사용한다면 여러가지 문제가 발생할 수 있다는 것입니다.



Lombok과 일반 Java 코드의 차이
예를 들어 Category라는 모델 클래스가 있다고 한다면 보통 우리는 다음과 같은 코드를 작성하게 됩니다.
public class CategoryModel {
      private String id;
      private String parentId;
      private String name;
      private Long depthLevel;
      private Long seq;
      private String userYn;
      
      public CategoryModel() {}
      
      public CategoryModel(String id, String parentId, String name, Long  depthLevel, Long seq, String userYn) {
            super();
            this.id = id;
            this.parentId = parentId;
            this.name = name;
            this.depthLevel = depthLevel;
            this.seq = seq;
            this.userYn = userYn;
      }
 
      public String getId() {
            return id;
      }
      
      public void setId(String id) {
            this.id = id;
      }
      
      public String getParentId() {
            return parentId;
      }
      
      public void setParentId(String parentId) {
            this.parentId = parentId;
      }
      
      public String getName() {
            return name;
      }
      
      public void setName(String name) {
            this.name = name;
      }
      
      public Long getDepthLevel() {
            return depthLevel;
      }
      
      public void setDepthLevel(Long depthLevel) {
            this.depthLevel = depthLevel;
      }
      
      public Long getSeq() {
            return seq;
      }
      
      public void setSeq(Long seq) {
            this.seq = seq;
      }
      
      public String getUserYn() {
            return userYn;
      }
      
      public void setUserYn(String userYn) {
            this.userYn = userYn;
      }
      @Override
      public String toString() {
            return "CategoryModel [id=" + id + ", parentId=" + parentId  + ", name=" + name + ", depthLevel=" + depthLevel
                        + ", seq=" + seq + ", userYn=" + userYn + "]";
      }
      
}
cs


그러나 위의 코드를 Lombok을 이용한다면 아래와 같이 바뀔 수 있습니다. 클래스에 @Getter@ToString 등의 어노테이션을 붙여주기만 하면 됩니다.
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class CategoryModel {
      private String id;
      private String parentId;
      private String name;
      private Long depthLevel;
      private Long seq;
      private String userYn;
      
}
cs


만약 위의 5가지 어노테이션을 붙이는것조차 부담스럽다면 @Data 어노테이션 하나만 붙여 사용할수도 있습니다.
@Data
public class CategoryModel {
      private String id;
      private String parentId;
      private String name;
      private Long depthLevel;
      private Long seq;
      private String userYn;
}
cs


또한 보통의 프로젝트에서 Log4jSlf4j같은 Loggin 프레임워크를 사용하는데, 항상 다음과 같이 비즈니스 로직과는 별개로 불필요한 코드가 작성되게 됩니다.
public class CategoryServiceImpl {
     private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(CategoryServiceImpl.class);
 
//생략
 
}
cs


그러나 롬복에서는 다음과 같이 사용이 가능합니다. 아래와 같이 @Slf4j같은 Logger 어노테이션을 붙여주면 log라는 변수로 로깅을 사용할 수 있습니다.
@Slf4j
public class CategoryServiceImpl {
//생략
}
cs





Lombok 적용 방법
본격적으로 프로젝트에 롬복 적용 방법을 알아보도록 하겠습니다. 이번글에서는 eclipse 기반의 프로젝트에서 적용하는 방법을 알아보고 이후 IntelliJ에서 적용하는 방법을 포스팅하도록 하겠습니다.

롬복은 @Getter, @Setter 등 어노테이션을 사용하는데, 이러한 API를 사용하기 위해서 롬복 라이브러리(.jar)파일을 추가해 주어야 합니다. .jar 파일을 직접 내려받아 class path 상에 추가해도 되지만 메이븐 프로젝트의 경우 pom.xml에 아래와 같이 의존성을 추가해 주면 됩니다.
      <!-- lombok -->
      <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
      </dependency>
cs



그레이들의 경우 build.gradle에 다음과 같이 사용할 수 있습니다. (자세한 내용은  https://projectlombok.org/setup/gradle 참조)
repositories {
        mavenCentral()
}
 
dependencies {
        compileOnly 'org.projectlombok:lombok:1.18.12'
        annotationProcessor 'org.projectlombok:lombok:1.18.12'
        
        testCompileOnly 'org.projectlombok:lombok:1.18.12'
        testAnnotationProcessor 'org.projectlombok:lombok:1.18.12'
}
cs


만약 직접 lombok.jar를 내려받아 프로젝트에 추가하려는 경우 https://projectlombok.org/download 주소에 접근하여 Download 할 수 있습니다.



프로젝트에 롬복 라이브러리 의존성을 추가했다면 이제 @Getter@Setter 등의 API를 사용할 수 있게 되었을 것입니다. 다만 이상태로는 API를 사용할 수 있게 된것일 뿐 실제로 코드가 생성되어지거나 하지는 않는데, 이클립스나 IntelliJ같은 IDE의 경우 우리가 개발시에 코드를 수정할때마다 실시간으로 컴파일을 진행하는데, 롬복을 인식하고 코드를 자동으로 생성해주지 않기 때문입니다. 따라서 추가적인 작업을 해주어야 하는데, 이 작업 역시 lombok.jar를 통해 수행이 가능합니다.


예를 들어 메이븐을 이용했다면 라이브러리는 다음과 같은 경로에 존재할것입니다.
C:\Users\[자신의 win 사용자 계정]\.m2\repository\org\projectlombok\lombok\1.18.12

만약 디렉터리를 찾아가는것이 귀찮다면 위의 라이브러리 다운로드 url에 접근하여 내려받아주세요.




이제 명령행(cmd)를 열고 롬복 라이브러리가 있는 경로로 이동한 후에 java -jar 명령어를 실행하여 롬복 라이브러리를 실행합니다. 롬복 라이브러리는 프로젝트에 사용되는 라이브러리이기도 하지만 동시에 이클립스의 컴파일러 기능에 롬복의 기능을 추가해주는 역할도 합니다.
> cd C:\Users\[자신의 win 사용자 계정]\.m2\repository\org\projectlombok\lombok\1.18.12
> java -jar lombok-1.18.12.jar
cs


java -jar 명령어를 정상적으로 실행했다면 다음과 같이 installer가 나타나는데, Specify location...을 클릭합니다. 만약 이클립스 경로를 자동으로 인식한다면 이과정은 건너뛰셔도 좋습니다.




롬복의 컴파일 기능을 추가하고 싶은 eclipse의 eclipse.exe실행파일을 선택하고 Select를 클릭합니다. 사용하는 이클립스나 STS, eGov등 여러개인 경우 추가하고 싶은 이클립스 경로를 선택하시면 됩니다.




Install / Update를 클릭합니다.




Install successful이 뜨면 종료하셔도 좋습니다. 이클립스를 재시작 하시고 만약 제대로 적용이 안됐다면 이클립스를 종료한 상태로 과정을 다시 실행해 주세요.






롬복 적용 후 테스트
이클립스 프로젝트 생성 후 앞서 말한것과 같이 롬복 라이브러리를 메이븐(pom.xml) 등을 이용하거나 프로젝트 설정의 Class Path 설정등을 이용하여 추가해줍니다. 이후에 클래스를 하나 작성합니다.


import lombok.Getter;
import lombok.Setter;
 
@Getter
@Setter
public class CategoryModel {
      private String id;
      private String parentId;
      private String name;
      private Long depthLevel;
      private Long seq;
      private String userYn;
}
cs


저는 코드를 아래와 같이 작성하였습니다. 분명 코드상으로는 멤버변수만 존재하고 두가지 어노테이션만을 추가했을 뿐인데, 실제 내부적으로는 getter와 setter가 추가된것을 볼 수 있습니다. 이클립스가 실제 컴파일된 결과물에는 메서드들을 생성하고 이를 인식했기 때문입니다.




실제로 코드를 작성할때 코드힌트 목록에도 여러가지 set* 메서드들이 생성된것을 알 수 있습니다.




롬복의 개념 및 설정 방법은 이정도로 하고 여러가지 어노테이션 사용 방법은 다음 포스팅에서 진행하도록 하겠습니다.



참고글



블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!