본문 바로가기

Side Project/Socket9

페이징 쿼리 최적화 들어가기 전에... 지금 부터 설명할, 두 코드 모두 전체 데이터를 가져오는데 사용할 수 있지만, 성능 면에서 차이가 있다. 첫번째 방법의 경우 query.fetch().size()를 사용하여 전체 데이터 개수를 가져온다. 이는 쿼리를 실행하여 모든 결과를 가져온 후 리스트의 크기를 반환하는 방식이다. 이렇게 하면 전체 결과를 메모리로 가져오기 때문에 가져올 데이터가 매우 큰 경우, 성능이 저하될 수 있다. 또한, fetch().size() 메서드 호출이 실제로는 모든 결과를 가져오기 때문에 성능적으로 비효율적이다. 두 번째 방법에서는 count 쿼리를 사용하여 전체 레코드 수를 가져온다. count 쿼리는 실제 데이터를 가져오지 않고 단순히 데이터 개수만을 반환하므로, 성능상의 이점이 있다. 또한, 전.. 2024. 4. 6.
List를 pageable과 PageImpl로 구현하기 - List Paging 페이징을 쓰는 경우는 1번 case가 대부분이며 가장 이상적이다. 1. querydsl의 fetch()와 countQuery.size()로 가져오기. (가장 이상적) 아래 코드처럼 fetchResults( )를 하면, content를 위한 쿼리 1번 + total을 위한 쿼리 1번 총 2번의 쿼리를 날린다. public Page searchPageComplex(MemberSearchCondition condition, Pageable pageable) { //Contents 만을 위한 쿼리 List content = queryFactory .select(new QMemberTeamDto( member.id, member.username, member.age, team.id, team.name)) .fro.. 2024. 3. 15.
List<String> 타입의 경우 Nullable 할 때 주의할 점. 본격적으로 들어가기전, 아래의 개념을 숙지하자 null "어떠한 값으로도 초기화 되지 않은 상태" 아무것도 없는 것을 나타내는 자바의 Keyword 참조형 타입의 기본값 null 은 참조형 타입의 기본값이다.(초기값) null 은 참조형 타입에서만 사용할 수 있다. 기본형 타입의 변수에 할당하게 될 경우 컴파일 오류가 발생한다. 참조변수가 지역변수로 선언된 경우 선언과 동시에 초기화 되어야 하기때문에 , 따로 초기화를 해주지 않는다면 기본값인 null 값으로 초기화 한다. null 과 "" 빈값의 차이해 null 은 선언만 되어있고 초기화가 되어있지 않은 상태이다. 그래서 힙 메모리상 데이터가 존재하지 않는다. 하지만 ""은 빈값이라는 데이터로 초기화가 되어있는 상태이다. 힙메모리상 빈값이 들어가 있을 .. 2024. 2. 5.
[MySQL] 테이블 데이터 다 지우기 개요 API 테스트를 하면서 DB에 너무 많은 데이터 값이 쌓여 이를 깨끗히 비우기 위해서 사용한 방법을 소개하려고 한다. foreign key constraint fails 에러 개발 진행 중에 데이터가 너무 많이 쌓였거나 테스트 데이터에 빠진 컬럼이 있는 등 테이블의 데이터를 모두 삭제해야 하는 순간이 있다. 이 때 한 테이블에서 다른 테이블을 참조하고 있다면 다음과 같은 에러가 발생하면서 데이터가 삭제되지 않는다. mysql> DELETE TABLE [테이블명] or TRUNCATE [테이블명] ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails 이는 Mysql이 테이블 간 관계가 있는 데이터.. 2024. 2. 5.
@Transactional 어느 Layer에 두는게 맞을까? (2) 이전 게시물에 이어서 얘기하자면 Spring Docs의 Tip 부분에는 다음과 같이 제시하고 있다. 위의 Tip 부분을 살펴보면, @Transactional 어노테이션은 인터페이스에 추가하는 대신 구체적인 클래스 및 메소드에 달도록 권장하고 있다. Spring은 인터페이스에 주석을 추가하는 대신 @Transactional 주석으로 구체적인 클래스 (및 구체적인 클래스의 메서드)에만 주석을 달도록 권장합니다. 인터페이스 (또는 인터페이스 메소드)에 @Transactional 어노테이션을 배치 할 수 있지만 이는 인터페이스 기반 프록시를 사용하는 경우 예상 한 대로만 작동합니다. Java 주석이 인터페이스에서 상속되지 않는다는 사실은 클래스 기반 프록시 (proxy-target-class = “true”) .. 2024. 2. 4.
[Self-Invocation]@Transactional 어느 Layer에 두는게 맞을까? (1) 개요 프로젝트 진행중, 내가 작성한 코드가 @Transactional 어노테이션을 무의식적으로 Service 패키지 안에, 메소드 선언만 하는 인터페이스인 PostSaveUseCase와, 선언된 메소드의 구현체가 있는 PostSaveService 의 메소드 두군데에다 선언을 하고 있는것이 눈에 들어왔다. 아래 코드에서 선언한 방식만 봐도 알 수 있듯 @Transactional을 사용할때, 나는 그저 트랜젝션이 시작되었을때 다른시점에 시작된 트랜젝션과 서로 영향을 줄수 없어 격리성이 유지되며 에러 발생시 Rollback 하는 방법으로 일부만 남아있는것이 아닌 정상 전체저장 비정상 전체롤백을 통해 그 원자성을 유지함. 영속성 컨텍스트의 엔티티 자원관리 기능을 효율적으로 사용하기 위함. 이 두가지에만 초점을 .. 2024. 2. 4.