일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 자율주행
- 아두이노
- 장애물인식
- 운영체제
- Database
- JPA
- 디자인패턴
- 논문리뷰
- Python
- 알고리즘
- Hibernate
- 영속성컨텍스트
- cartograhper
- 파이썬
- Java
- MySQL
- 이펙티브자바
- 배달로봇
- persistance context
- 프로그래머스
- Spring Batch
- 포인트클라우드
- Jetson
- 딥러닝
- DeepLearning
- 네트워크
- 자바ORM표준JPA프로그래밍
- 자료구조
- 자바
- 논문
- Today
- Total
목록JPA (10)
제리 devlog
이번에는 엔티티 수정과정을 디버깅해보자. 엔티티를 수정하면 jpa에서는 dirty checking을 하고 update쿼리를 생성해준다. 정확히는 flush과정을 디버깅한다. 수정 과정 @Test @Transactional fun `update order`() { val order = Order(price = 1000) orderJpaRepository.save(order) order.price = 2000 orderJpaRepository.flush() } 먼저, order가 저장되는 부분에서 알고 넘어갈 부분이 있다. entitiy가 영속화되면 영속성 컨텍스트 내부에 entityEntryContext에 entityEntry가 저장된다. 이 entityEntry에는 loadState라는 것이 있다. 이 ..
이번에는 조회 과정을 디버깅해보자. 조회는 2가지 케이스로 나뉜다. 1. 영속성 컨텍스트에 존재하지 않아 db조회가 필요한 경우 2. 영속성 컨텍스트에 값이 존재해 1차 캐시를 반환하는 경우 (db 조회가 필요하지 않은 경우) 조회 과정 @Test @Transactional fun `find order`() { orderJpaRepository.findById(1L) } 먼저 find가 발생하면 DefaultLoadEventListener에 onLoad메서드가 호출된다. 이 메서드는 doOnLoad를 호출한다. 우선 doOnLoad는 session으로부터 EntityKey를 load 하는데, EntityKey는 entity의 id로 구성된 영속성 컨텍스트에서 엔티티를 구분해주는 key이다. 그리고 이어서..
이번 포스팅에서는 트랜잭션상에서 영속성 컨텍스트가 코드상으로 어떻게 사용되는지 확인해보려고 한다. 그전에 디버깅에 유용한 static 메서드를 소개한다. TransactionSynchronizationManager.getResourceMap() 이 메서드는 현재 스레드에 바인딩된 트랜잭션 자원을 확인해볼 수 있다. 예를 들어 아래 코드에서 이 메서드를 실행하면 트랜잭션 실행으로 entityMangerHolder와, datasource가 바인딩될 것을 알 수 있다. 저장 과정 persistanceContext는 entity를 저장하는 환경이다. entityManager를 사용해서 entity를 등록, 조회하는 경우 entityManger는 persistanceContext에 entity를 저장한다. 이제 ..
jpa를 사용해서 개발하다 보면 JpaRepository 인터페이스를 구현한 repository와 queryDsl를 사용하는 repoitory를 사용할 일이 잦다. 나는 간단한 조회, 엔티티 저장은 JpaRepository를 사용하고, 배치성 업데이트나 복잡한 쿼리 등은 querydsl을 사용하는 편이다. 그런데 JpaRepsitory, QuerydslRepository가 각각의 클래스로 분리되어 있다보니 서비스 계층에서 주입받아야 하는 클래스가 늘어났다. @Service class OrderService( private val orderJpaRepository: OrderJpaRepository, private val orderQuerydslRepository: OrderQuerydslRepositor..
JPA를 사용하면서 연관 관계를 갖는 엔티티를 만들어 주기위해 연관된 엔티티를 조회해오는 경우가 있다. 아래 게시글에 댓글을 의미하는 Comment엔티티가 있다. @Getter @NoArgsConstructor @Entity public class Comment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne(fetch = FetchType.LAZY) private Post post; @Lob private String content; @Builder public Comment(Post post, String content) { this.post = post; this.content = content..
엔티티의 연관관계를 매핑할 때는 3가지를 고려해야한다. 다중성 단방향, 양방향 연관관계의 주인 먼저 두 엔티티가 일대일 관계일지 일대다 관계인지 다중성을 고려한다. 다음으로, 두 엔티티가 단방향과 양방향중 어떤 방식으로 참조하는지 결정한다. 마지막으로 양방향 관계라면 연관관계의 주인을 결정한다. 다중성 다대일(@ManyToOne) 일대다(@OneToMany) 일대일(@OneToOne) 다대다(@ManyToMany) 보통 다대일과 일대다 관계를 많이 사용하고 다대다 관계는 실무에서 거의 사용하지 않는다. 단방향, 양방향 테이블은 외래 키 하나로 조인을 하면 양방향으로 쿼리가 가능해서 방향의 개념이 없다. 반면, 객체는 참조용 필드가 있어 방향이 존재한다. 객체 관계에서 한 쪽만 참조하는 것을 단방향 관계라..
새로운 프로젝트를 생성한다. 의존성 관리는 maven을 사용한다. 프로젝트 구조는 아래와 같다. 먼저 의존성 관리를 위해 pom.xml을 보자 4.0.0 org.hibernate hibernate-entitymanager 5.4.10.Final com.h2database h2 1.4.199 org.example ch2-jpa 1.0-SNAPSHOT 여기서 두가지 라이브러리를 사용한다. hibernate는 JPA 표준과 하이버네이트를 포함하는 라이브러리이다. h2 데이터베이스는 h2 데이터 베이스를 사용하게해준다. 따로 mysql이나 오라클같은 데이터베이스 대신 가벼운 h2를 사용하여 간편하게 테스트한다. 이번에는 회원 클래스에 JPA가 제공하는 매핑 어노테이션을 추가해보자. @Entity @Table(n..
JPA는 자바 ORM(객체관계매핑) 기술에 대한 API 표준 명세다. 즉, 인터페이스를 모아둔 것이다. 따라서 JPA를 사용하려면 JPA를 구현한 ORM프레임워크를 사용해야한다. 이중 Hibernate가 가장 대중적이다. JPA라는 표준 덕분에 특정 구현 기술에 대한 의존도를 줄일 수 있고 다른 구현 기술로 손쉽게 이동할 수 있다. 다시말하면 Hibernate가 아닌 다른 ORM프레임워크로 변경해도 JPA인터페이스를 사용하고있기 때문에 코드상에서 변경해야할 부분이 크게 줄어든다. 왜 JPA를 사용해야 하는가? 1. 생상성 JPA를 사용하면 자바 컬렉션에 객체를 저장하듯이 JPA에 저장할 객체를 전달하면된다. SQL을 작성하고 JDBC API를 사용하는 반복적인 일을 JPA에서 대신해준다. 나아가서 JPA..