Lombok이란
여러가지 @어노테이션을 제공하고 컴파일 과정에서 자동으로 개발자가 원하는 메소드를 생성/주입 방식으로 동작하는 라이브러리
Java 라이브러리로 반복되는 getter, setter, toString .. 등의 반복 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리 이다.
Lombok은 여러 어노테이션(@)을 제공하고 이를 기반으로 반복 소스코드를 컴파일 과정에서 생성해주는 방식으로 동작하는 라이브러리이다.
어노테이션 기반의 코드 자동 생성을 통한 생산성 향상
반복되는 코드 다이어트를 통한 가독성 및 유지보수성 향상
Getter, Setter 외에 빌더 패턴이나 로그 생성 등 다양한 방면으로 활용 가능
코드가 눈에 직접 보이지 않아 직관성이 떨어진다.
순환 참조 또는 무한재귀호출 문제로 인해 StackOverflowError가 발생할 수도 있다.
Lombok 사용 전
public class UserDto {
private String id;
private String pwd;
private String name;
private String email;
private Date birth;
private String sns;
private Date reg_date;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public String getSns() {
return sns;
}
public void setSns(String sns) {
this.sns = sns;
}
public Date getReg_date() {
return reg_date;
}
public void setReg_date(Date reg_date) {
this.reg_date = reg_date;
}
}
Lombok 사용 코드
@Getter
@Setter
public class UserDto {
private String id;
private String pwd;
private String name;
private String email;
private Date birth;
private String sns;
private Date reg_date;
}
아마 롬복에서 가장 많이 사용되는 어노테이션일 것이다.
@Getter
@Setter
private String name;
user.setName("윤현우");
String userName = user.getName();
@NoArgsConstructor
: 파라미터가 없는 기본 생성자를 생성
@AllArgsConstructor
: 모든 필드 값을 파라미터로 받는 생성자를 생성
@RequiredArgsConstructor
: final
이나@NotNull
인 필드 값만 파라미터로 받는 생성자를 생성
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
@NonNull
private String username;
@NonNull
private String password;
private int[] scores;
}
User user1 = new User();
User user2 = new User("dale", "1234");
User user3 = new User(1L, "dale", "1234", null);
@ToString 어노테이션으로 toString() 메서드를 자동으로 생성해준다.
참고: exclude속성을 사용하면 특정 필드를 toString()결과에서 제외할 수 있다.
@ToString(exclude = "password")
public class User {
private Long id;
private String username;
private String password;
private int[] scores;
}
User user = new User();
user.setId(1L);
user.setUsername("dale");
user.setUsername("1234");
user.setScores(new int[]{80, 70, 100});
System.out.println(user);
출력 값
User(id=1, username=1234, scores=[80, 70, 100])
자바 빈을 만들 때 equals
와 hashCode
메소드를 자주 오버라이딩 하는데요. @EqualsAndHashCode
어노테이션을 사용하면 자동으로 이 메소드를 생성할 수 있습니다.
@ToString
, @EqualsAndHashCode
, @Getter
, @Setter
, @RequiredArgsConstructor
를 합친 어노테이션입니다.
생성자 인자를 메서드 체인을 통해 명시적으로 대입하여 생성자를 호출할 수 있게 빌더 클래스를 생성 해준다.
빌더 클래스와 IDE의 자동 완성 기능을 같이 활용하면 생성자 작성 시 오기입 확률과 인자를 누락할 확률을 낮출 수 있다.
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class Member {
private Long id;
private String name;
private String email;
private String birthDate;
}
public class ApplicationMain {
public static void main(String[] args) {
Member member = Member.builder()
.id(1L)
.name("윤현우")
.email("yhw0104@naver.com)
.birthDate("2000-01-04")
.build();
System.out.println(member);
}
}
실행결과
Member(id = 1, name = 윤현우, email = yhw0104@naver.com, birthDate = 2000-01-04)
@ToString의 순환참조를 조심해야한다.
public class Member {
private String id;
private String pw;
private Address addr;
@Override
public String toString() {
return "Member [id=" + id + ", pw=" + pw + ", addr=" + addr + "];
}
}
public class Address {
private String zipcode;
private Member member;
@Override
public String toString() {
return "Address [zipcode=" + zipcode + ", member=" + member + "]";
}
}
Member 객체를 호출하면, Address 객체의 toString이 다시 호출 되면서, 다시 Member객체의 toString을 호출하게 되며, 무한 루프가 된다.
@ToString과 @Data는 되도록 안쓰는 것이 좋긴하다.
Reference
https://cheershennah.tistory.com/183