본문 바로가기

제네릭, 와일드카드 처음부터 끝까지 이해하기[with PECS, <E extends Comparable<? super E>> E max(Collection<? extends E> c)] 특정 타입 E의 컬렉션을 인자로 받아 최댓값을 반환하는 제네릭 한 max 메서드를 만든다면, 선언부는 아래와 같이 설계할 수 있습니다. public static
에러 FOR UPDATE cannot be applied to the nullable side of an outer join(postgres) 동시성 제어를 위해 select ... left join ... for update를 사용하여 배타 락을 획득할 때 다음과 같은 에러를 만났습니다. "FOR UPDATE cannot be applied to the nullable side of an outer join" 실행하려 했던 SQL은 대략 아래와 같습니다. SELECT * FROM member LEFT JOIN team ON member.team_id = team.team_id FOR UPDATE; 한 트랜잭션A에서 위 SQL이 실행될 때 team이 조인이 되지 않아서 null 상태로 읽었다고 가정해 보겠습니다. 결과 셋은 아래와 같습니다. 이 트랜잭션이 커밋되기 전에 다른 트랜잭션 B로부터 team_id : 1이 삽입되었다면, team_id ..
트랜잭션 격리수준 4단계 테스트 해보기(mysql innoDB) 트랜잭션은 데이터 정합성을 보장하기 위한 기능으로 논리적인 작업 셋을 모두 완벽하게 적용하거나 원상태로 복구하기 위한 기능입니다. 개발 과정에서 2개 이상의 쿼리가 실행되어야 하는 비즈니스 로직에 트랜잭션 기능을 사용하여 원자성을 보장할 수 있습니다. SQL 표준에서 정의하는 4단계의 트랜잭션 격리 수준도 같이 테스트해보았습니다. 이 글의 목적은 실제 격리 수준별 동작을 테스트해 보는 목적으로 작성되었습니다. DB 환경 & 출처 mysql - version. 8.0.35 - storage engine. innoDB - autocommit disabled postgres - version 14.10 정보 출처 : mysql, postgres 공식문서 및 Real MySQL 8.0 트랜잭션 격리 수준(tra..
JPA N+1문제와 해결방안(2) 지난 글에 이어서 N+1 문제 해결과정을 정리하겠습니다. 4. join과 fetch join Member 오브젝트를 통해 Team 에 접근할 때 발생하는 N+1 문제를 해결하기 위해서는 Member 조회시 데이터베이스에서 관련 테이블을 join 하여 한번에 가져와야합니다. 이를 위해 Repository 레이어에 JPQL 을 사용하는 메서드를 하나 추가하겠습니다. MemberRepository.java 일부 @Query("select m from Member m join m.team t") List findAllJoin(); 다음과 같은 테스트 코드도 작성하였습니다. MemberRepositoryTest.java 일부 @Test public void findAllJoinTest() { List allJoi..
JPA N+1문제와 해결방안(1) ORM 기술을 사용한 애플리케이션에서 흔히 겪는 현상으로 N+1 문제가 있습니다.N+1 문제는 1개의 조회 쿼리에 N개의 추가 쿼리가 발생하는 현상으로 애플리케이션 성능저하의 원인입니다.당시 수백개의 비교적 적은 레코드의 조회 쿼리 실행 시간이 1초 이상 걸리던 레거시 코드를 개선했던 경험을 정리해 보겠습니다. 1편에서는 여러 가지 현상들을 확인하고, 2편에서 해결했던 방식을 소개하겠습니다. 모든 코드는 예시로 작성되었습니다. - JAVA 17- Spring boot 3.1.01. 엔티티 정의1:N 관계의 Team,Member 엔티티를 구성합니다.Member 는 연관관계의 주인으로 멤버변수 중 하나로 Team이 있습니다. 로딩 전략으로는 즉시로딩(Eager)을 사용합니다.Team.javapackage ..
예외 TransactionRequiredException: no transaction is in progress, Executing an update/delete query 해결방안 TransactionRequiredException 예외 메시지로 두가지를 경험해보았습니다. no transaction is in progress 와 Executing an update/delete query 입니다. 발생하는 이유에 대해서는 잘 정리된 글들이 많아서, 각 메시지별 해결방법 위주로 작성해보았습니다. @Transactional 어노테이션 누락 확인 트랜잭션으로 관리할 메서드에 종종 어노테이션을 누락한 적이 있습니다. //@Transactional public void update() throws Exception { //... } 트랜잭션 메서드 접근제어자 / 불변 키워드 확인 @Transactional 은 AOP로 구현되는데, 스프링 부트 2.0 이후부터는 기본적으로 CGLib이란 라이브..