본문 바로가기
Programming/Spring JPA

[스프링부트와 AWS로 혼자 구현하는 웹서비스] Entity 클래스

by 깐니 2020. 7. 23.
@Getter
@NoArgsConstructor
@Entity
public class ArtItem extends BaseTimeEntity {

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

  @ManyToOne(targetEntity = Member.class, fetch = FetchType.EAGER)
  @JoinColumn(name="artist", nullable = false)
  private Member member;

  @Column(length = 500, nullable = false)
  private String title;

  @Column(columnDefinition = "TEXT", nullable = false)
  private String description;

  private int price;

  @Builder
  public ArtItem (final Member member,
                  final String title,
                  final String description,
                  final int price) {
	this.member = member;
    	this.title = title;
   	this.description = description;
    	this.price = price;
	}
    
}



}

 

Entity의 PK는 Long 타입의 Auto_increment를 추천하는 이유는 ? (MySQL 기준, bigint타입)

주민등록번호와 같이 비즈니스상 유니크 키, 여러 키를 조합한 복합키로 PK를 잡을 경우 난감한 상황이 종종 발생함.

 

(1) FK를 맺을 때, 다른 테이블에서 복합키 전부를 가지고 있거나, 중간 테이블을 하나 더 둬야하는 상황이 발생함.

(2) 인덱스에 좋은 영향을 끼치지 못함.

(3) 유니크한 조건이 변경될 경우 PK 전체를 수정해야 하는 일이 발생함.

     주민등록번호, 복합키 등은 유니크 키로 별도로 추가하는 것이 좋음.

 

 

Entity 클래스에서는 Setter 메소드를 만들지 않는다.

Entity클래스는 데이터베이스와 맞닿은 핵심 클래스이다. Entity클래스를 기준으로 테이블이 생성되고, 스키마가 변경되기 때문이다.

해당 필드의 값 변경이 필요하면, 그 목적과 의도를 나타낼 수 있는 메소드를 추가하여 사용한다.

그렇다면 Setter없이 어떻게 값을 채워 DB에 삽입할까?

 

*방법

(1) 생성자를 사용한다.

(2) @Builder를 통해 제공되는 빌더 클래스를 사용한다.

 

 

JpaRepository 생성

Entity 클래스로 데이터베이스에 접근하게 한다.

인터페이스로, JpaRepository <Entity 클래스, PK 타입>을 상속시키면, 기본적인 CRUD 메소드가 자동 생성된다.

 

Entity클래스와 기본 Entity Repository는 함께 위치해야한다.

왜?

Entity 클래스는 기본 Repository 없이는 제대로 역할을 할 수 없다.

따라서 domain 패키지에서 함께 관리한다.

 

 

 

Reference

📘스프링부트와 AWS로 혼자 구현하는 웹서비스