안녕하세요
오늘은 스프링 공부를 하면서 유용하게 사용하고 있는
Lombok 롬복 라이브러리에 대해서 정리를 해보는 가져볼게요
Lombok

Lombok이란 Java 라이브러리로 반복되는 getter, setter, toString 등의 반복 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리이다.
Java에서 보통 model 클래스나 Entity 같은 도메인 클래스 등에서 수많은 멤버변수가 있고 이에 대응되는 getter, setter와 toString() 메서드, 때에 따라 멤버변수에 따른 여러 개의 생성자를 만들어주는 데,
거의 대부분 이클립스나 인텔리제이 같은 IDE에서 자동생성 기능이 있지만, 이 역시도 번거로운 작업이 아닐 수 있다.
뿐만 아니라 코드 자체가 반복 소스 코드로 복잡해진다.
Lombok 은 여러가지 @어노테이션을 제공하고 이를 기반으로 반복 소스코드를 컴파일 과정에서 생성해주는 방식으로 동작하는 라이브러리이다.
Lombok과 일반 Java 코드 차이
먼저 @Getter와 @Setter 차이
public class PostRequest {
private Long id; // PK
private String title; // 제목
private String content; // 내용
private String writer; // 작성자
private Boolean noticeYn; // 공지글 여부
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public Boolean getNoticeYn() {
return noticeYn;
}
public void setNoticeYn(Boolean noticeYn) {
this.noticeYn = noticeYn;
}
}
보통 private 변수를 선언하고, get, set 메서드를 통해 간접적으로 데이터에 접근하는 형태가 일반적입니다.
lombok 라이브러리를 사용하면 어노테이션을 추가해주는 것으로 get, set 메서드를 생성할 필요 없이 동일한 효과를 발휘하는 코드를 작성할 수 있습니다.
위 모델에 lombok을 적용했을 때의 코드는 아래와 같습니다.
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class PostRequest {
private Long id; // PK
private String title; // 제목
private String content; // 내용
private String writer; // 작성자
private Boolean noticeYn; // 공지글 여부
}
코드를 보면 @Getter, @Setter 어노테이션이 추가되고, set, get 메서드가 없는 것을 확인할 수 있습니다.
과거의 방식과 비교했을 때 엄청나게 코드의 분량이 줄어든 것을 볼 수 있습니다.
@Override
public String toString() {
return "PostRequest{" +
"id=" + id +
", title='" + title + '\'' +
", content='" + content + '\'' +
", writer='" + writer + '\'' +
", noticeYn=" + noticeYn +
'}';
}
tostring() 메서드를 이용해서 데이터를 출력을 할 때는 tostring() 상속을 받아서 사용을 하는데 롬북에서 @ToString 어노테이션을 사용을 하면은 밑에 처럼 간단하게 사용할 수 있습니다. 이외에도 equals와 hashCode 메소드를 자주 오버라이딩 하는데요. @EqualAndHashCode 어노테이션을 사용하면 자동으로 메서드를 생성할 수 있습니다.
callSuper 속성을 통해 equals와 hashCode 메소드 자동 생성 시 부모 클래스의 필드까지 감안할지 안 할지에 대해서 설정할 수 있습니다. 즉, callSuper = true로 설정하면 부모 클래스 필드 값들도 동일한지 체크하며, callSuper = false로 설정(기본값)하면 자신 클래스의 필드 값들만 고려합니다.
@Getter
@Setter
@ToString
public class PostRequest {
private Long id; // PK
private String title; // 제목
private String content; // 내용
private String writer; // 작성자
private Boolean noticeYn; // 공지글 여부
}
생성자 자동 생성
@NoArgsConstructor 어노테이션은 파라미터가 없는 기본 생성자를 생성해 주고, @AllArgsConstructor 어노테이션은 모든 필드 값을 파라미터로 받는 생성자를 만들어줍니다. 마지막으로 @RequiredArgsConstructor 어노테이션은 final이나 @NotNull인 필드 값만 파라미터로 받는 생성자를 만들어줍니다.
@RequiredArgsConstructor
public class ItemServiceV2 implements ItemService{
private final ItemRepositoryV2 itemRepositoryV2;
private final ItemQueryRepositoryV2 itemQueryRepositoryV2;
스프링의 DI와 IOC 관계에서 생성자 주입을 사용할 때 간단하게 표현을 할 수가 있습니다.
@Data 어노테이션
@Data 어노테이션을 사용하면 @ToString, @EqualAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 자동완성 시켜줍니다.
@Data
public class PostRequest {
private Long id; // PK
private String title; // 제목
private String content; // 내용
private String writer; // 작성자
private Boolean noticeYn; // 공지글 여부
}
위 클래스만 비교해 보아도 롬복 활용식 엄청난 양의 코드를 줄일 수 있음을 확인할 수 있습니다.
로거 자동 생성
클래스마다 일일이 로거를 생성해주는 여간 귀찮은 일이 아니닫. 이때 @Log 어노테이션을 사용하면 자동으로 log 필드를 만들고, 해당 클래스의 이름으로 로거 객체를 생성하여 할당해 줍니다. @Log 뿐만 아니라 @Slf4j 나 @Log4j2 등 다양한 로깅 프레임워크에 대응하는 어노테이션을 제공합니다.
@Log
public class LogExample {
// 자동 생성
// private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
public static void main(String... args) {
log.info("TEST");
}
}
@Builder
@Builder란 Lombok에서 제공하는 어노테이션으로, 생성자 인자를 메서드 체인을 통해 명시적으로 대입하여 생성자를 호출할 수 있게 빌더 클래스를 생성 해준다. 빌더 클래스와 IDE의 자동 완성 기능을 같이 활용하면 생성자 작성 시 오기입 확률과 인자를 누락할 확률을 낮출 수 있었다.
@Builder
public class User {
private Long id;
private String username;
private String password;
@Singular
private List<Integer> scores;
}
컬렉션으로 된 필드에는 @Singular 어노테이션을 선언해주면 모든 원소를 한 번에 넘기지 않고 원소를 하나씩 추가할 수 있습니다.
User user = User.builder()
.id(1L)
.username("dale")
.password("1234")
.score(70)
.score(80)
.build();
// User(id=1, username=dale, password=1234, scores=[70, 80])
※참고※
https://projectlombok.org/features/Builder
https://cheershennah.tistory.com/183
https://www.daleseo.com/lombok-popular-annotations/
'java and sping' 카테고리의 다른 글
| [Spring] JPA에 Enum 사용법 (0) | 2023.03.22 |
|---|---|
| [Spring] DTO를 사용하는 이유? (0) | 2023.03.18 |
| [Spring] Spring Data JPA에서의 페이지네이션과 정렬 (1) | 2023.03.17 |
| [Spring] JPA 데이터베이스 스키마 자동 생성 - 속성 (0) | 2023.02.16 |
| [Spring] DI와 IoC에 관해서 (0) | 2022.07.28 |