@Data
= @Getter
, @Setter
, @RequiredArgsConstructor
, @ToString
, @EqualsAndHashCode
를 한번에 설정해주는 편리한 어노테이션이다.
@Data
public class User{
}
그렇다면 Data를 이루는 어노테이션들이 어떤 역할을 하는지 하나하나 정리해보겠다.
이 둘은 각각 접근자와 설정자를 자동으로 생성해주는 어노테이션이다. 예를 들어 name
이라는 변수를 선언하면 자동으로 getName()
(boolean 타입이면 isName()
), setName()
메소드를 생성해준다.
@Getter
@Setter
class User{
public String name
}
예시는 클래스 레벨에 어노테이션을 붙였다. 이렇게 되면 모든 필드에 접근자와 설정자가 자동으로 선언된다.
만약 필드 레벨에 어노테이션을 붙여주면 해당 필드에 대한 접근자와 설정자가 선언된다.
user.setName("juzoo");
String name = user.getName();
이 셋도 정말 자주 사용하는 어노테이션이다. 셋 모두 생성자를 자동으로 생성해주는 어노테이션인데, 어떤 변수를 생성해주냐가 다른 점이다.
1. @NoArgsConstructor
: 파라미터가 없는 기본 생성자
2. @AllArgsConstructor
: 모든 필드값을 파라미터로 받는 생성자
3. @RequiredArgsConstructor
: final이나 @NotNull인 필드값만 파라미터로 받는 생성자
여기서 특히 RequiredArgsConstructor는 등록된 bean을 생성자로 주입받을 때 너무너무너무너무! 유용하게 사용한다.
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
public class User{
private String name;
@NotNull
private String id;
@NotNull
private String password;
}
User user1 = new User(); // no args constructor
User user2 = new User(name, id, password); // All args constructor
User user3 = new User(id, password); // Required args constructor
@ToString(exclude="password")
public class User{
private String name;
private String id;
private String password;
}
이렇게 @ToString
어노테이션을 붙이고 필드 세팅 후 출력하면
클래스명(필드1=값, 필드2=값)
으로 출력된다.
이때 exclude로 설정해준 값은 출력되지 않는다.
System.out.println(user);
>> User(name=juzoo, id=juzoo123)
두 객체의 값이 같은지 확인하는 equals
함수를 자동으로 생성해준다.
callSuper
를 사용하면 자동생성 시 부모 클래스의 필드까지 감안할지 여부도 설정할 수 있다.
@EqualsAndHashCode(callSuper = true)
public class User extends Domain {
private String username;
private String password;
}
User user1 = new User();
user1.setId(1L);
user1.setUsername("user");
user1.setPassword("pass");
User user2 = new User();
user1.setId(2L); // 부모 클래스의 필드가 다름
user2.setUsername("user");
user2.setPassword("pass");
user1.equals(user2);
// callSuper = true 이면 false, callSuper = false 이면 true
사실 @equalsAndHashCode
는 처음 알게 된 어노테이션인데 앞으로 잘 써먹을 수 있을 것 같다!!!