Spring boot & JPA

Spring Boot - 쇼핑몰 프로젝트 02 (Spring Data JPA - 1)

록's 2023. 4. 3. 14:17
728x90
반응형

JPA

 

1. JPA(Jave Persistence API’)는 자바 ORM 기술에 대한 API 표준

2. ORM이란 ‘Object Relational Mapping’의 약자로 객체와 관계형 데이터베이스 매핑

 

 

ORM 을 이용한 Java Object 와 관계형 데이터베이스 매핑

 

 

 

JPA 장점

  1. 특정 데이터베이스에 종속되지 않음
  2. 객체지향적으로 설계 가능
  3. 유지보수 유리 및 생산성 향상

 

JPA 단점

  1. 복잡한 쿼리 처리
  2. 성능 저하 위험
  3. 학습 시간

 

 

 

JPA 동작 방식

JPA 동작 방식

엔티티(Entity) : 데이터베이스의 테이블에 대응하는 클래스

@Entity가 붙은 클래스는 JPA에서 관리하며 엔티티라고 한다.

Item.java 클래스를 만들어서 @Entity 어노테이션을 붙이면 이 클래스가 엔티티가되어 진다.

 

엔티티 매니저 팩토리(Entity Manager Factory) : 엔티티 매니저 인스턴스를 관리하는 주체

애플리케이션 실행 시 한 개만 만들어지며 사용자로 부터 요청이 오면 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성한다

 

엔티티 매니저(Entity Manager) : 영속성 컨텍스트에 접근하여 엔티티에 대한 데이터 베이스 작업을 제공한다.

 

 

 

find() 메소드 : 영속성 컨텍스트에서 엔티티를 검색하고 영속성 컨텍스트에 없을 경우 데이터베이스에서 데이터를 찾앙 영속성 컨텍스트에 저장한다.

persist() 메소드 : 엔티티를 영속성 컨텍스트에 저장한다.

remove() 메소드 : 엔티티 클래스를 영속성 컨텍스트에서 삭제한다.

flush() 메소드 : 영속성 컨텍스트에 저장된 내용을 데이터베이스에 반영한다.

 

 

 

엔티티 생명주기

엔티티 생명주기

 

 

 

 

 

영속성 컨텍스트

  • 1차 캐시 : 영속성 컨텍스트에 Map<KEY, VALUE>로 저장. Find() 메소드 호출 시 영속성 컨텍스트의 1차 캐시 조회
  • 동일성 보장 : 하나의 트랜잭션에서  같은 키값으로 영속성 컨텍스트 조회 시 같은 엔티티 조회 보장 (1차 캐시)

 

 

  • 트랜잭션을 지원하는 쓰기 지연 : 쓰기 지연 SQL 저장소에 SQL을 쌓아두고 트랜 잭션 커밋 시점에 저장된 SQL 문 flush하여 데이터베이스 반영.
  • 변경 감지 : 1차 캐시에 데이터베이스에서 처음 불러온 엔티티의 스냅샷 저장. 및 커밋 시점에 변경 내용을 반영. 즉, update문을 호출하지 않아도 됨.

 


쇼핑몰 프로젝트 생성

https://start.spring.io

 

 

Project : Maven

Language : Java

Spring Boot : 2.7.10

 

ProjectMetadata

Group : com.shop

Artifact : shop

Name : shop

Description : Shop project for Spring Boot

Package name : com.shop

Packaging : Jar

Java : 11

 

Dependencies 추가

- Spring Web, Lombko, Thymeleaf, Spring Data JPA, MySQL Driver, H2 Database

 

 

 

 

설정 후 > GENERATE 클릭 > 다운로드 > c:\ SpringBootWork 파일 > 압축 풀기

 

ItalliJ 에서 OPEN > c:\SpringBootWork 클릭후 OK

 

 

 

프로젝트 생성되었으면

 

application.priperties 설정

 

#애플리케이션 포트 설정
server.port = 8080

#mySQL 연결 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://(ip주소):(포트번호)/shop?serverTimezone=UTC
spring.datasource.username= //@@@@ 아이디
spring.datasource.password= //@@@@ 비밀번호

#실행되는 쿼리 콘솔 출력
spring.jpa.properties.hibernate.show_sql=true

#콘솔창에 출력되는 쿼리를 가독성이 좋게 포맷팅
spring.jpa.properties.hibernate.format_sql=true

#쿼리에 물음표로 출력되는 바인트 파라미터 출력
logging.level.org.hibernate.type.descriptor.sql=trace

spring.jpa.hibernate.ddl-auto=create
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect

 

 

 

 


데이터베이스 초기화 전략 DDL AUTO 옵션

  • none: 사용하지 않음
  • create: 기존 테이블 삭제 후 테이블 생성
  • create-drop: 기존 테이블 삭제 후 테이블 생성. 종료 시점에 테이블 삭제
  • update: 변경된 스키마 적용
  • validate: 엔티티와 테이블 정상 매핑 확인

 


상품 엔티티 설계하기

 

@Entity 클래스 생성

 

com.shop

com.shop.entity 패키지 생성 <<< DB 연결 테이블

entity 패키지 안에 item 클래스 생성

com.shop.constant 패키지 생성

constant 패키지 안에 ItemSellStatus 클래스 생성(enum 형 : 관련된 상수 모음)

 

 

상품의 상태를 나타내는 ItemSellStatus ENUM 생성

// ItemSellStatus.java (enum생성)

package constant;

public enum ItemSellStatus {
    SELL, SOLD_OUT
}

 

 

Item 클래스 생성

// Item.java

package entity;

import 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;       // 수정 시간
}

 

 

엔티티 매핑 관련 어노테이션

 

 

@Column 어노테이션 추가 속성

 

 

@GeneratedValue어노테이션을 통한 기본키 생성 전략

 

 

 

 

 

 

상품 클래스 엔티티 매핑

// Item.java

package entity;

import 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;       // 수정 시간
}

 

 


Spring Boot - 쇼핑몰 프로젝트 02 (Spring Data JPA - 2)

 

https://rogi221.tistory.com/168

 

728x90
반응형