본문 바로가기
게시판 만들기(Spring Boot, JPA)

게시판 만들기 01 - 게시글 Entity 만들기

by burpee 2022. 11. 30.

프로젝트 만들기

먼저 스프링 부트를 이용해서 프로젝트를 생성해 준다. 필요한 의존성들을 추가해 주고 application.yml에서 프로젝트 설정을 해준다. 나는 데이터베이스는 MySQL을 사용할 예정이어서 관련된 설정들을 추가했고 JPA 관련 설정도 해두었다.

Post 엔티티 만들기

게시글 CRUD 기능을 구현하려면 게시글에 해당하는 Entity를 정의해야 한다. Post Entity를 만들어보자.

보통 Entity나 Class에 붙이는 어노테이션들이 있다. 예를 들면, @Getter, @Setter, @AllArgsConstructor, @NoArgsConstructor, @Data, @ToString, @Builder, @Entity 등이 있겠다. 취업하기 전에 간단하게 JPA를 맛만 본 후에 취업 후, 회사에서 JPA를 사용하는 중인데 Entity에 저런 어노테이션들이 엄청 많이 붙어있었다. 뭔가 좀 이상하다 싶어서 검색을 해보니 Entity를 안정적으로 정의할 수 있는 예제들이 있었다. 그 예제들을 참고해서 Post Entity를 생성해 봤다.

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Post {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long postId;

    @Column(length = 200)
    private String title;

    @Column(columnDefinition = "TEXT")
    private String content;

    @CreatedDate
    private LocalDateTime createdDate;

    @Builder
    public Post(String title, String content, LocalDateTime createdDate) {
        this.title = title;
        this.content = content;
        this.createdDate = createdDate;
    }
}

위와 같이 Entity를 생성한 이유를 간단하게 써봐야겠다. Entity를 정의할 때 주의해야 할 점이 몇 개 있다고 한다.

 

1. @Setter 사용을 고민해 보자.

Setter를 사용하게 되면 객체를 생성하고 초기화할 때(Create) 사용하는지, 아니면 수정할 때(Update) 사용하는지 분명히 알기 어렵다. 그리고 public 접근자인 Setter 메서드는 어디서든지 호출될 수 있으므로 Entity가 어디서 수정되었는지 파악하기 힘들다. 또한 수정하기 전에 데이터 검증이 필요할 때 이를 무시할 수 있기 때문에 Setter 사용은 지양하는 게 안전하다고 한다. 만약 데이터 수정이 필요하다면 Setter 보다 의미 있는 메서드를 따로 추가하는 게 좋다.

 

2. 기본 생성자의 접근 제어자는 protected로 해보자.(@NoArgsConstructor(access = AccessLevel.PROTECTED))

JPA 표준 스펙에 Entity는 반드시 파라미터가 없는 생성자가 있어야 하고, 이는 public 또는 protected여야 한다.라는 내용이 있다고 한다. 표준 스펙이니까 그냥 지켜야지~라고 생각해도 되겠지만, 이유를 좀 알아보자.

먼저 기본 생성자가 있어야 하는 이유는 만약 GET 요청으로 Repository를 통해 Entity를 조회하면, 인스턴스를 만들 때 기본생성자를 사용하기 때문이다. 이때 기본 생성자가 없다면 에러가 생긴다. 두 번째, 접근 제어자가 protected를 권장하는 이유는 일단 무분별한 객체 생성을 막을 수 있다. 다음으로는 Entity 연관 관계가 생기고 지연 로딩을 사용할 때 쓰이는 Proxy 객체 때문이다. 이건 나중에 따로 포스팅을 해야겠다... 일단 여기까지.

 

3. @Builder를 사용해 보자.

빌더 패턴을 사용하면 좋은 점이 있다. 첫 번째, 생성자에 파라미터가 많아지면 가독성이 떨어지는데 빌더 패턴으로 가독성을 개선할 수 있다. 

Before

Box box = new Box("box1", 20, 10, 10, true);

After

Box box = Box.builder()
                .name("box1")
                .width(20)
                .depth(10)
                .height(10)
                .isEmpty(true)
                .build();

두 번째, 파라미터 순서를 생각하지 않아도 된다. 생성자는 파라미터의 순서를 생각하며 변수들을 넣어줘야 하지만, 빌더를 사용한다면 파라미터 순서에 상관없이 객체를 생성할 수 있다.

 

앞으로도 Entity를 만들 때 이런 주의사항들을 생각하고 만들면 좋을 것 같다.

 

2022.11.25 - [게시판 만들기(Spring Boot, JPA)] - 게시판 만들기 하는 이유

댓글