호비시의 끄적끄적

Lombok ? 본문

Back/Spring

Lombok ?

호비시 2022. 6. 28. 09:00

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 이므로 조심해서 사용하자.

 

참고문서 : https://lkhlkh23.tistory.com/159

'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