본문 바로가기

🌈 Spring Framework/🌱 Spring-boot

Lombok 사용시 주의사항

Lombok 이란?

자바 컴파일 시점에서 특정 annotation을 추가하여 코드의 가독성 및 유지보수에 도움을 주는 라이버리입니다. 

웹 애플리케이션에서 VO 객체, getter setter 반복적으로 사용되는 코드를 수정이 편리하도록 자동 처리해 주는 역할을 합니다. 

좋고 편리한 애노테이션을 많이 가지고 있지만 잘못 사용할 수 있기 때문에 잘 알고 사용해야 합니다. 

 

🚫 @Data  애노테이션 

: @Data = @ToString + @EqualAndHashCode + @Getter + @Setter + @RequiredArgsConstructor  

 의 조합입니다. 

위의 중요한 애노테이션을 한 번에 사용하는 만큼 conflict 가 생기는 부분이 많아

실무에서는 사용을 추천하지 않는 롬복의 기능 중 하나입니다.

 

@Entity
@Table(name = "member")
@ToString(exclude = "coupons")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EqualsAndHashCode(of = {"id", "email"})
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
}

✔️  @NoArgsConstructor

: JPA에서 프락시 생성을 위한 기본 생성자의 접근 권한 설정 (public /  private / protected ) 

  테스트를 위해 임시로 public 설정하지 않는 한 굳이 외부에서 접근 가능하도록 생성할 필요가 없습니다. 

  접근이 protected  쓰는 것이 주로 디폴트입니다. 

 

나머지 상세한 각 애노테이션에 대한 정보는 아래 링크에서 확인해 볼 수 있습니다. 

www.notion.so/ssunsoolzip/Lombok-5dd828ee2baa4a6e81a11dcf18f952e9

 

Lombok 이란?

🌶️ Lombok 이란 ?

www.notion.so

 🚫 Lombok 사용 시 주의 사항 

 

1. 무분별한 @Setter 남용 

: setter 메서드는 의도를 갖기 힘들고 언제든 변경될 수 있는 객체이기 때문에 안전성을 보장받기 어렵습니다. 

  ex. 변경되지 않는 값(정보)에 대한 부분은 setter이 제공되지 않는 것이 안전합니다.

 

*  setter 이용하지 않고 update 하는 방법

: 회원 정보를 변경하기 위한 나열을 위해 setter을 이용하기 때문에 메서드들의 의도가 명확하지가 않다. 

public User updateUser(long id) {

    User userUpdate = findById(id);
    
    userUpdate.setPassword("value");
    userUpdate.setPhoneNumber("value");
 }
 

 

* 메서드를 이용한 업데이트 

:updateUser() 메소드를 통해서 회원 정보 업데이트를 하여 의도가 명확해졌습니다. 

 - 회원 정보 수정에 필요한 변경될 값들은 DTO를 두어 명세를 하는 것이 좋습니다. 

public User updateUser(long id, UserDTO userDto) {
    User user = findById(id);
    user.updateUser(userDto);
    return user;
}

public void updateUser(UserDTO userDto) {
    this.password = userDto.getPassword();
    this.phoneNumber = userDto.getPhoneNumber();
}

 

2. @ToString으로 순환 참조 문제 (양방향 연관관계) 

: 양방향 연관관계를 가질 경우 ToString을 호출하게 되면 무한 순한 참조가 발생합니다.

  그러면 Json으로 직렬 화하는 과정에서 발생하는 문제가 생깁니다. 

  이러한 문제들 때문에 무분별한 @Getter 남용보다는

  최대한 객체를 캡슐화하여 해당 객체가 그 기능을 제공할 수 있도록 하는 것이 좋습니다. 

@ToString(exclude = "orderGroup")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    //User 1 : N OrderGroup
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    private List<OrderGroup> orderGroupList;
}


@ToString(exclude = "user")
public class OrderGroup {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // OrderGroup N : 1 User
    @ManyToOne
    private User user;
}

'🌈 Spring Framework > 🌱 Spring-boot' 카테고리의 다른 글

Validator - BindingResult  (0) 2021.02.27
@SpringBootApplication  (0) 2021.02.18
IoC - ApplicationContext / Bean  (0) 2021.02.18