Spring JPA 기본

2023. 2. 2. 17:52JPA

2.2

 

JPA : ORM 데이터 접근 기술 제공 ...... Object-relational mapping (객체 관계 매핑)

객체는 객체대로

관계형 데이터베이스는 관계형 데이터베이스대로

ORM 프레임워크가 중간에서 매핑

 

JAVA에플리케이션 ----> JPA <----- JDBC API

 

* 스프링 부트와 JPA 통합 및 설정

//JPA, 스프링 데이터 JPA 추가
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

 

 

* ORM 매핑

@Data
@Entity
public class Item {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) //PK //AutoIncrement
    private Long id;

    @Column(name = "item_name", length = 10)
    private String itemName;
    private Integer price;
    private Integer quantity;

    public Item() {
    }

    public Item(String itemName, Integer price, Integer quantity) {
        this.itemName = itemName;
        this.price = price;
        this.quantity = quantity;
    }
}

 - @Entity : JPA가 사용할 객체라는 뜻. db테이블과 연결될 객체 테이블

- @Id : PK

- GenerateValue : db에서 pk값을 생성하는 상황에 사용 

- @Column : 객체의 필드를 테이블의 컬럼과 매핑 (생략 가능)

하지만, 테이블의 컬럼과 객체의 필드명이 완전히 다른 경우에는 name="item_name" 과 같이 설정해준다.

 

* public Item( ) { } : 반드시 기본 생성자를 넣어줘야 한다.

 

* Jpa를 사용한 Repository 생성자 주입

@Repository
@Slf4j
@Transactional //jpa 사용에 필수
public class JpaItemRepository implements ItemRepository {

    private final EntityManager em;

    public JpaItemRepository(EntityManager em) {
        this.em = em;
    }

- EntityManager : Jpa를 사용하기 위한 스프링의 객체

 

* Jpa 는 java의 Collection과 매우 유사하다. 

 

 * 기본 기능 ( save, update, find)

@Override
public Item save(Item item) {
    em.persist(item);
    return item;
}

@Override
public void update(Long itemId, ItemUpdateDto updateParam) {
    Item findItem = em.find(Item.class, itemId);
    findItem.setItemName(updateParam.getItemName());
    findItem.setPrice(updateParam.getPrice());
    findItem.setQuantity(updateParam.getQuantity());
}

@Override
public Optional<Item> findById(Long id) {
    Item item = em.find(Item.class, id);
    return Optional.ofNullable(item);
}

- em.persist (객체) : 객체를 받아서 테이블에 저장한다.

- em.find (Entity 클래스, PK ) 로 해당 객체를 찾아온다. 

그렇게 나온 객체.set______ 으로 값을 설정하면 jpa는 보류해두고 있다가 트랜잭션이 커밋하는 시점에 실제

테이블을 복사해놓은 실체를 가져와서 값을 변경해준다.

 

* jpql (객체지향 쿼리 언어) ( 동적 쿼리에 사용 )

String jpql = "select i from Item i";

 jpa는 sql과 매우 유사한 jpql을 제공한다.

db의 테이블에 접근하는 sql과 다르게 jdql은 Entity 즉, 객체에 접근한다.

문법은 비슷하다.

 

파라미터는 문자 중심의 파라미터를 사용한다.

파라미터 바인딩은 다음과 같다.

query.setParameter("파라미터명" , 필드명)

 

 

* @Repository 는 단순희 ComponentScan 뿐 아니라 예외 AOP의 적용 대상이 된다.

예외 변환 AOP 프록시는 JPA와 관련된 예외가 발생하면 변환기를 통해 스프링 데이터 접근 예외로 변경한다.

 

기본적인 것만 기록

자세한건 공부해서 별도로 기록할것