분류 전체보기
-
유클리드 호제법 정리알고리즘 2024. 1. 19. 15:55
1. 최대 공약수 구하기 6과 8의 최대 공약수 구하기 예시 public int GCD(){ int a = 8 int b = 6 int r = 0; while (b!=0) { r = a%b; a = b; b = r; } return a; } 유클리드 호제법에서 최대공약수는 다음과 같다. 2개의 자연수 a, b(a > b)에 대해서 a를 b로 나눈 나머지가 r일 때, a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 작은 수(b)를 계속해서 나눈 나머지인 작은 수는 결국 0에 도달 할 수 밖에 없는데, 그때 큰수(a)의 값이 그 두 수의 최대공약수이다. 내가 이해한 바로 이 유클리드 호제법이 가능한 근본적인 이유는 b mod a가 0이라면, 즉 a로 b를 나눌 수 있다면, 반드시 a가 최대공약수이기 때..
-
Jpa 에서 Bulk Data Update시 정합성 문제Spring & JPA 2024. 1. 4. 19:00
발단 내가 맡은 도메인은 쿠폰이다. 쿠폰에는 유효기간이 있고, Spring Scheduler를 이용해서 매일 자정에 유효기간이 지난 쿠폰을 삭제 대신 boolean으로 저장된 값을 바꿔서 무효한 쿠폰이 되도록 해야한다. 처음에 빠르게 Service 레이어에서 Spring Data Jpa를 통해 쿠폰리스트를 싹다 가져온 뒤 도메인 내 로직을 통해 쿠폰을 무효화 시켜 다시 저장시키는걸 작성해보았다. 그런데 웬걸!!! jpa를 통해서 가져온 데이터를 수정해서 다시 DB로 저장시키면 (물론 Dirty Checking을 통해 자동으로 저장된다) 이게 가져온 데이터가 전부 다 단건으로 Update 쿼리가 나간다. 만약 수백개의 쿠폰이 바뀌어야하면 수백개 쿼리가 나간다;;; 이게 수만개가 되면 음... 극복 이를 해..
-
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차 캐시에서 찾는 방식이다..
-
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편 강의입니다! 트랜잭션이 걸린 메서드를 실행킨뒤, 내부의 트랜잭션이 걸려있는 메서드를 호출하는 상황이다. 과연 이렇게 중첩된 상황에서 트랜잭션은 어떻게 작동을 하..
-
Checked Exception은 커밋? Unchecked Excpetion은 롤백? 스프링에서 @Transactional 으로 rollBack 다뤄보기Java 2023. 10. 23. 04:09
https://www.youtube.com/watch?v=_WkMhytqoCc 백기선님 유튜브 최근 트랜잭션에 대해 공부중이었는데 알고리즘이 나를 해당 영상으로 이끌었다. 간략하게 설명을 하면 - 컴파일 타임에 꼭 처리해야하는 checked Exception은 커밋으로 처리하기 - 런타임에 처리해야하는 unchecked Exception은 롤백 처리하기 이 두가지는 스프링 프레임워크에서 트랜잭션 실행시 작동하는 기본 전략이다. (외에 여러 옵션이 있다.) 그런데 자바의 Checked Exception 은 커밋으로 처리해야하고, Unchecked Exception은 롤백해야한다. 라고 잘못 퍼져나가는것에 대한 비판이 담긴 영상이다. 나도 사실 spring에서 transaction을 @Transactiona..