본문으로 바로가기

[IntelliJ] IntelliJ 롬복 설치 및 설정

category 6. 개발도구/6_1 IntelliJ 2020. 2. 18. 20:37
반응형

[IntelliJ] IntelliJ Lombok 설치 및 설정

 

안녕하세요. 갓대희 입니다. 이번 포스팅은 [ 인텔리제이 롬복 설정입니다. : ) 

 

 

0.롬복(Lombok)이란? 

▶ 롬복(Lombok)

 - 롬복(Lombok)은 Java Domain(Dto, Vo)에서 반복적으로 작성되는 getters/setters나 toString, 생성자 관련 코드 등의 소스들을 간결하게 만들어주는 라이브러리다.
 - 롬복에 대한 설명은 다음 링크의 포스팅에서 설명 해 두었다. (https://goddaehee.tistory.com/95)

 

이번 포스팅 에서는 롬복을 인텔리 제이에 설치 & 적용 하는 방법을 간단히 설명하려 한다.

 

1.IntelliJ 롬복 Plugin 설치

▶ 인텔리 제이 -  롬복 플러그인 설치

 - Setting > Plugins
 - Marketplace 탭에서 Lombok을 검색하여 플러그인을 설치할 수 있다.

 

2. Dependency 설정

 - 최신 버전의 롬복을 적용하려 한다.
https://mvnrepository.com/artifact/org.projectlombok/lombok

 - 현재 기준의 최신 버전은 1.18.12 이다. (2020/02/18)

 

▶ 1. maven - pom.xml

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>

 

▶ 2. gradle

// https://mvnrepository.com/artifact/org.projectlombok/lombok
provided group: 'org.projectlombok', name: 'lombok', version: '1.18.12'

 

3. Enable annotation 설정

 - settings > Build, Execution, Deployment > Compiler > Annotation Processors
 - Enable annotation processing 체크

 

4. 적용 예시

 - 다음의 샘플 DTO 소스를 예로 들어 이제부터 롬복을 적용 해보자. 

 - ex) 샘플 DTO(vo, domain)

package com.god.bo.test.vo;

public class TestVo {
    private String id;
    private String name;

    public TestVo() {
    }

    public TestVo(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        TestVo testVo = (TestVo) o;
        return Objects.equals(id, testVo.id) &&
                Objects.equals(name, testVo.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }

    @Override
    public String toString() {
        return "TestVo{" + "id='" + id + '\'' + ", name='" + name + '\'' + '}';
    }
}

 

▶ 4.1 @Getter @Setter

 - @Getter와 @Setter 애노테이션을 클래스명 위에 명시하면, 필드값에 대한 getters/setters 메소드가 자동 생성된다.
 - "AccessLevel"을 통해 접근 제한자 설정이 가능하다. (Default : Public)
   ex) @Getter(access = AccessLevel.PROOTECTED)
 - 클래스에 선언시 모든 필드에 대해 생성, 필드에 선언시 선언된 필드에 대해서만 getter, setter를 생성한다.

 

▶ 4.2 @NoArgsConstructor @AllArgsConstructor

 - "AccessLevel"을 통해 접근 제한자 설정이 가능하다. (Default : Public)

   ex) @NoArgsConstructor(access = AccessLevel.PROOTECTED)

 - @NoArgsConstructor : 기본생성자를 자동 생성해준다.


 - @AllArgsConstructor : 필드값을 모두 포함한 생성자를 자동 생성해준다.

 

▶ 4.3 @ToString

 - toString 메소드를 자동생성 하여 준다.

 - 클래스명(필드명1=값1, 필드명2=값2, . . . ) 형태로 출력된다.
 - exclude 키워드를 이용하여 출력을 원치 않는 필드 지정이 가능하다. 

 - 필드의 명을 출력하고 싶지 않을때 : includeFieldNames을 false. 제외시키고 싶은 필드는 exclude 파라미터에 추가하면된다.

 - of 파라미터를 이용하여 원하는 필드만 출력할 수 도 있다. 부모 클래스의 toString을 출력하고 싶은 경우에는 callSuper 파라미터를 true로 설정하여 포함시킬 수도 있다.

- ex1) toString > 모든 필드 출력

package com.god.bo.test.vo;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class TestVo {
    private String id;
    private String name;
}

 

 - ex2) exclude 선언 - name 변수만 노출된 것을 볼 수 있다.

package com.god.bo.test.vo;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString(exclude="id")
public class TestVo {
    private String id;
    private String name;
}

 

 

▶ 4.4 @EqualsAndHashCode

 - equals()와 hashCode()를 자동으로 생성해 준다.

 

ex) 위의 예시 샘플 소스에 롬복 적용시

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class TestVo {
    private String id;
    private String name;
    
    /*  @NoArgsConstructor, @AllArgsConstructor 어노테이션을 통해 생략 가능
    public TestVo() {
    }

    public TestVo(String id, String name) {
        this.id = id;
        this.name = name;
    }
    */
    
    /* @Getter, @Setter 어노테이션을 통해 생략 가능
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    */
    
    /* @EqualsAndHashCode 어노테이션을 통해 생략 가능
	@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        TestVo testVo = (TestVo) o;
        return Objects.equals(id, testVo.id) &&
                Objects.equals(name, testVo.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }
    */
    
    /* @ToString 어노테이션을 통해 생략 가능
    @Override
    public String toString() {
        return "TestVo{" + "id='" + id + '\'' + ", name='" + name + '\'' + '}';
    
	}
    */
}

 

▶ 4.5 이외

① @Notnull

 - 멤버필드에 선언해 주면, 해당 변수 Setter에 null값이 들어 올 때 NullPointException을 발생시킨다.

 - ex)

public class TestVo {

    @NotNull
    private String id;
    
    private String name; 
} 

 

② @cleanup

 - try finally에서 close()를 대신 호출해주는 어노테이션


③ @Synchronized

 - 자바의 synchronized를 사용할 때 deadlock이 발생하는 경우가 종종 발생하는걸 방지하기 위해 Lombok이 메소드가 실행되기 전에 잠글 $ lock이라는 개인 잠금 필드를 생성한다.

 - lock 오브젝트를 자동으로 생성, synchronized를 손쉽게 사용할수 있게 해준다. 

 

④ @Data

 - @Getter, @Setter, @NonNull, @EqualsAndHashCode, @ToString 에 대한 걸 모두 해주는 Annotation

 - @NonNull 또는 final 필드를 매개변수로 사용하는 public 생성자가 생성된다.

 - @Data는 staticConstructor 하나의 파라미터 옵션만 제공하는데, 파라미터를 이름으로 하는 static factory 메서드를 생성하여 준다.

 - ex) @Data(staticConstructor="of")

 

⑤ @Value

 - Value는 Immutable Class을 생성해준다.

 - @Data와 비슷하지만 모든 필드를 기본적으로 Private 및 Final로 로 하고, Setter 함수를 생성하지 않고, Class또한 Final로 지정하는 것만 빼고 동일하다.

 

⑥ @Slf4j, @Log 등

 - 해당 어노테이션을 선언하면, log관련 static 메소드를 클래스 별로 선언할 필요가 없다.
 - ex)

@Controller 
@Slf4j 
public class testController { 
    @RequestMapping(value = "/test") 
    public @responseBody String test(){ 
        log.info("test!!!"); 
        return "test"; 
    } 
}

 
⑦ @Builder

 - 어노테이션을 선언하면 생성자 대신에 빌더를 사용할 수 있다.
 - @Singular : collection 타입에 선언하게 되면 파라미터를 하나씩 추가할 수 있다.
 - ex)

@Builder 
public class TestVo { 
    private String id; 
    private String name; 

    @Singular 
    private List listTest; 

    @Singular 
    private Map<String, String> maps; 

    /*  TestVo test = TestVo.builder().id("goddaehee") 
                                  .name("GodDaeHee") 
                                  .listTest("List") 
                                  .listTest("List Test") 
                                  .maps("age","20") 
                                  .maps("gender","male") 
                                  .build(); 
                                  . 
    */ 
}


※ 롬복의 실무 적용 시에는 왠만하면 @Getter, @Setter, @ToString @Slf4j 등만 사용하길 권장하고 싶다.

 

특정 버전 이전에서는 생각 보다 많은 버그도 있고, 잘못사용시 의도치않은 버그? 와같은 결과를 얻을 수 있는 사례가 많다.

반응형

댓글을 달아 주세요

  1. 컴공 2021.02.06 20:37

    덕분에 해결했습니다. 감사합니다.