상품 엔티티 설계하기

개발자·2021년 11월 30일
0
post-thumbnail

엔티티란 데이터베이스의 테이블에 대응하는 클래스라고 생각하면 된다. @Entity가 붙은 클래스는 JPA에서 관리하며 엔티티라고 한다. 상품 엔티티를 만들기 위해서는 상품 테이블에 어떤 데이터가 저장되어야 할지 설계를 해야한다. Lombok의 어노테이션을 이용한다면 getter, setter, toString 등을 자동으로 만들어 주기 때문에 코드를 깔끔하게 짤 수 있다.

상품의 엔티티와 관련된 클래스들은 entity 패키지에 저장을 하고, constant 패키지에는 enum 타입을 모아둔다. 상품이 현재 판매 중인지 품절 상태인지를 나타내는 enum 타입의 클래스이다. enum 클래스를 사용하면 연관된 상수들을 모아둘 수 있으며 enum에 정의한 타입만 값을 가지도록 컴파일 시 체크할 수 있다는 장점이 있다.

CLOB과 BLOB의 의미

CLOB이란 사이즈가 큰 데이터를 외부 파일로 저장하기 위한 데이터 타입이다. 문자형 대용량 파일을 저장하는데 사용하는 데이터 타입이라고 생각하면 된다.

BLOB은 0과 1로 이루어진 바이너리 데이터를 DB 외부에 저장하기 위한 타입이다. 이미지, 사운드, 비디오 같은 멀티미디어 데이터를 다룰 때 사용할 수 있다.

@Column 속성

테이블을 생성할 때 컬럼에는 다양한 조건들이 들어간다. 예를 들면 문자열을 저장하는 VARCHAR 타입은 길이를 설정할 수 있고, 테이블에 데이터를 넣을 때 데이터가 항상 존재해야 하는 Not Null 조건 등이 있다. @Column 어노테이션의 속성을 이용하면 테이블에 매핑되는 컬럼의 이름, 문자열의 최대 저장 길이 등 다양한 제약 조건들을 추가할 수 있다.

속성설명기본값
name필드와 매핑할 컬럼의 이름 설정객체의 필드 이름
unique(DDL)유니크 제약 조건 설정
insertableinsert 가능 여부true
updatableupdate 가능 여부true
lengthString 타입의 문자 길이 제약조건 설정255
nullable(DDL)null 값의 허용 여부 설정, false 설정 시 DDL 생성 시에 not null 제약조건 추가
columnDefinition데이터베이스 컬럼 정보 직접 기술
precision, scale(DDL)BigDecimal 타입에서 사용(BigInteger 가능) precision은 소수점을 포함한 전체 자리수이고, scale은 소수점 자리수, Double과 float 타입에는 적용되지 않음.

DDL의 의미

DDL(Data Definition Language)이란 테이블, 스키마, 인덱스, 뷰, 도메인을 정의, 변경, 제거 할 때 사용하는 언어이다. 가령, 테이블을 생성하거나 삭제하는 CREATE, DROP 등이 이에 해당한다.

@Entity 어노테이션은 클래스의 상단에 입력하면 JPA에 엔티티 클래스라는 것을 알려준다. Entity 클래스는 반드시 기본키를 가져야 한다. @Id 어노테이션을 이용하여 id 멤버 변수를 상품 테이블의 기본키로 설정한다. @GeneratedValue 어노테이션을 통한 기본키를 생성하는 전략은 총 4가지가 있다.

전략이라는 단어가 조금 이해가 가지 않을 수도 있다. 전략은 기본키를 생성하는 방법이라고 이해하면 된다. MySQL에서 AUTO_INCREMENT를 이용해 데이터베이스에 INSERT 쿼리문을 보내면 자동으로 기본키 값을 증가시킬 수 있다. 오라클의 기본키를 생성해주는 Sequence의 경우 기본키의 초기값, 증가값, 최대값, 최솟값을 지정할 수 있따. 이렇게 기본키를 생성하는 다양한 방법을 JPA에서 지정해 줄 수 있다.

생성 전략설명
GenerationType.AUTO(default)JPA 구현체가 자동으로 생성 전략 결정
GenerationType.IDENTITY기본키 생성을 데이터베이스에 위임
GenerationType.SEQUENCE데이터베이스 시퀀스 오브젝트를 이용한 기본키 생성
GenerationType.TABLE키 생성용 테이블 사용. @TableGenerator 필요

기본키와 데이터베이스 시퀀스 오브젝트의 의미

기본키(primary key)는 데이터베이스에서 조건을 만족하는 튜플을 찾을 때 다른 튜플들과 유일하게 구별할 수 있도록 기준을 세워주는 속성이다. 예를 들어 상품 데이터를 찾을 때 상품의 id를 통해서 다른 상품들과 구별할 수 있다. 여기서 기본키는 id이다.

데이터베이스 시퀀스 오브젝트에서 시퀀스란 순차적으로 증가하는 값을 반환해주는 데이터베이스 객체이다. 보통 기본키의 중복값을 방지하기 위해서 사용한다.

4가지 생성 전략 중에서 @GenerationType.AUTO를 사용해서 기본키를 생성할 수 있다. 데이터베이스에 의존하지 않고 기본키를 할당하는 방법으로, JPA 구현체가 IDENTITY, SEQUENCE, TABLE 생성 전략 중 하나를 자동으로 선택한다. 따라서 데이터베이스가 변경되더라도 코드를 수정할 필요가 없다.

package com.shop.entity;

import com.shop.constant.ItemSellStatus;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
@Table(name="item")
@Getter
@Setter
@ToString
public class Item {
    @Id
    @Column(name = "item_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id; //상품 코드

    @Column(nullable = false, length = 50)
    private String itemNm; //상품명

    @Column(name = "price", nullable = false)
    private int price; //가격

    @Column(nullable = false)
    private int stockNumber; //재고수량

    @Lob
    @Column(nullable = false)
    private String itemDetail; //상품 상세 설명

    @Enumerated(EnumType.STRING)
    private ItemSellStatus itemSellStatus; //상품 판매 상태

    private LocalDateTime regTime; //등록시간

    private LocalDateTime updateTime; //수정 시간

}
  1. Item 클래스를 entity로 선언한다. 또한 @Table 어노테이션을 통해 어떤 테이블과 매핑될지를 지정한다. item 테이블과 매핑되도록 name을 item으로 지정한다.
  2. entity로 선언한 클래스는 반드시 기본키를 가져야한다. 기본키가 되는 멤머변수에 @id 어노테이션을 붙여준다. 그리고 테이블에 매핑될 컬럼의 이름을 @Column 어노테이션을 통해 설정해준다. item 클래스의 id 변수와 item 테이블의 item_id 컬럼이 매핑되도록 한다. 마지막으로 @GeneratedValue 어노테이션을 통해 기본키 생성 전략을 AUTO로 지정한다.
  3. @Column 어노테이션의 nullable 속성을 이용해서 항상 값이 있어야 하는 필드는 not null 설정을 한다. String 필드는 default 값으로 255가 설정되어 있다. 각 String 필드마다 필요한 길이를 length 속성에 default 값을 세팅한다.
해당 게시글은 변구훈, 『스프링 부트 쇼핑몰 프로젝트 with JPA』, 로드북, 2021를 참고하여 작성하였습니다.
profile
I DEVELOP THEREFORE, I AM 😄

0개의 댓글