본문 바로가기
코딩 공부/web & Java

[Java] Lombok

by 현장 2024. 3. 10.

Lombok

Lombok이란 어노테이션 기반으로 코드를 자동완성 해주는 라이브러리입니다. Lombok을 이용하면 Getter, Setter, Equlas, ToString 등과 다양한 방면의 코드를 자동완성 시킬 수 있습니다. 예를 들어 객체에서 생성자도 필요하고, toString 함수도 Override 해야하는 등 추가적인 작업이 필요하다면 1개의 VO 클래스만 해도 상당히 길어지고, 코드의 가독성은 떨어지는 등의 단점이 있습니다. 하지만 Lombok을 적용한다면 아래와 같이 단순화시킬 수 있습니다.

// Lombok 적용 전
public class User {

    private String useuId;    // 유저ID 
    private String password;  // 비밀번호
    // 생략

    public String getUseuId() {
        return useuId;
    }

    public void setUseuId(String useuId) {
        this.useuId = useuId;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    // 생략
}
// Lombok 적용 후
@Getter
@Setter
public class User {

    private String useuId;    // 유저ID 
    private String password;  // 비밀번호
    // 생략

}

예시 코드만 보아도 Lombok을 활용하면 엄청난 양의 업무량과 코드 다이어트를 얻을 수 있음을 명확하게 확인할 수 있습니다.

🏷️ 장점

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

🏷️ 기능

✅ @Getter, @Setter

@Getter
@Setter // 클래스 전체에 적용
public class User {

    private String useuId;    // 유저ID 
    // 변수 하나에만 적용도 가능하다.
    @Setter private String password;  // 비밀번호
    
    // 생략
}

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

✅ @AllArgsConstructor

@Getter
@Setter 
@AllArgsConstructor
public class User {
    private String useuId;    // 유저ID 
    private String password;  // 비밀번호
    
    /* 모든 변수를 생성하는 생성자를 AllArgsConstructor 어노테이션이 생성합니다.
    public User(String useuId, String password) {
        this.useuId = useuId;
        this.password = password;
    }
    */
}

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

✅ @NoArgsConstructor

@Getter
@Setter 
@NoArgsConstructor
public class User {
    private String useuId;    // 유저ID 
    private String password;  // 비밀번호
    
    /* 변수가 없는 기본 생성자를 NoArgsConstructor 어노테이션이 생성합니다.
    public User() {
    }
    */
}

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

✅ @RequiredArgsConstructor 

@Getter
@Setter 
@RequiredArgsConstructor
public class User {
    @NonNull
    private String useuId;    // 유저ID 
    private final String password;  // 비밀번호
    private String memo;      // 메모
    
    /* 특정 변수만 가진 생성자를 RequiredArgsConstructor 어노테이션이 생성합니다.
    public User(String userId, String password) {
        this.userId = userid;
        this.password = password;
    }
    */
}

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

✅ @EqualsAndHashCode

@RequiredArgsConstructor
// 상속 받은 것은 없지만 보여주기 위해 callSuper를 넣어봤습니다.
@EqualsAndHashCode(of = {"useuId", "password"}, callSuper = false))
public class User {
    @NonNull
    private String useuId;    // 유저ID 
    @NonNull
    private String password;  // 비밀번호
    private String memo;      // 메모
    
}

@EqualsAndHashCode 어노테이션을 활용하면 클래스에 대한 equals 함수와 hashCode 함수를 자동으로  생성해줍니다. 만약 서로 다른 두 객체에서 특정 변수의 이름이 똑같은 경우 같은 객체로 판단을 하고 싶다면 위와 같이 해줄 수 있습니다.

 

@EqualsAndHashCode(of = {"userId", "password"}) 로 설정하여 userId와 password가 동일하다면 같은 객체로 인식하도록 해주고 있습니다. 또한 만약 무언가를 상속하고 있는데, 상위 클래스의 경우 적용시키지 않으려면 callSuper=false로 설정하면 됩니다.

✅ @ToString

@ToString
@AllArgsConstructor
public class User {
    @ToString.Exclude
    private String useuId;    // 유저ID 
    private String password;  // 비밀번호
    private String memo;      // 메모
    
}

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

✅ @Data

@Data 사용시 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 자동완성 시켜줍니다. 실무에서는 너무 무겁고 객체의 안정성을 지키기 때문에 @Data의 활용을 지양해야 합니다.

✅ @Builder

@ToString
@NoArgsConstructor
public class User {
    @ToString.Exclude
    private String useuId;    // 유저ID 
    private String password;  // 비밀번호
    private String memo;      // 메모
    
    @Builder
    public User(String userId, String password) {
        this.userId = userId;
        this.password = password;
    }
}

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

✅ @Delegate

// review class
@AllArgsConstructor
@Getter
public class Review {
    private String userName;
    private String contents;

}

// goods class
@NoArgsConstructor
@Getter
public class Goods {
    private String goodsId;
    private String goodsName;
    private String goodsPrice;
    @Delegate
    private List<Review> reviewsList;
    // 생략
}

@Delegate 어노테이션은 한 객체의 메소드를 다른 객체로 위임시켜 줍니다. 그래서 reviewList에서 사용하는 함수들을 Goods로 위임시켜서 코드를 편리하게 작성하도록 도와준다.

// 기존의 방식
goods.getReviewList().add(review);
// @Delegate를 활용한 방식
goods.add(review);

✅ @ㅣog관련 어노테이션

@RestController
@Log4j2
public class TestController {

    @GetMapping(value = "/log")
    private ResponseEntity log(){
        log.error("Error");
        return ResponseEntity.ok().build();
    }
}

@Log4j2와 같은 어노테이션을 활용하면 해당 클래스의 로그 클래스를 자동 완성 시켜줍니다.

📖 Reference

망나니개발자

'코딩 공부 > web & Java' 카테고리의 다른 글

[Spring] Proxy  (0) 2024.04.17
[Java] DTO를 Record로 만드는 이유  (0) 2024.04.17
[JPA] findById와 getReferenceById  (0) 2024.03.09
[JPA] JPA Auditing  (0) 2024.02.11
[Java] Optional  (1) 2024.01.27