모르지 않다는 것은 아는것과 다르다.

Other

Lombok 사용시 주의할 점

채마스 2022. 2. 28. 19:50

개요

  • 실무에서 Lombok 사용시 주의할 점들을 정리해 보고자 한다.



@Setter 를 지양하자

  • 도메인 객체들에게 @Setter 를 사용하는 건 바람직하지 못하다.
  • Setter 와 같이 데이터에 변경이 일어나는 메소드는 그에 합당한 명분이 필요하다.
  • 그렇기 때문에 그에 합당한 메소드명을 명명해서 메소드의 의도를 정확히 표현하는 것이 바람직하다.
  • 당연하겠지만, @Setter 를 포함하고 있는 @Data 도 지양하는 것이 바람직하다.
  • 객체를 생성하고 싶을때에는 아래와 빌더패턴을 적용하는 것이 바람직하다.



ToString 의 순환참조를 주의하다.

  • 양방향 연관관계시 순환 참조로 인해서 문제가 발생한다.
  • 아래와 같이 ToString 항목을 제외시킴으로써 해결할 수 있다.
@ToString(exclude = "members")
public class Team {
    //... 이하 생략

    @OneToMany
    @JoinColumn(name = "member_id")
    private List<Member> members = new ArrayList<>();
}



@NoArgsConstructor 의 접근 권한을 최소화 하자

  • JPA에서는 프록시를 생성을 위해서 기본 생성자를 반드시 하나를 생성해야한다.
  • 이 경우 접근 권한이 protected 면 충분하다. -> 엔티티 생성에 안정성을 보장하기 위해서다.
  • 아래와 같이 생성자에 @Builder 를 열어 두는 것이 바람직하다.
@Entity
@Table(name = "member")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED) 
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;
    private String name;

    @Builder
    public Member(String name) {
        this.name = name;
    }
}
  • 이렇게 설정하면 외부에서 아래와 같은 코드는 발생하지 않는다.
Member member = new Mameber(); // name 은 null 이면 안된다.
  • name 이 null 이면 안되는 상황에서 실수를 null 이 들어가는 것을 막아준다.



@AllArgsConstructor 를 지양하자

  • Member 엔티티는 Id 생성 전략을 auto_increment 로 설정했다.
  • 그렇기 때문에 id 를 넘겨 받으면 안된다. -> 하지만 @AllArgsConstructor 로 설정할 경우, 개발자가 실수로 라도 Id 값을 설정할 수 있다.
  • Id 뿐 아니라 로직상 엔티티가 생성할때, 자동으로 데이터가 들어가는 필드값도 존재할 수 있기때문에 지양하는 것이 좋다.
  • 아래와 같이 클래스 상단에 @Builder 를 붙이는것도, @AllArgsConstructor 와 같은 역할을 하기 때문에 지양하는 것이 좋다.
@Entity
@Table(name = "member")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED) 
@Builder
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;
    private String name;

    public Member(String name) {
        this.name = name;
    }
}
  • 이 코드 또한 아래와 같이 클래스 상단에 붙은 @Bulider 를 제거하고, 생성자에 @Builder 를 설정하는 것이 바람직하다.
  • 아래와 같이 클래스 상단에 @Builder 를 붙이는것도, @AllArgsConstructor 와 같은 역할을 하기 때문에 지양하는 것이 좋다.
@Entity
@Table(name = "member")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED) 
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;
    private String name;

    @Builder
    public Member(String name) {
        this.name = name;
    }
}




REFERENCES

'Other' 카테고리의 다른 글

gradle 파일 이해하기  (0) 2022.06.11
SpringBoot Properties  (0) 2022.03.24
intellij 단축키  (0) 2022.03.14
JDK, JRE, SDK, JavaSE, JavaME, JavaEE 정리  (0) 2022.02.28
java (Spring)로 Shell Script 실행 하기  (0) 2022.02.28