들어가며 개인적으로 요즘 개발 트렌드에서 Spring Data JPA가 공식이 되었다고 생각될 만큼, 개발자들이 ORM(Object Relational Mapping)이라는 것을 많이 사용합니다. 하지만 많이 사용하는 것과 잘 사용하는 것은 명백히 다르다고 생각합니다. 실제로 Spring Data JPA, JPA, Hibernate의 관계와 배경을 설명할 수 있는 사람이 몇이나 될까요? 최근에 Spring Data JPA를 사용하여 개발하는 도중 Spring Data JPA는 기본적인 구현체들을 극단적으로 추상화시키고 있다는 생각이 들었습니다. Spring Data JPA 공식 문서에서는 Spring Data JPA에 대해서 다음과 같은 정의를 내놓았습니다. 더 큰 Spring Data 제품군의 일부인 ..
들어가며 지난 글에서 JPA가 알아서 동시성 이슈를 해결해주는 모습을 보였지만, 어디까지나 운이라는 결론을 내렸습니다. 이어서 어드민 페이지 동시성 이슈를 직접 해결해보겠습니다. 두 번의 갱신 분실 문제 JPA가 동시성 문제를 파악하고 예외를 던져주는 행위가 운이라고 했는데, 이는 영속성 컨텍스트를 계속 동기화 시켜주는 부분을 제거하면 곧 바로 동시성 문제가 다시 발생하기 때문입니다. 여기서 말하는 동시성 문제란 두 번의 갱신 분실 문제를 뜻하는데, 아래와 같이 3가지 상황이 존재합니다. 최초 커밋만 인정하기 : 첫 번째로 커밋한 트랜잭션의 변경 사항만 반영하고, 마지막 트랜잭션의 변경 사항은 무시한다. 마지막 커밋만 인정하기 : 마지막으로 커밋한 트랜잭션의 변경 사항만 반영하고, 첫 번째 트랜잭션의 변..
개념적 차이 List와 Set은 모두 JCF이다. 당연히 차이도 존재한다. List에는 중복 데이터가 포함될 수 있지만, Set에는 중복 데이터가 포함될 수 없다. List는 삽입 순서를 유지하지만 Set은 유지할 수 있고, 유지하지 않을 수도 있다. Set은 삽입 순서가 유지되지 않을 수 있으므로 인덱스 기반 액세스를 허용하지 않는다. LinkedHashSet과 같이 순서를 유지하는 Set도 있다. List와 Set 성능 비교 JMH(Java Microbench Harness)를 사용해서 List, Set 데이터 구조의 성능을 비교해 보자. 먼저 ListAndSetAddBenchmark 및 ListAndSetContainBenchmark라는 두 개의 클래스를 만든다. 그다음 List 및 Set 데이터 ..
집사의고민 프로젝트에서 JPA를 사용하면서 알아본 Fetch Join시 유의해야 하는 부분들에 대해서 기술해보려고 합니다. 특히나 자주 사용하는 fetch join + on절에 대한 이슈를 모르거나 잘 기억이 나지 않으신다면 이해하고 넘어가는게 좋습니다. 우선 쿼리가 정상적으로 동작하는지와 어떤 쿼리가 발생하는지를 알아보기 위해 간단한 테스트 코드를 작성해보았습니다. PetFoodRepositoryImplTest @DataJpaTest @Import(QueryDslTestConfig.class) @Sql(scripts = {"classpath:truncate.sql", "classpath:data.sql"}) @AutoConfigureTestDatabase(replace = AutoConfigureTes..