티스토리 뷰
[SpringBoot + JPA] tutorial: 스프링 부트 쇼핑몰 프로젝트 with JPA -4. Entity 설계하기
돔돔이 2024. 7. 6. 00:00
스프링 부트 쇼핑몰 프로젝트 with JPA 라는 책을 읽으며 정리한 내용입니다,
이미 스프링부트로는 개발을 많이 해보았으나 JPA를 공부하기 위해 이 책을 골랐습니다.
이전 포스트를 보려면 아래 링크를 클릭하세요.
[SpringBoot + JPA] tutorial: 스프링 부트 쇼핑몰 프로젝트 with JPA -1. 애플리케이션 생성 및 설정하기
[SpringBoot + JPA] tutorial: 스프링 부트 쇼핑몰 프로젝트 with JPA -2. Controller, DTO(lombok)
[SpringBoot + JPA] tutorial: 스프링 부트 쇼핑몰 프로젝트 with JPA -3. JPA
쇼핑몰 프로젝트는 start.spring.io에서 아래와 같이 설정하여 generate했습니다.
application.properties에 아래와 같이 설정정보를 입력해줍니다.
spring.application.name=shop
# 포트 : 80
server.port=80
# DB정보
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/shop?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=1234
# 실행되는 쿼리 콘솔 출력
spring.jpa.properties.hibernate.show_sql=true
# 콘솔창에 출력되는 쿼리를 가독성이 좋게 포맷팅
spring.jpa.properties.hibernateformat_sql=true
# 쿼리에 물음표로 출력되는 바인드 파라미터 출력
logging.level.org.hibernate.type.descriptor.sql=trace
# 데이터베이스 초기화 전략
'''
none : 사용하지 않음
create : 기존 테이블 삭제 후 테이블 생성
create-drop : 기존 테이블 삭제 후 테이블 생성, 종료 시점에 테이블 삭제
update : 변경된 스키마 적용 // 컬럼 삭제는 엄청난 문제를 야기시킬 수 있으므로 '컬럼 추가'만 반영됨.
validate : 엔티티와 테이블 정상 매핑 확인 // validate 옵션을 사용하는 것이 좋음. 스테이징, 운영환경에서는 절대로 create, create-drop, update를 사용하면 안됨.
(스테이징환경 : 운영환경에 배포하기 전 여러 기능을 검증하는 환경으로, 운영환경과 거의 동일한 환경으로 구성됨.)
'''
spring.jpa.hibernate.ddl-auto=validate
# JPA에 mysql을 사용한다고 알려줌
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
com.shop 에 두 가지 패키지를 만들어주었습니다.
com.shop.entity : 엔티티들을 모아놓는 패키지
com.shop.constant : enum 타입을 모아놓는 패키지
entity에는 Item.java 파일을 생성하고,
constant에는 ItemSellStatus.java 파일을 생성합니다.
ItemSellStatus는 상품의 정보(현재 판매중인지, 품절상태인지 등)를 나타내는 enum 타입의 클래스입니다.
enum 클래스를 사용하면 연관된 상수들을 모아둘 수 있으며, enum에 정의한 타입만 값을 가지도록 컴파일 시 체크를 할 수 있다는 장점이 있습니다.
package com.shop.constant;
public enum ItemSellStatus {
SELL, SOLD_OUT
}
이제 Item 클래스가 가지고 있어야할 상품의 정보 변수들을 선언해줍니다.
package com.shop.entity;
import com.shop.constant.ItemSellStatus;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.time.LocalDateTime;
@Getter
@Setter
@ToString
public class Item {
private Long id; // 상품코드
private String itemNm; // 상품명
private int price; // 가격
private int stockNumber; // 재고수량
private String itemDetail; // 상품 상세설명
private ItemSellStatus itemSellStatus; // 상품 판매 상태
private LocalDateTime regTime; // 등록시간
private LocalDateTime updateTIme; // 수정시간
}
이제 Item 클래스를 엔티티로 매핑하기 위해서 관련된 어노테이션들을 설정해줘야 합니다.
엔티티 매핑 관련 어노테이션
어노테이션 | 설명 |
@Entity | 클래스를 엔티티로 선언 |
@Table | 엔티티와 매핑할 테이블을 지정 ( 테이블명과 클래스명이 동일하면 지정하지 않아도 됩니다 ) |
@id | 테이블의 기본키에 사용할 속성을 지정 |
@generatedValue | 키 값을 생성하는 전략 명시 |
@Column | 필드와 컬럼 매핑 DB 컬럼의 상세조건들(Not Null,Data Type, ...)을 추가할 수 있습니다. 하지만 이는 DB에서 컬럼을 생성할 때 조건들을 이미 설정해놓으므로 코드에서는 잘 사용되지 않습니다. |
@Lob | BLOB, CLOB 타입 매핑 *BLOB: 바이너리 데이터를 DB 외부에 저장하기 위한 데이터 타입. 문자형 대용량 파일을 저장하는데 사용하는 데이터 타입이라고 생각하면 됩니다. *CLOB: 사이즈가 큰 데이터를 외부파일로 저장하기 위한 데이터 타입. 문자형 대용량 파일을 저장하는데 사용하는 데이터 타입이라고 생각하면 됩니다. |
@CreationTimestamp | insert 시 시간 자동 저장 |
@UpdateTimestamp | update 시 시간 자동 저장 |
@Enumerated | enum 타입 매핑 |
@Transient | 해당 필드 데이터베이스 매핑 무시 |
@Temporal | 날짜 타입 매핑 |
@CreateDate | 엔티티가 생성되어 저장될 때 시간 자동저장 |
@LastModifiedDate | 조회한 엔티티의 값을 변경할 때 시간 자동 저장 |
1. @Column 어노테이션 추가 속성
DB 컬럼의 상세조건들(Not Null,Data Type, ...)을 추가할 수 있습니다. 하지만 이는 DB에서 컬럼을 생성할 때 조건들을 이미 설정해놓으므로 코드에서는 잘 사용되지 않습니다.
속성 | 설명 |
name | 필드와 매핑할 컬럼의 이름 설정 |
unique(DDL) | 유니크 제약 조건 설정 |
insertable | insert 가능 여부 |
updateable | update 가능 여부 |
length | String 타입의 문자 길이 제약조건 설정 |
nullable(DDL) | null 값의 허용 여부 설정, false 설정 시 DDL 생성 시에 not null 제약조건 추가 |
columnDefinition | 데이터베이스 컬럼 정보 직접 기술 ex) @Column(columnDefinition = "varchar(5) default'10' not null |
precision, scale(DDL) | BigDecimal 타입에서 사용(BigInteger 가능) precision은 소수점을 포함한 전체 자리수이고, scale은 소수점 자리수, Double과 float 타입에는 적용되지 않음 |
2. @Entity 어노테이션 추가 속성
Entity 클래스는 반드시 기본키를 가져야 합니다. @Id 어노테이션을 이용하여 id 멤버 변수를 상품 테이블의 기본키로 설정합니다.
@GeneratedValue 어노테이션을 통한 기본키를 생성하는 전략은 총 4가지가 있습니다.
생성 전략 | 설명 |
GenerationType.AUTO (default) | JPA 구현체가 자동으로 생성 전략 결정 |
GenerationType.IDENTITY | 기본키 생성을 데이터베이스에 위임 ex) MySQL DB의 경우, AUTO_INCREMENT를 사용하여 기본키 생성 |
GenerationType.SEQUENCE | 데이터베이스 시퀀스 오브젝트를 이용한 기본키 생성 |
GenerationType.TABLE | 키 생성용 테이블 사용, @TableGenerator 필요 |
4가지 생성전략 중에서 GenerationType.AUTO를 사용해서 기본키를 생성하겠습니다.
데이터베이스에 의존하지 않고 기본키를 할당하는 방법으로, JPA 구현체가 IDENTITY, SEQUENCE, TABLE 생성전략 중 하나를 자동으로 선택합니다.
package com.shop.entity;
import com.shop.constant.ItemSellStatus;
import jakarta.persistence.Entity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
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; // 수정시간
}
다음 포스팅을 읽으려면 아래 링크를 눌러주세요.
[SpringBoot + JPA] tutorial: 스프링 부트 쇼핑몰 프로젝트 with JPA -5. Repository 설계하기