상세 컨텐츠

본문 제목

Entity 클래스

개인 공부/Spring-boot,Java

by 카페코더 2020. 6. 22. 17:17

본문

반응형

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();
}

 

Setter가 없는 이 상황에서 어떻게 값을 채워 DB에 삽입하는가?

기본적인 구조는 생성자를 통해 최종값을 채운 후, 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();

 

반응형

'개인 공부 > Spring-boot,Java' 카테고리의 다른 글

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

관련글 더보기

GitHub 댓글

댓글 영역