2023. 2. 2. 17:52ㆍJPA
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와 관련된 예외가 발생하면 변환기를 통해 스프링 데이터 접근 예외로 변경한다.
기본적인 것만 기록
자세한건 공부해서 별도로 기록할것
'JPA' 카테고리의 다른 글
[JPA] JPQL - 페이징 (0) | 2023.05.08 |
---|---|
[JPA] JPQL- 기본 쿼리문 예시 (0) | 2023.05.08 |
[Spring Data JPA] 데이터 수정 / Dirty checking 시 save를 별도로 해줘야 한다 ? (0) | 2023.04.13 |
[SpringData JPA] 생성시간, 수정시간 자동 (JPA Auditing, BaseEntity) (0) | 2023.03.19 |
스프링 부트 & JPA 실전 사용 감 익히기 (0) | 2023.02.03 |