Lombok이란?

윤현우·2023년 2월 1일
0
post-thumbnail

Lombok

Lombok이란

여러가지 @어노테이션을 제공하고 컴파일 과정에서 자동으로 개발자가 원하는 메소드를 생성/주입 방식으로 동작하는 라이브러리

Java 라이브러리로 반복되는 getter, setter, toString .. 등의 반복 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리 이다.

Lombok은 여러 어노테이션(@)을 제공하고 이를 기반으로 반복 소스코드를 컴파일 과정에서 생성해주는 방식으로 동작하는 라이브러리이다.


Lombok의 장단점

Lombok의 장점

  • 어노테이션 기반의 코드 자동 생성을 통한 생산성 향상

  • 반복되는 코드 다이어트를 통한 가독성 및 유지보수성 향상

  • Getter, Setter 외에 빌더 패턴이나 로그 생성 등 다양한 방면으로 활용 가능

Lombok의 단점

  • 코드가 눈에 직접 보이지 않아 직관성이 떨어진다.

  • 순환 참조 또는 무한재귀호출 문제로 인해 StackOverflowError가 발생할 수도 있다.


Lombok과 일반 Java 코드의 차이

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;
	}
}
  • 이렇게 getter,setter만 붙어도 코드의 길이가 많이 늘어난다.

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 두 롬복 어노테이션만 사용해도 코드가 매우 간결해진다.

자주 사용되는 Lombok 어노테이션

@Getter, @Setter 자동 생성

아마 롬복에서 가장 많이 사용되는 어노테이션일 것이다.

  • 특정 필드에 어노테이션을 붙여주면, 자동으로 생성된 접근자와 설정자 메서드를 사용할 수 있다.(boolean 타입일 경우, isXxx()와 setXxx()메서드 생성)
@Getter
@Setter
private String name;
user.setName("윤현우");
String userName = user.getName();
  • 또한 클래스 레벨에 @Getter, @Setter를 선언해줄 경우, 모든 필드에 접근자와 설정자가 자동으로 생성된다.

생성자 자동 생성

@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 어노테이션으로 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 자동 생성

자바 빈을 만들 때 equalshashCode 메소드를 자주 오버라이딩 하는데요. @EqualsAndHashCode 어노테이션을 사용하면 자동으로 이 메소드를 생성할 수 있습니다.

@Data

@ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor 를 합친 어노테이션입니다.

@Builder

생성자 인자를 메서드 체인을 통해 명시적으로 대입하여 생성자를 호출할 수 있게 빌더 클래스를 생성 해준다.

빌더 클래스와 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

profile
개발자가 되는 그날까지

0개의 댓글