JPA N+1 문제가 발생하는 상황과 해결방법
·
Spring/JPA
이번 포스트에서는 JPA를 사용할 때 N+1 문제가 발생하는 상황과 3가지 해결방법을 알아보자 📌 서론 JPA에서 너무 많은 SQL 쿼리를 실행하는 것은 성능 문제의 가장 일반적인 원인 중 하나다. 잘못 구현되면, 아주 간단해 보이는 쿼리조차도 데이터베이스에 수십 또는 수백 개의 SQL 쿼리를 발생시킬 수 있다. 우리는 이런 문제를 n+1 쿼리 문제라고 한다. 이번 포스트에서는 이러한 N+1 문제에 대해서 다뤄보고자 한다. 1. N+1 문제가 발생하는 상황 설명 지금부터 N+1 문제가 발생하는 상황을 가정한다. 프로젝트 세팅은 다음과 같다. SpringBoot 3.2 Lombok org.projectlombok:lombok JPA Spring Data JPA DB PostgreSQL Querydsl 5...
주니어 개발자의 결합도(Coupling) 이해하기: 스프링에서 결합도 관리하기
·
Spring/Spring 기초 지식
결합도(Coupling)는 (클래스, 모듈, 함수 등) 간의 상호 의존성의 정도를 나타낸다. 📖 서론 개발 분야에서 "결합도(Coupling)"는 소프트웨어의 다양한 구성 요소 간의 상호 의존성의 정도를 나타내는 중요한 개념이다. 이는 소프트웨어 구조의 효율성과 유지보수의 용이성을 결정하는 핵심 요소 중 하나로, 소프트웨어 코드 간의 의존 관계의 정도를 나타낸다. 코드 사이에 강한 결합이 있으면, 한 부분이 바뀌었을 때 다른 부분에도 영향을 많이 준다. 그래서 우리는 보통 낮은 결합도를 유지하려고 한다. 낮은 결합도가 좋은 이유는 몇 가지가 있다. 1. 유지보수의 용이성: 낮은 결합도는 한 컴포넌트의 변경이 다른 컴포넌트에 미치는 영향을 줄여, 유지보수를 용이하게 해 준다. 2. 재사용성의 증가: 각 컴..
[Spring] 테스트: @ParameterizedTest 사용방법
·
Spring/테스트 코드
@ParameterizedTest를 사용하여 테스트 효율성을 높여보자 📌 서론 이번 포스트에서는 @ParameterizedTest를 사용해서 다양한 입력 값에 대한 테스트를 진행하는 방법을 살펴볼 것이다.이 방법으로 테스트 코드를 작성하는 것은 실제로 유효성 검사 같은 것들을 할 때 매우 유용하다. 지금부터 @ParameterizedTest를 사용하지 않을때와 사용할때를 비교해 보면서 왜 이 어노테이션을 통해 입력 값에 대한 테스트를 하는게 좋은지 비교해 보자 1. 테스트하려는 도메인의 비즈니스 로직 이해하기 먼저, 우리가 테스트할 도메인의 비즈니스 로직은 외부에서 validateBasicInfo() 메서드를 호출하면 내부에 담겨있는 변수들을 검증하는 로직이다. 이 메서드는 각 필드가 null이나 빈 문..
[Spring] 테스트 코드: @MockBean/@SpyBean 사용방법
·
Spring/테스트 코드
테스트 코드에서 @MockBean과 @SpyBean을 사용해서 이벤트 리스너 검증을 해보자 📌 서론 이전 포스트에서 열심히 스프링 이벤트 리스너에 대한 테스트 코드를 작성하고 검증했다. 나는 이 2가지 리스너 테스트를 한번에 성공시키고 싶어서 코드를 그대로 합쳐서 테스트를 진행했다. 그런데 테스트에서 오류가 발생했고 이것을 고치는데 생각보다 오랜 시간이 걸렸다. 그 이유는 테스트 코드에 대한 이해가 부족했기 때문인데 특히 @MockBean과 @SpyBean을 함께 사용할 때, 이 두 어노테이션이 어떻게 상호 작용하는지에 대한 이해가 부족했다. 지금부터 이 포스트에서는 두 가지 접근 방식을 비교하면서, 스프링 이벤트 리스너의 반응과 내부 동작을 어떻게 동시에 검증할 수 있는지 내가 겪은 내용을 토대로 설..
[Spring] 테스트 코드: @SpyBean으로 @EventListener 검증하기
·
Spring/테스트 코드
이번에는 스프링 이벤트 리스너의 내부 동작 테스트 코드를 통해 검증해 보자 📌 서론 이벤트 기반 아키텍처로 백엔드 개발을 진행할 때 이벤트 리스너가 호출되면 내부에서 작성했던 코드가 제대로 동작하는지 테스트하는 것은 애플리케이션의 정확성을 보장하는 데 굉장히 중요하다. 특히, 이벤트 리스너가 이벤트를 받아서 내부에서 어떤 처리를 하는지 확인하는 것이 중요하다. 이번 포스트에서는 RecipeCreationEvent 이벤트가 발행될 때 saveIngredientsIntoMongo 메서드의 내부에서 동작하는 메서드를 검증해 보자 저번 포스트에 이어지는 내용이니 보고 오시는 것을 추천합니다.👇🏻👇🏻 [Spring] 테스트 코드: @MockBean으로 @EventListener 검증하기 테스트 코드를 통해 스프링..
[Spring] 테스트 코드: @MockBean으로 @EventListener 검증하기
·
Spring/테스트 코드
테스트 코드를 통해 스프링 이벤트 리스너의 반응을 검증해 보자 📌 서론 스프링에서 Event-driven 아키텍처로 설계를 했을때 이벤트가 발행되면 리스너가 올바르게 반응하는지 테스트를 통해 검증하는 것은 매우 중요한 과정이라고 생각한다. 이번 포스트에서는 레시피를 생성하면서 스프링 이벤트(RecipeCreationEvent)를 발행했을 때 이 이벤트를 구독하고 있는 saveIngredientsIntoMongo 메서드가 제대로 호출되어 동작하는지 검증하는 테스트 코드를 작성하는 방법을 알아보자 1. 스프링 이벤트 리스너 코드 이해하기 아래의 코드는 설명을 이해하기 위해 알아야 할 SpringEventListener 클래스다. @Slf4j @Component @RequiredArgsConstructor p..
[Spring] 통합 테스트와 단위 테스트 비교하기
·
Spring/테스트 코드
통합테스트와 단위테스트를 작성하고 차이점을 비교해 보자 📌 서론 통합테스트 코드를 작성했는데 이런 생각이 들었다. "이걸 단위테스트 코드로 바꿔서 작성하면 기존 코드와 어떤 차이가 있을까? 그래서 당장 각 테스트 방법으로 코드를 작성하고 테스트를 해봤다. 지금부터 그 내용을 공유한다. 테스트를 하고자 하는 컨트롤러는 다음과 같다. 간단히 레시피를 생성하는 컨트롤러 메서드다. @RequestMapping("/recipe") @RequiredArgsConstructor @RestController public class RecipeController { private final CreateRecipeUseCase createRecipeUseCase; @PostMapping("/createRecipe") pu..
주니어 개발자의 테스트 코드 이해하기
·
Spring/테스트 코드
테스트 코드의 기초와 중요성을 알아보자 📌 서론 스프링부트로 백엔드 개발을 하다 보면 테스트 코드를 작성해야 한다는 말을 정말 많이 듣게 된다. 그래서 테스트 코드가 뭐길래 이렇게까지 얘기를 하는 걸까? 테스트 코드를 작성하기 전에 테스트 코드가 무엇인지와 어떤 tool을 사용해서 작성하는지에 대해서 간단히 이해해 보자 1. 테스트 코드의 중요성 테스트 코드는 개발 과정에서 매우 중요하다. 이를 통해 버그를 조기에 발견하고 소프트웨어의 안정성을 확보할 수 있다. 특히 스프링 부트에서는 다양한 도구와 라이브러리를 제공하여 테스트 코드 작성을 쉽게 해 준다. 이런 도구들을 사용함으로써, 개발자는 애플리케이션의 다양한 부분을 효율적으로 검증할 수 있고, 결과적으로 코드의 품질을 높일 수 있다. 또한, 테스트 ..