Spring

JPA N+1 문제 해결하기 (fetch join, entityGraph, batch size) 서론 사이드 프로젝트를 같이 하는 동료와 이것저것 얘기하다가 N+1 문제에 대해서 이야기가 나왔다. 굉장히 단순하고 간단하게 알고있던 개념이었는데 계속 얘기하다보니 조금 헷갈리고 기존에 잘못 이해하고 있던 개념들도 있다는걸 알게되어서 이번 기회에 N+1 문제에 대해서 정확한 해결 방법을 정리해보려고 했다. 이후 나올 예시 코드를 테스트할 수 있는 컨트롤러, 서비스, 레파지토리는 아래 링크 레파지토리 안에 [nplusone] 패키지에서 확인할 수 있다. GitHub - yijoon009/blog-coding Contribute to yijoon009/blog-coding development by creatin..
테스트 코드의 가독성 향상: BDD 방법론 @DisplayName의 효과적 활용 서론 현대 소프트웨어 개발에서 테스트 코드는 단순히 기능의 정확성을 검증하는 것을 넘어, 코드의 명확한 문서화와 커뮤니케이션 도구로서 중요한 역할을 담당한다. 테스트 코드의 가독성을 향상시키는 데에는 여러 전략이 있지만, 이번 글에서는 우리 프로젝트에서 적용중인 BDD(Behavior-Driven Development)와 @DisplayName 어노테이션의 활용을 중점으로 설명하겠다. BDD란 무엇인가? BDD(Behavior-Driven Development)는 소프트웨어 개발 과정에서 행동(behavior)을 중심으로 하는 접근 방법이다. 이 방식은 Dan North에 의해 개발되었으며, TDD(Test-Driven De..
단위테스트에서 사용되는 Static 메소드를 Mock으로 주입할때 발생하는 문제 해결 방법 에러 발생 코드 일단 내가 단위 테스트를 진행하고 싶은 서비스는 아래와 같다. 사용자에게 받은 refresh token을 검증하고 유효한 토큰이면 TokenUtils의 static 메서드를 사용해 accessToken을 재발행해주는 로직이다. import lombok.RequiredArgsConstructor; import org.springframework.data.util.Pair; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time...
테스트 전략에서 단위 테스트와 통합 테스트의 차이점과 의존성 관리 TDD를 도입해서 개발을 하고 있지만 여전히 단위 테스트와 통합 테스트의 차이를 명확하게 알지 못해 테스트 코드를 작성하는데 오랜 시간이 걸렸다. 한번 두 개의 차이점을 제대로 이해하고 넘어가 볼 필요가 있어서 내가 이해한 대로 최대한 정리해 봤다. 단위 테스트 (Unit Test) 단위 테스트의 목적 단위 테스트는 개별 함수나 클래스가 독립적으로 올바르게 작동하는지 검증하는 데 중점을 둔다. 이 과정을 통해 각 컴포넌트가 예상대로 기능하는지 확인할 수 있다. 단위 테스트를 수행하는데 필수적인 요소 모의 객체(Mock) 사용 단위 테스트에서는 의존하는 외부 시스템이나 클래스를 모의 객체로 대체하여, 테스트 대상 코드의 기능을 독립적으로 검..
레이어 별 단위 테스트, 통합 테스트 전략 선택 스프링 부트 프로젝트에서 헥사고날 아키텍처를 적용했을때 TDD를 어떻게 적용해야하는지 우리가 고려했던 부분을 한번 정리해봤다. 아래 내용은 우리가 실제 프로젝트에 적용한 내용을 정리한 것이다. 이 방법이 절대적으로 옳은 방법이거나 정답은 아니라는 걸 명심해 줬으면 좋겠다. 또한 틀린 내용이 있을 수 있으니 언제든지 알려주면 좋겠다,, 전통적인 3-레이어 아키텍처에서의 TDD 전통적인 3-레이어 아키텍처(표현 계층, 비즈니스 로직 계층, 데이터 액세스 계층)에서 TDD를 적용할 때, 보통 다음과 같은 순서로 진행한다: 단위 테스트(Unit Testing): 가장 낮은 수준의 메서드(예: 데이터 액세스 메서드)에 대한 테스트를 먼저 작성하고, 이를 통과하도록 ..
스프링 시큐리티: 커스텀 에러 처리 실패 원인 분석 및 해결 방법 원하는 프로세스 스프링 시큐리티를 활용한 CustomAuthenticationProvider 클래스에서 이메일은 맞았는데 비밀번호가 틀렸을 때 커스텀 에러 클래스인 MemberApplicationException을 던지도록 설정했으나, 예상과 달리 NullPointerException이 발생하며 예외 처리가 제대로 이루어지지 않았다. 이에 대한 원인 분석 및 해결 방안을 제시해 보겠다. 정상 작동 안 된 실패 코드 스프링 시큐리티를 이용해 로그인을 시도할 때 비밀번호가 틀리면 내가 정의한 에러코드를 throw 하는 로직으로 개발했다. 아래는 CustomAuthenticationProvider 클래스에서 로그인 검증을 처리 중 비밀번호가 ..
회원가입 컨트롤러 테스트(Controller Test) - RequestDto @NotBlank 필드 검증 회원가입의 요청을 담아주는 SignUpRequestDto를 작성할때 필수값 누락을 방지하기 위해 @NotBlank 어노테이션을 사용했다. 이때 필수값이 누락되었을때 내가 정의한 에러 반환값이 잘 반환되는지 회원가입 Controller Test를 진행해보겠다. 1. 회원가입 API 구현: 데이터 유효성 검사 1-1. SignUpRequestDto: 필수 필드에 @NotBlank 사용 SignUpRequestDto 클래스는 회원가입 시 클라이언트로부터 받는 데이터를 정의한 Request Dto다. 이메일, 비밀번호, 전체 이름 등은 회원가입 과정에서 반드시 필요한 데이터이므로 @NotBlank를 사용하..
BCryptPasswordEncoder.encode를 이용해서 로그인 로직을 구현했을 때 로그인이 실패하는 이슈 발생 오류 발생 멤버 테이블에 사용자의 비밀번호는 암호화된 상태로 저장되어 있다. 로그인 프로세스에서 사용자가 입력한 이메일에 해당하는 멤버를 찾아, 그 멤버의 비밀번호와 사용자가 입력한 비밀번호를 암호화한 값이 일치하는지를 비교한다. 이 과정에서 사용된 암호화 클래스는 BCryptPasswordEncoder이다. 하지만, 사용자가 정확한 비밀번호를 입력해도 로그인이 실패하는 문제가 발생했다. 이는 로그인 로직의 비밀번호 확인 방식에 오류가 있었기 때문이다. 아래는 기존 코드다. LoginService 코드 import org.springframework.security.crypto.bcryp..
평양냉면7
'Spring' 카테고리의 글 목록 (4 Page)