JPA
-
Bulk 데이터 삽입 최적화 - save() , saveAll() , batchUpdate()실전 개발해보기 2023. 12. 9. 14:36
상황 토이 프로젝트로 스포츠 경기 예매 시스템을 만들고있다. Game 클래스는 축구,야구 등 경기를 나타내는 도메인이고 Seat 클래스는 한 경기당 생성되는 수만개의 경기 좌석이다. Seat -> Game 은 N:1 단방향 (Seat에서 @ManyToOne 으로) 매핑이 되어있다. 스포츠 경기 특성상 한 경기마다 수만개의 좌석을 확보해야한다. 이 코드 짜기 직전에 RBF에서 팀원이 spring data jpa 에서 save()와 saveAll() 의 성능 비교를 보여줘서 bulk 데이터 저장에 쉽게 접근할 수 있었다. https://voidmelody.tistory.com/189 JPA의 save와 saveAll의 성능차이 spring batch를 통해 데이터를 가공하고 저장하는 업무가 있었다. 당시 나..
-
Jpa hibernate의 2차 캐시Spring & JPA 2023. 12. 4. 13:08
JPA에서는 영속성 컨텍스트를 기반으로 돌아간다. 그 중심에 명령어를 저장하는 쓰기지연 저장소와 엔티티를 저장하는 1차 캐시가 있다는 것은 알고있었다. 이를 통해 DB 커넥션으로 데이터를 주고받는 작업을 최소화해서 성능상의 이점을 가져갈 수 있다는 것까지는 이해했다. 여기서 1차 캐시는 하나의 트랜잭션 단위에서 저장된다. 즉 해당 트랜잭션이 끝나면 다 날라간다. 1차캐시는 JPA의 고유 기능이라 on/off 할 수 없는 당연한 존재다. 문득 새삼 그런 생각이 들었다 트랜잭션 단위는 캐시의 특성을 활용하기엔 그다지 효율적일 것 같지 않은데?.. 그 위에 애플리케이션 메모리 단위에서 캐시 저장소가 필요할 것 같은데? 2차캐시의 동작 원리는 찾고자하는 엔티티가 1차 캐시에 없을 때 2차 캐시에서 찾는 방식이다..
-
JPA에서 양방향 매핑은 언제 쓰일까? ( feat . JPQL )Spring & JPA 2023. 11. 18. 20:37
데이터베이스에서 테이블끼리 관계는 FK(외래키)를 참조하는 방식으로 이뤄져있다. 외래키로 관계가 맺어져있다면, 아무곳에서 join을 걸어서 원하는 데이터를 얻을 수 있다. 즉 DB에선 JPA의 OneToMany처럼 두 클래스 중 한쪽에서만 참조하고있는 단방향이라는 개념이 존재하지 않는다. select m.member_id from member m join team t on t.TEAM_ID = m.TEAM_ID 다음 Member와 Team 테이블이 있을 때 두 테이블을 잇는 데 방향이랄게 없다. 그런데 이게 JPA로 넘어가면 방향이란게 생긴다. 방향이 왜 생길까? Jpa를 이용한다는 결국 자바를 쓰는건데, 객체들끼리 참조값을 이용하기 때문이다. 똑같이 Member와 Team이 있다. 만약 Team 객체가..