티스토리 뷰

728x90
반응형

 

 


스프링 부트 쇼핑몰 프로젝트 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했습니다.

https://start.spring.io

 

 

 

 

 

 

 

반응형

 

 

 

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
}

 

 

 

728x90

 

 

이제 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 설계하기

 

[SpringBoot + JPA] tutorial: 스프링 부트 쇼핑몰 프로젝트 with JPA -5. Repository 설계하기

스프링 부트 쇼핑몰 프로젝트 with JPA 라는 책을 읽으며 정리한 내용입니다, 이미 스프링부트로는 개발을 많이 해보았으나 JPA를 공부하기 위해 이 책을 골랐습니다.     이전

domdom.tistory.com

 

 

728x90
반응형
댓글