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]
'IT 관련기술' 카테고리의 다른 글
[Jenkins] 젠킨스(Jenkins) - Continuous Integration Tools (0) | 2022.01.27 |
---|---|
[Git] Git 사용법 (1) | 2022.01.27 |
[형상관리도구] Git 설치하기 (0) | 2022.01.26 |
[Linux] 리눅스 우분투(Ubuntu) Elcipse 설치 (0) | 2022.01.25 |
[H2DB] H2 Database 설치 및 사용법 (3) | 2022.01.20 |
댓글