Spring & JPA
-
Jpa 에서 Bulk Data Update시 정합성 문제Spring & JPA 2024. 1. 4. 19:00
발단 내가 맡은 도메인은 쿠폰이다. 쿠폰에는 유효기간이 있고, Spring Scheduler를 이용해서 매일 자정에 유효기간이 지난 쿠폰을 삭제 대신 boolean으로 저장된 값을 바꿔서 무효한 쿠폰이 되도록 해야한다. 처음에 빠르게 Service 레이어에서 Spring Data Jpa를 통해 쿠폰리스트를 싹다 가져온 뒤 도메인 내 로직을 통해 쿠폰을 무효화 시켜 다시 저장시키는걸 작성해보았다. 그런데 웬걸!!! jpa를 통해서 가져온 데이터를 수정해서 다시 DB로 저장시키면 (물론 Dirty Checking을 통해 자동으로 저장된다) 이게 가져온 데이터가 전부 다 단건으로 Update 쿼리가 나간다. 만약 수백개의 쿠폰이 바뀌어야하면 수백개 쿼리가 나간다;;; 이게 수만개가 되면 음... 극복 이를 해..
-
Jpa hibernate의 2차 캐시Spring & JPA 2023. 12. 4. 13:08
JPA에서는 영속성 컨텍스트를 기반으로 돌아간다. 그 중심에 명령어를 저장하는 쓰기지연 저장소와 엔티티를 저장하는 1차 캐시가 있다는 것은 알고있었다. 이를 통해 DB 커넥션으로 데이터를 주고받는 작업을 최소화해서 성능상의 이점을 가져갈 수 있다는 것까지는 이해했다. 여기서 1차 캐시는 하나의 트랜잭션 단위에서 저장된다. 즉 해당 트랜잭션이 끝나면 다 날라간다. 1차캐시는 JPA의 고유 기능이라 on/off 할 수 없는 당연한 존재다. 문득 새삼 그런 생각이 들었다 트랜잭션 단위는 캐시의 특성을 활용하기엔 그다지 효율적일 것 같지 않은데?.. 그 위에 애플리케이션 메모리 단위에서 캐시 저장소가 필요할 것 같은데? 2차캐시의 동작 원리는 찾고자하는 엔티티가 1차 캐시에 없을 때 2차 캐시에서 찾는 방식이다..
-
FetchType.Lazy 와 Fetch Join (N+1문제 해결!)Spring & JPA 2023. 11. 27. 01:17
FetchType과 Fetch join까지 한번에 다 다루기 힘들고 이해해야할 부분도 많지만.. 최대한 쉽게 와닿을수 있게 글을 쓰려고 노력했다. Jpa 에서 Fetch에 대한 키워드가 FetchType.Lazy 와 Fetch Join 2개가 있었다. 둘다 데이터를 조회할 때 조금 더 효율적으로 작업하고자 사용한다는 공통점이 있다. 하지만 FetchType은 엔티티 레벨에서 설정하는 값이고, Fetch Join은 레포지토리에서 조인 쿼리를 이용하는 것이다. 간단하게 말하면 FetchType으로 글로벌 설정을 하고 Fetch Join으로 좀 더 세세하게 작업을 하는 것이다. 처음에는 위 두개를 놓고 직접 비교하면서 공부하기보다 FetchType 값으로 이용 가능한 FetchType.Eager vs. Fet..
-
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 객체가..
-
Transaction 전파 propagation 알아보기Spring & JPA 2023. 10. 29. 22:03
@Transactional을 서비스 레이어에서 보통 사용하는것을 알고있었는데 정말 무지성으로 레포지토리에도 사용해버렸다.. 아마 레포지토리 테스트 짤때 @Transactional 사용하면서 레포지토리 도메인에도 사용해버린 것 같다. 그래서 내 코드리뷰를 해주시는 서브멘토님께서(멘토님들 항상 감사합니다.. ) 트랜잭션 전파 키워드를 던져주셔서 알아보기로 했다! 트랜잭션 전파의 기본 원리 - 트랜잭션 전파를 활용할 수 있는 상황 - 트랜잭션 전파 옵션 으로 알아보겠다. 트랜잭션 전파 기본 원리 해당 게시글의 그림 출처는 김영한님의 스프링 DB 2편 강의입니다! 트랜잭션이 걸린 메서드를 실행킨뒤, 내부의 트랜잭션이 걸려있는 메서드를 호출하는 상황이다. 과연 이렇게 중첩된 상황에서 트랜잭션은 어떻게 작동을 하..
-
톰캣(WAS)과 스프링 그리고 스프링부트 , 무슨 관계지?Spring & JPA 2023. 10. 16. 04:22
스프링을 초반부분을 공부중이다. 스프링의 MVC 패턴에서 배우는 핸들러나 디스패처 서블릿이 왜필요한지 정도를 공부한적도 있고, 웹 서버와 웹 애플리케이션 서버의 차이에 대해 공부한적도 있는데 스프링과 톰캣WAS)의 관계를 공부한적이 없다. 그냥 막연히 스프링부트가 톰캣 띄워주는 정도로 이해하고있었다. 어느 강의에서 '옛날엔 톰캣 설정하다 시간 다갔다' 라는 말만 들어봤고 정확히는 몰라서 정리해보려한다. 웹 서버와 웹 애플리케이션 서버의 차이를 모르신다면.. 해당글을 읽어보시는것을 추천드립니다. 톰캣은 정적 처리를 돕는 웹 서버의 기능과 Sevlet Container가 합쳐진 WAS라고 이해하면 된다. 결국엔 웹서버만으로는 동적처리가 안되니까 무언가 추가를 하는것인디... 바로 서블릿이 해주는것이다. 정확..