본문 바로가기
BE/Java

Lombok 어노테이션 정리

by cjsrhd94 2022. 1. 15.

@Getter, @Setter

// lombok 적용 전

public class User{
    private Long seq;
    private String email;
    private String password;
    private String nickname;
    
    public String getSeq() {
    	return seq;
    }
    
    public String getEmail() {
    	return email;
    }
    
    public String getPassword() {
    	return password;
    }
    
    public String getNickname() {
    	return nickname;
    }
    
    public void setSeq(Long seq) {
    	this.seq = seq;
    }
    
    public void setEmail(String email) {
    	this.email = email;
    }
    
    public void setPassword(String password) {
    	this.password = password;
    }
    
    public void setNickname(String nickname) {
    	this.nickname = nickname
    }
}

 자바로 개발하다보면 인스턴스의 멤버 변수 값을 가져오고 바꾸기 위해 Getter와 Setter를 사용한다. Getter와 Setter는 멤버 변수 각각에 대응하기 때문에 위와 같이 멤버 변수가 추가될 때 마다 코드 길이가 길어지는 단점이 있다.

// lombok 적용 후

@Getter
@Setter
public class User{
    private Long seq;
    private String email;
    private String password;
    private String nickname;
}

이런 경우 위와 같이 해당 객체 클래스 위에 @Getter, @Setter 어노테이션을 추가하여 간단히 Getter, Setter 메서드를 사용할 수 있다.

 

@NoArgsConstructor, @AllArgsConstructor

// lombok 적용 전

public class User{
    private Long seq;
    private String email;
    private String password;
    private String nickname;
    
    public User() {}
    
    public User(Long seq, String email, String password, String nickname) {
    	this.seq = seq;
        this.email = email;
        this.password = password;
        this.nickname = nickname;
    }
}

자바는 클래스 내 생성자가 없으면 기본 생성자를 만들어준다. 하지만 위와 같이 기본 생성자 외의 생성자가 있는 경우 기본 생성자를 사용하기 위해서는 따로 선언해주어야 한다. 이럴 때 @NoArgsConstructor를 사용할 수 있다.

또한 모든 멤버 변수를 파라미터로 가지는 생성자를 만들어야 하는 경우가 있는데, 이럴 때 @AllArgsConstructor를 사용할 수 있다.

// lombok 적용 후

@NoArgsConstructor
@AllArgsConstructor
public class User{
    private Long seq;
    private String email;
    private String password;
    private String nickname;
}

 

@RequiredArgsConstructor

// lombok 적용 후

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;
}

 @RequiredArgsConstructor는 어노테이션이 초기화 되지않은 final 필드나, @NonNull이 붙은 필드에 대해 생성자를 생성해준다. 주로 위와 같이 생성자로 의존성 주입을 할 때 사용된다.

 

@ToString

// lombok 적용 전

public class User{
    private Long seq;
    private String email;
    private String password;
    private String nickname;
    
    @Override
    public String toString() {
        return "User{" +
                "seq=" + seq +
                ", email='" + email + '\'' +
                ", password='" + password + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}

toString은 어떤 객체를 설명하는 문자열을 리턴한다. 위와 같이 Override를 통해 toString을 사용하면 필드의 개수가 많아질 수록 내부 코드가 길어지는 문제가 있다.

// lombok 적용 후

@ToString(exclude = "password")
public class User{
    private Long seq;
    private String email;
    private String password;
    private String nickname;
}

위와 같이 활용할 수 있으며, exclude 옵션을 주어 특정 필드를 제외시킨 문자열을 리턴할 수도 있다.

 

@EqualsAndHashCode

// lombok 적용 전

public class User{
    private Long seq;
    private String email;
    private String password;
    private String nickname;
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(seq, user.seq) 
        	&& Objects.equals(email, user.email) 
       	 	&& Objects.equals(password, user.password) 
        	&& Objects.equals(nickname, user.nickname));
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(seq, email, password, nickname);
    }
}

우리는 동등성 비교가 필요할 때 equals and hashCode를 재정의하여 사용한다. 위와 같이 Override를 통해 equals and hashCode을 사용하면 필드의 개수가 많아질수록 내부 코드가 길어지는 문제가 있다.

// lombok 적용 후

@EqualsAndHashCode(exclude = "password")
public class User{
    private Long seq;
    private String email;
    private String password;
    private String nickname;
}

위와 같이 활용할 수 있으며 exclude 옵션을 주어 특정 필드를 제외시킨 값에 대한 동등성 비교를 할 수 있다.

댓글