Jpa 어노테이션 @Entity를 기준으로 생성된 클래스에 대해 포스팅합니다.
참고 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (이동욱 지음, 출판사: 프리렉)
우선 설명의 기준이 될 Posts.java
package com.tistory.cafecoder.springboot.domain.posts;
import lombok.Builder;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@NoArgsConstructor
@Entity
public class Posts {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 500, nullable = false)
private String title;
@Column(columnDefinition = "TEXT", nullable = false)
private String content;
private String author;
@Builder
public Posts(String title, String content, String author) {
this.title = title;
this.content = content;
this.author = author;
}
}
위의 Posts 클래스에서 살펴보면, Setter 메소드가 없다는 특이점이 있다.
자바빈 규약을 생각하며 getter/setter를 무작정 생성하는 경우가 있는데, 이 경우 해당 클래스의 인스턴스 값들이 언제 어디서 변해야 하는지 코드상으로 명확하게 구분할 수 없어, 차후 기능 변경시 정말 복잡해진다.
그래서 Entity 클래스에서는 절대 Setter 메소드를 만들지 않는다.
대신 해당 필드의 값 변경이 필요하다면, 명확히 그 목적과 의도를 나타낼 수 있는 메소드를 추가해야만 한다.
옳지 못한 예:
public class Order{
public void setStatus(boolean status) {
this.status = status;
}
}
public void 주문서비스의_취소이벤트() {
order.setStatus(false);
}
올바른 예:
public class Order{
public void cancelOrder() {
this.status = false;
}
}
public void 주문서비스의_취소이벤트() {
order.cancelOrder();
}
기본적인 구조는 생성자를 통해 최종값을 채운 후, DB에 삽입하는 것 이며, 값 변경이 필요한 경우 해당 이벤트에 맞는 public 메소드를 호출하여 변경하는 것을 전제로 한다.
위의 Posts클래스의 경우, 생성자 없이 @Builder를 통해 제공되는 빌더 클래스를 사용하는데, 생성자나 빌더나 생성 시점에 값을 채워주는 역할은 같다.
다만, 생성자의 경우 지금 채워야 할 필드가 무엇인지 명확히 지정할 수 없다.
예를 들어, 다음과 같은 생성자가 있다고 해보자.
public Example(String a, String b) {
this.a = a;
this.b = b;
}
위의 경우, a와 b의 위치를 변경해도 코드를 실행하기 전 까지는 문제를 찾을 수 없다.
하지만 builder를 사용하면, 어느 필드에 어떤 값을 채워야 할지 명확하게 구분이 가능하다.
Example.builder()
.a(a)
.b(b)
.build();
LocalDate와 LocalDateTime (0) | 2020.06.23 |
---|---|
Spring web layer (0) | 2020.06.23 |
lombok을 사용하는 이유 (0) | 2020.06.22 |
Gradle 의존성 정리 (0) | 2020.06.22 |
lombok 설치 (0) | 2020.06.21 |