개요
- 실무에서 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