본문 바로가기

분류 전체보기44

트랜잭션 트랜잭션은 데이터베이스에서 여러 작업을 하나의 논리적 단위로 묶어 처리하는 개념입니다.트랜잭션 내 모든 작업이 성공해야만 데이터베이스에 반영되며, 중간에 하나라도 실패하면 전체 작업이 롤백되어 원래 상태로 복구됩니다.이를 통해 데이터의 일관성과 무결성을 보장합니다. 트랜잭션은 ACID 원칙(원자성, 일관성, 고립성, 지속성)을 따르며, Spring에서는 @Transactional을 사용해 쉽게 관리할 수 있습니다.  ACID는 트랜잭션이 가져야 할, 데이터베이스 시스템에서 데이터의 일관성과 무결성을 보장하기 위한 원칙입니다. 원자성 : 트랜잭션 내에서 수행되는 작업들이 모두 성공하거나 모두 실패해야 합니다.돈 보내다가 실패하면 다시 원래 잔액으로 돌려줘야 함 일관성 : 트랜잭션이 완료되면, 작업 이전과 .. 2024. 10. 11.
QueryDSL을 사용하여 복잡한 동적 쿼리를 작성하는 방법 쿼리DSL : 타입 안정성 있게 쿼리를 작성하여, 복잡한 동적 쿼리를 사용할 수 있는 프레임워크타입 안전성: 쿼리 문자열을 사용하지 않고, 자바 코드 기반으로 쿼리를 작성하여 컴파일 시에 타입 오류를 잡을 수 있습니다.동적 쿼리 작성: QueryDSL을 사용하면 BooleanBuilder와 Predicate 를 이용하여 여러 조건을 동적으로 조합하고, 필요한 경우에만 조건을 추가할 수 있습니다.Q 클래스 사용: QueryDSL은 각 엔티티에 대해 자동으로 Q 클래스를 생성하여, 엔티티의 필드에 쉽게 접근할 수 있게 해줍니다. 동적 쿼리 사용 방법BooleanBuilder는 동적으로 조건을 추가할 수 있어서, 복잡한 쿼리를 작성할 때 유용합니다. 여러 조건을 and()나 or() 쿼리문을 사용해서 논리적으.. 2024. 10. 11.
단위 테스트와 통합 테스트의 차이점과 각각의 장단점 단위 테스트는 애플리케이션의 가장 작은 단위(보통 메서드나 클래스)를 개별적으로 테스트하는 방법입니다. 외부 의존성(DB, 외부 서비스 등)을 사용하지 않고, 주로 **모킹(Mock)**을 통해 의존성을 대체하여 테스트를 진행합니다.말 그대로 단위 테스트이기 때문에, 해당 범주에 들지 않는 다른 기능들에 대해서는 알 수 없습니다.하지만 빠르고, 독립적으로 테스트를 해볼 수 있습니다.  통합 테스트는 애플리케이션의 여러 모듈이나 컴포넌트가 함께 작동하는지, 그리고 외부 시스템(데이터베이스, API 등)과의 통합이 올바르게 이루어지는지를 확인하는 테스트입니다. 실제 환경과 유사하게 외부 자원을 포함한 전체 시스템을 테스트합니다.  외부 시스템과의 상호작용, 데이터 흐름, 통합 기능 등을 실제 환경과 유사한 .. 2024. 10. 11.
JPA에서 N+1 문제를 해결하기 위한 방법 N+1이란?제가 사용한 스프링의 JPA 프레임워크의 지연 로딩 방식을 사용한 경우에 생기는 성능 문제입니다.발생 원인은, 지연 로딩이 처음에는 연관된 데이터를 가져오지 않다가, 실제로 그 데이터를 참조할 때 쿼리가 추가로 실행되게 됩니다. N+1을 좀 더 자세히 풀어보자면,1은 처음 실행한 쿼리입니다. 무조건 발생되는 쿼리이고,이 뒤에 추가로 쿼리를 써야 되면서, 추가로 발생하는 쿼리의 수를 N이라고 부릅니다.그래서 추가로 발생되는 N을 최소화하는 것이 N+1 해결 방법이라고 할 수 있습니다.  N+1을 해결하는 방법은?여러 방법이 있는 것으로 알고 있지만, 제가 사용해본 방법으로는, fetch Join 방법과 BatchSize 방법을 사용해봤습니다.  fetch Join상황에 따라서 완벽히 N+1문제를.. 2024. 10. 11.
JPA에서 Lazy Loading과 Eager Loading의 차이점과 각각의 장단점 지연 로딩 : 엔티티를 조회할 때, 연관된 엔티티를 바로 불러오는 것이 아니라, 실제로 불러와야 되는 시점에 불러오는 방식입니다.장점 : 불필요한 데이터는 불러오지 않기 때문에, 성능 향상과 메모리 절약이 됩니다.단점 : 이거 로딩보다 비교적 N+1 문제가 잦게 발생합니다.지연 로딩을 사용하는 경우, 어떤 시점에 쿼리가 발생할지 예측하기 어렵습니다. 연관된 엔티티에 접근할 때마다 쿼리가 실행되기 때문에, 성능 문제를 디버깅하거나 최적화할 때 어려움이 있을 수 있습니다.즉시 로딩 : 엔티티를 조회할 때, 연관된 모든 엔티티들을 함께 불러옵니다.장점 : 한번에 다 불러오기 때문에, 알맞은 상황에서는 레이지 로딩보다 비교적 빠르고 간단하게 조회할 수 있습니다.단점 : 모든 데이터를 불러와서 사용하는 경우가 아.. 2024. 10. 11.
기간 검색에서 시작일 또는 종료일이 없을 경우 발생한 문제 개선 제가 처음 구현한 방식에서는 시작일 또는 종료일을 지정하지 않은 경우, 모든 기간의 Todo가 검색되는 일이 생겼습니다.  기간을 둘 다 넣은 경우 : 정상 작동(생성 날짜와 title을 같게 세팅했습니다.)  둘 중 하나라도 넣지 않은 경우, 시작일 이전 또는 종료일 이후의 결과도 나오고 있습니다.   코드처음에 between 메서드로 기간 검색을 구현한 코드(시작일 또는 종료일 둘 중 하나라도 없으면 기간 검색 자체가 되지 않음) @Override public Page searchTodo(Pageable pageable, String title, LocalDateTime startDateTime, LocalDateTime endDateTime, String nickname){ .. 2024. 10. 11.