JPA
1. JPA(Jave Persistence API’)는 자바 ORM 기술에 대한 API 표준
2. ORM이란 ‘Object Relational Mapping’의 약자로 객체와 관계형 데이터베이스 매핑
JPA 장점
- 특정 데이터베이스에 종속되지 않음
- 객체지향적으로 설계 가능
- 유지보수 유리 및 생산성 향상
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문을 호출하지 않아도 됨.
쇼핑몰 프로젝트 생성
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
'Spring boot & JPA' 카테고리의 다른 글
Spring Boot - 쇼핑몰 프로젝트 03 (Thymeleaf 학습하기 - 2) (0) | 2023.04.04 |
---|---|
Spring Boot - 쇼핑몰 프로젝트 03 (Thymeleaf 학습하기 - 1) (0) | 2023.04.04 |
Spring Boot - 쇼핑몰 프로젝트 02 (Spring Data JPA - 3) (0) | 2023.04.03 |
Spring Boot - 쇼핑몰 프로젝트 02 (Spring Data JPA - 2) (0) | 2023.04.03 |
Spring Boot - 쇼핑몰 프로젝트 01 (개발 환경 구축) (0) | 2023.04.03 |