본문 바로가기
IT 관련기술

[Java] Lombok 사용법

by bits 2022. 1. 26.

Lombok

Java 기반의 프로젝트 개발시 getter, setter, toString 등 반복적으로 작성하는 코드들이 존재한다. 이런 작성 코드를 줄여주는 라이브러리가 Lombok이다.

 

Lombok 이란

Lombok은 어노테이션 기반으로 코드를 자동완성 해주는 라이브러리이다. Lombok을 이용하면 Getter, Setter, Equals, ToString 등과 같은 코드를 자동완성 시킬 수 있다.

 

public class Member{
    private String id;
    private String name;
    
    public Member(){}
    
    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;    
    }
}

위와 같이 VO 클래스 정의를 Lombok을 이용하면 아래와 같이 간단하게 작성할 수 있다.

@Getter
@Setter
@NoArgsConstructor
public class Member{
    private String id;
    private String name;
}

 

Lombok의 장점

  • 어노테이션 기반의 코드 자동 생성을 통한 생산성 향상
  • 코드 가독성 및 유지보수성 향상
  • Getter, Setter 외에 빌더 패턴이나 로그 생성 등 다양한 방면으로 활용 가능

Lombok 사용시 주의할 점

  • 리네임 리팩토링이 잘 되지 않는 경우가 발생할 수 도 있다고 하나 요즘 IDE는 무리없이 작동함.
  • 객체 간에 상호참조관계가 있을 때 Lombok이 toString() 메서드 자동 생성시 무한 루프에 빠질 수 있어 주의를 요함.(이 경우 @ToString(exclude="fieldName") @EqualsAndHashCode(exclude="fieldName") 이런식으로 참조하는 객체를 제외하는 것으로 해결)

 

Lombok 의존성 추가

메이븐 프로젝트의 경우 pom.xml에 아래와 같이 의존성을 추가한다.

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>

 

Lombok 사용 예제

@Getter @Setter

Lombok에서 가장 자주 활용하는 어노테이션이다. @Getter와 @Setter를 클래스 이름 위에 적용시키면 모든 변수들에 적용이 가능하고, 변수 이름 위에 적용시키면 해당 변수들만 적용 가능하다. 

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

@AllArgsConstructor

@AllArgsConstructor는 모든 변수를 사용하는 생성자를 자동완성 시켜주는 어노테이션이다.

@Getter
@AllArgsContructor
public class Member{
    private String id;    
    private String name;
    
    /* AllArgsContructor를 통해 아래와 같은 생성자를 자동 생성할 수 있다.
    public Member(String id, String name){
      this.id = id;
      this.name = name;
    }
    */
}

 

@NoArgsConstructor

@NoArgsConstructor는 어떠한 변수도 사용하지 않는 기본 생성자를 자동완성 시켜주는 어노테이션이다.

 

@Getter
@NoArgsContructor
public class Member{
    private String id;    
    private String name;
    
    /* NoArgsContructor를 통해 아래와 같은 생성자를 자동 생성할 수 있다.
    public Member(){}
    */
}

 

@RequiredArgsConstructor

@RequiredArgsConstructor는 특정 변수만을 활용하는 생성자를 자동완성 시켜주는 어노테이션이다. 생성자의 인자로 추가할 변수에 @NonNull 어노테이션 또는 변수에  final로 선언해서 의존성을 주입받을 수 있다.

@Getter
@RequiredArgsContructor
public class Member extends Common{
    @NonNull
    private String id;    
    private final String name;  // final 선언
    
    /* RequiredArgsContructor 를 통해 아래와 같은 생성자를 자동 생성할 수 있다.
    public Member(String id, String name){
    	this.id = id;
        this.name = name;
    }
    */
}

 

@EqualsAndHashCode

@EqualsAndHashCode 어노테이션을 활용하면 클래스에 대한 equals 함수와 hashCode 함수를 자동으로 생성해준다.

 

@RequiredArgsContructor
@EqualsAndHashCode(of={"id", "name"}, callSuper=false)
public class Member extends Common{
    @NonNull
    private String id;    
    private final String name;  // final 선언
        
}

위의 @EqualsAndHahsCode(of={"id", "name"}) 로 설정하여 id와 name이 동일하다면 같은 객체로 인식하도록 해주고, 또한 Common 을 상속하고 있는데, 상위 클래스의 경우 적용시키지 않기 위해 callSuper=false로 해주었다.

 

@ToString

@ToString 어노테이션을 활용하면 클래스의 변수들을 기반으로 ToString 메소드를 자동으로 완성시켜 준다. 출력을 원하지 않는 변수에 @ToString.Exclude 어노테이션을 붙여주면 출력을 제외할 수 있다. 또한 상위 클래스에 대해도 toString을 적용시키고자 한다면 상위 클래스에 @ToString(callSuper = true) 를 적용시키면 된다. 

 

@ToString
public class Member extends Common{

    @ToString.Exclude
    private String id;    // id는 toString에서 제외
    
    private final String name;  // final 선언
}

 

@Data

@Data 어노테이션을 활용하면 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 자동완성 시켜준다.

 

@Builder

@Builder 어노테이션을 활용하면 해당 클래스의 객체의 생성에 Builder패턴을 적용시켜준다. 모든 변수들에 대해 build하기를 원한다면 클래스 위에 @Builder를 붙이면 되지만, 특정 변수만을 build하기 원한다면 생성자를 작성하고 그 위에 @Builder 어노테이션을 붙여주면 된다.

@NoArgsContructor
@Getter
//@Builder  // 모든 변수를 초기화 하는 builder 생성시 클래스 레벨에 선언
public class Member extends Common{

    private String id;    
    private String name;
    private String phone;
    
    // 특정 변수만을 초기화 하려면 특정 생성자에 선언
    @Builder
    public Member(String id, String name){
    	this.id = id;
        this.name = name;
    }
    
    /* 
    @Builder 선언시 Lombok에 의해 빌더생성을 위한 다음의 코드가 생성됨.
    public static Member.MemberBuilder builder() {
        return new Member.MemberBuilder();
    }

    public static class MemberBuilder {
        private String id;
        private String name;

        MemberBuilder() {
        }

        public Member.MemberBuilder id(final String id) {
            this.id = id;
            return this;
        }

        public Member.MemberBuilder name(final String name) {
            this.name = name;
            return this;
        }

        public Member build() {
            return new Member(this.id, this.name);
        }

        public String toString() {
            return "Member.MemberBuilder(id=" + this.id + ", name=" + this.name + ")";
        }
    }    
    */
}

 

빌더를 생성했다면 아래와 같이 사용하면 된다.

public class MemberController{

    public ResponseEntity init(){
    	
        // 빌더 패턴을 이용한 객체 생성
        Member member = Member.builder()
            .id("hong")
            .name("홍길동")
            .build();
        
        return ResponseEntity.ok(member);    
    }
}

 

 

 


[참고]

https://mangkyu.tistory.com/78 [MangKyu's Diary]

 

 

댓글