Dev/JPA 23

JPA Embedded, Embeddable, 속성의 재정의

JPA에서 Embedded 활용하기. 🤔🤔 컨버터를 통해 자바객체에 맵핑하는 법을 배웠다. String이나 Int 같은 Row한 값으로 받아서 서비스 로직에서 변환해도 문제가 없을탠데 왜 이렇게 까지 할까? 바로 코드의 가독성 때문이다. 오픈소스나 기업체 상용소스같은 최근코드는 이해하기쉽고 읽기쉽게 가독성이 좋게 작성하는것이 트랜드이다. 그렇기에 Entity에 Embed클래스를 한번 사용해보자. 현업에서 Enbedded타입을 가장 많이 쓰는 예로써, 주문시의 가격 필드가 있다. 가격은 공급가 부가세 토탈가격 같은 가격필드는 상품 도메인이나, 주문 도메인, 결제, 정산 등등 여러가지 필드에 쓰이기 때문에 적합하다. 또한 주소정보도 적합하다. 주소정보를 String address에 모두 저장할 수 있지만, ..

Dev/JPA 2022.03.02

JPA Converter

DB Data와 형식이 다르면 어떻게 할까?🤔🤔 JPA는 ORM이기 때문에 DB Data를 JAVA 객체로 바꿔 주는데 DB Data와 형식이 다르면 어떻게 할까?🤔🤔 바로 @Converter를 사용하는 것이다. 쿼리를 통해 가져온 데이터를 객체로 맵핑을 할때 커스터마이징하는 방법을 알아보자. @Enumerated(value = EnumType.STRING) private Gender gender;위 코드는 DB의 Enum과 자바의 Enum Type 형식이 다르기 때문에 @Enumerated(value = EnumType.STRING)를 넣어 줬다. 실제로 OrdinalEnumValueConverter 클래스에 보면 Integer 형식의 값을 String으로 변환하고, NamedEnumValueConve..

Dev/JPA 2022.03.02

JPA Native Query

Native Query 사용해보자. @Query(value = "select * from book", nativeQuery = true) List findAllCustom(); // @Transactional @Modifying @Query(value = "update book set category = 'IT전문서'", nativeQuery = true) int updateCategories(); @Query(value = "show tables", nativeQuery = true) List showTables(); 네이티브 쿼리는 JPQL과 다르게 Entity 속성들을 사용하지 못합니다. select * from book 와 같이 테이블 이름이 들어간다. 다른 컬럼 이름을 적을때도 D..

Dev/JPA 2022.03.02

JPA @Query

@Query 🤔앞서 배웠던 내용만 활용할수있으면 JPA는 쓸수 있다. 하지만 약간의 예외적인 상황에서 Custom해야하는 상황이 생긴다. 그럴때는 @Query를 써보자. 왜? @Query🤔🤔 첫번째 이유로 긴 Query Method의 가독성 문제를 해결해 준다. (JPQL 사용) Query Method의 이름의 길이 굉장히 길어질때 사용하면 좋다. 엄청 긴 이름의 쿼리를 한번 만들어보고 Test 해보자. // 카테고리가 null이면서 이름은 지정한값으로,createdAt 보다 크거나 같고, updatedAt 보다 크거나 같은 쿼리 List findByCategoryIsNullAndNameEqualsAndCreatedAtGreaterThanEqualAndUpdatedAtGreaterThanEqual(Str..

Dev/JPA 2022.03.02

JPA OrphanRemoval(+@Where)

JPA에서 OrphanRemoval 활용하기 이전에 포스트 했던 JPA Cascade에서 Remove는 없었다. Remove에 대한 설명이 많기 때문이다. 우선 Remove Cascade를 사용해보자. CascadeType.REMOVE Book book2 = bookRepository.findById(1L).get(); bookRepository.delete(book2); // bookRepository.deleteById(1L); // publisherRepository.delete((book2.getPublisher())); System.out.println("books : " + bookRepository.findAll()); System.out.println("publishers : " + pub..

Dev/JPA 2022.03.02

JPA에서 Transaction 활용하기

TransactionManager Transaction은 계속 나왔다. @Transactional를 사용할때나, 영혹성 컨택스트에서 Transaction이 끝날때 merge가 된다고 할때도... 그때마다 지나간 이론적인 내용을 살펴보겠다. Transaction ? DB에서 명령어들의 논리적 묶음 자바에서 메서드를 통해 물리적인 기능들을 묶는거 처럼 DB에서는 Transaction의 단위로 물리적인 기능을 묶는다. ex) 물건 구매 행위에서 결제와 주문이 한 트랜젝션으로 묶여야한다. 결제는 성공했는데 주문이 안들어가면 돈만 빠져나가는 경우가 생길수 있기 때문에, 주문이 실패하면 rollback이 되어야 한다. All OR Nothing, 모 아니면 도 특성 A 원자성 부분적인 성공은 허용하지 않음 송금을 ..

Dev/JPA 2022.03.02

JPA Cascade

JPA에서 Cascade(영속성 전이) 활용하기 ALL, PERSIST, MERGE, REMOVE, REFRESH, DETECH @Test void bookCascadeTest() { // 영속성 전이 테스트 // 책 생성 후 저장 Book book = new Book(); book.setName("JPA 초격차 패키지"); bookRepository.save(book); // 출판사 생성 Publisher publisher =new Publisher(); publisher.setName("우리집"); publisherRepository.save(publisher); // 책의 출판사를 set book.setPublisher(publisher); bookRepository.save(book); // 출판..

Dev/JPA 2022.03.02

JPA에서 Transaction의 전파

Transaction의 전파(propagation) JPA에서 Transaction 시작과 끝은 각 메서드의 시작과 끝이다. 하지만 현재있는 트랜젝션과 다른 클래스의 메서드 트랜젝션간의 처리가 어떻게 진행될까? 그 부분의 교통정리를 하는 부분이 propagation이다. public enum Propagation { REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS), MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY), REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_..

Dev/JPA 2022.03.02

영속성 컨텍스트(Entity LifeCycle)

😎 영속성컨텍스트에서 가장 주체가 되는 클래스는 엔티티메니져객체이다. 엔티티는 하나의 객체이기 때문에 엔티티와 DB레코드 사이에 어떻게 연결해주고, 어떻게 반영해 주는지, 모두 엔티티메니져의 역활이다. 영속성컨텍스트 내에서 엔티티매니져가 엔티티의 상태를 어떻게 변화시키는지 알아보자. Entity 생애주기 알아보기(Entity LifeCycle) 엔티티 라이프사이클 이라고 하면 4가지의 상태가 존재한다. 비영속상태 : new OR Transient 상태 영속상태 : managed 상태 준영속상태 : deteched 상태 삭제상태 : removed 상태 😁비영속 상태 (Transient 상태) 영속성 컨텍스트가 해당 영속성객체를 관리하고 있지 않는 상태이다. 그 필드는 영속화에대해서 제외하겠다 라는 말이다...

Dev/JPA 2022.03.02

영속성 컨텍스트(Entity Cache)

🤔 영속성 컨텍스트는 일종의 JPA 컨테이너 안에서 동작하는 entity의 맥락을 관리하는 것이다. 이 안에서 entity는 생성되고 지워지고 조회된다. 그 context 안에서 가장 중요한 역활을 하는 것이 EntityManager 객체이다. 이 역활을 알아보고, EntityManager가 entity를 처리하는 과정에서 Cache를 사용하는데 어떻게 사용하는지 알아보자. EntityManager EntityManager는 JPA에서 정의하고 있는 Interface 이다. persist merge remove find 등등 정의되어있다. 그리고 구현체를 빈으로 등록하고 있기 때문에 Autowire를 이용해 사용할수 있다. 쿼리메서드나, simplejparepository 등 내부적인 실제 동작은 ent..

Dev/JPA 2022.03.02