호비시의 끄적끄적
Lombok ? 본문
Lombok 이란
Lombok 은 자바개발자에게 매우 중요한 프레임워크이다. 자바에서 자주 만들어 사용하는 getter, setter, 생성자 등 을 annotation 하나로 자동으로 만들어주는 편리한 친구다.
하지만 hibernate Entity를 사용할 때에는 주의할 점이 있다.
@...Constructor
Lombok은 Annotation 하나만으로 클래스에 필수적인 생성자를 자동으로 생성해준다.
public class User1 {
private String name;
private String team;
private int age
public User1(String name, String team, int age){
this.name = name;
this.team = team;
this.age = age;
}
}
@AllArgsConstructor
public class User2 {
private String name;
private String team;
private int age
}
@Test
void test(){
User1 user1 = new User1("name", "team", 11);
User2 user2 = new User2("name", "team", 11);
asssertThat(user1.getTeam()).isEqualTo("team"); //통과
asssertThat(user2.getTeam()).isEqualTo("team"); //실패
}
user2의 team이 "team"이어야 하지만, Lombok에 의해 parameter 순서가 바뀐다. 이름과 팀은 타입이 같은 문자열이기 때문에 컴파일러에서 문제를 알아차리지 못한다. 그렇기 때문에 필드와 주입할 값의 매핑이 원할하도록 Builder를 사용하는 것이 권장된다.
@Builder
@Builder
@RequiredArgsConstructor
@Getter
public class User {
private final String name;
private final String team;
private final int age
}
@Test
void test(){
User user1 = new User("name", "team", 34);
User user2 = User.builder()
.name("name")
.team("team")
.build();
}
builder를 이용하면 훨씬 간결하게 짤 수 있다. 하지만 builder는 내가 만드려는 User의 age값을 안넣어도 알려주지 않는다.
@EqualsAndHashCode
@EqualsAndHashCode
public static class Book {
private Long bookId;
private long price;
private String author;
public Book(Long bookId, long price, String author) {
this.bookId = bookId;
this.price = price;
this.author = author;
}
}
Book book = new Book(5L, 8000L, "작성자");
Set<Book> bookSet = new HashSet<>();
bookSet.add(book);
System.out.println("변경전 : " + bookSet.contains(book));
// true
book.setPrice(99999L);
System.out.println("변경후 : " + bookSet.contains(book));
// false
위처럼 동일한 객체임에도 불구하고 Set에 저장된 뒤에 필드 값이 변경된다면 hashCode가 변경되면서 찾을 수 가 없다.
변경가능한 필드에 @EqualsAndHashCode 를 남발하지 말자.
따라서
- 불변 객체를 제외하고는 @EqualsAndHashCode를 사용하지 말자.
- 항상 @EqualsAndHashCode(of = {"필드명"}) 형태로 사용하자.
- @Data = @NoArgsConstructor + @Getter + @Setter + @ToString + @EqualsAndHashCode 이므로 조심해서 사용하자.
'Back > Spring' 카테고리의 다른 글
Spring Security (0) | 2022.07.10 |
---|---|
Stream (0) | 2022.07.03 |
POJO 란? (0) | 2022.06.23 |
Spring WebFlux (0) | 2022.06.22 |
JVM (0) | 2022.06.21 |
Comments