본문 바로가기

JAVA30

[Java/Spring] 테스트 작성 시 JPA Repository를 분리하는 방법 DB 세팅에 들어가는 시간들 기존에 TDD 기반 테스트 코드를 작성 시 테스트용 DB를 따로 도커 컨테이너에 올려놓았다. 하지만 이 방법은 프로젝트 개발 기간이 늘어나고 코드양이 많아지고 DB에 생성되는 테이블의 갯수가 많아질수록 불편해졌다. 1. deleteAll()의 지옥 모든 테스트는 독립적으로 진행되어야 한다, 는 원칙에 맞춰 테스트를 할 때 마다 db의 데이터를 초기화 시켜주어야 했다. 때문에 모든 테스트에서 테이블 당 deleteAll()을 진행해주어야 했는데 이게 여간 불편했다. 먼저, 테이블 간 제약 조건이 늘어날수록 deleteAll 의 순서가 충돌을 일으키기도 하고 예외가 발생했을 때 삭제도 제대로 되지 않았다. 또 비즈니스 로직이 변경됨에 따라 기존에 테이블에서 구조가 확장될 때 기존.. 2025. 12. 24.
[회고] 2달간의 추가개발 프로젝트 진행하며(테스트코드, JPA Auditing) 테스트 작성 Arrange 단계에서의 변화실무에서 커서AI의 도움을 받아 TDD를 진행하며 테스트 코드는 600개이상이 쌓였다. 늘어가는 테스트 코드 갯수와 전체 테스트 통과와 함께 보이는 초록불을 보고 있으면 뿌듯한 마음이 든다. 이전부터 느꼈지만 테스트를 하기 위해 사전준비해야 하는 단계(Arrange)는 크게 3단계로 나뉜다. 1. deleteAllapi를 실행하고 테스트용 db에 i/o 를 함께 테스트하기 때문에 사전에 db를 청소해주는 단계가 필요하다. 이 단계가 없으면 이전 테스트 코드에 의해 현재 테스트 코드의 결과값이 오염될 수 있다. 그런데 이 단계를 설정하는데 은근히 많은 비용이 든다. 먼저 외래키 제약 조건을 고려해야 한다.테스트 db는 실제 db와 동일한 환경으로 구성되어 있고 외.. 2025. 11. 5.
Spring 3.4 querydsl5.0.0 초기 dependency 설정 공유 querydsl은 컴파일 시점에 Q클래스를 생성합니다. Q클래스는 도메인 엔티티에 대한 QueryDsl 전용 메타모델 클래스입니다. 이는 뒤에서 좀 더 설명하기로 하고 중요한 것은 이러한 점들을 고려하여 디펜던시 추가 및 설정을 추가하여야 할 부분이 있어 공유드립니다. plugins { id 'java' id 'war' id 'org.springframework.boot' version '3.4.3' id 'io.spring.dependency-management' version '1.1.7' // id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"}group = 'com.project'version = '0.0.1-SNAPSHOT'configuration.. 2025. 2. 22.
Spring boot 순환 참조 회피하기(구조 파악, 중재자 패턴, 지연 초기화) 순환 참조 사이드 프로젝트를 진행하며 순환 참조 오류가 발생하였습니다.  런타임에 로그가 정말 친절하게 어떤 부분에서 순환 참조 오류가 발생하였는지 설명해주었습니다. 순환 참조는 paragraphExtractorHandler 클래스가 controlAdditionalTextExtractor 클래스를 의존하는데 controlAdditionalTextExtractor 클래스도 paragraphExtractorHandler 클래스를 의존하고 있을때, 다시말해 두 클래스가 서로를 의존하고 있을 때 발생합니다. 프로젝트를 실행하면 스프링 컨테이너는 어노테이션으로 판단하여 빈을 생성합니다. 그리고 빈을 생성할 때 참조하는 클래스를 판단하여 의존성을 주입합니다. 이 때, 의존성을 주입하는 방법은 생성자 주입, sett.. 2025. 1. 25.
Spring AOP @Aspect를 활용하여 Logging 기능을 적용해보자. 서론 이 포스팅은 배움을 토대로 실제 개발중인 프로젝트에 Spring AOP를 사용한 로깅 기능을 어떻게 구현했는지에 대한 내용입니다. 그리고 그 배움은 김영한 선생님의 '스프링 핵심원리 - 고급편' 강좌를 참고하였습니다. 목표 구현하고자 한 기능은 다음과 같습니다.호출한 메소드를 계층 별 순서에 맞게 화살표와 띄어쓰기를 통해 구분한다.계층 별 메소드 호출 시작부터 종료까지의 시간을 구한다.메소드 파라미터를 함께 표시한다.hibernate 구현 쿼리문을 출력한다.예외 발생 시 별도 표시와 함께 예외 메시지를 출력한다.log의 형태는 다음과 같다.INFO 12-16 17:29:18 [788ecafc] |--> WorkPlanController.getWorkPlanList(WorkPlanSearch(stDa.. 2025. 1. 10.
[Spring] ControllerAdvice, ExceptionHandler, static factory method pattern을 사용하여 예외 처리하기 사설더보기인프런에서 김영한 선생님이 강의에서 종종 해주시는 말씀이 있다. 고객을 편하게 하려면 개발자가 불편해야 한다. 스프링 강의를 듣고 있으면 스프링을 사용하고 있는 내(고객)가 편하게 개발할 수 있게 스프링을 개발한 개발자들이 정말 많이 신경써서 개발했다는 것을 느낄 수 있다. 현재 새로운 프로젝트의 구조를 세우고 있는 상황인 나(개발자)도 어떻게 하면 개발자(고객)가 이 구조 안에서 더 편하게 개발을 할 수 있을까에 대해 고민하게 된다. 그리고 그 중 하나가 예외처리이다. 우리는 웹 안에서 발생하는 다양한 상황에 맞는 예외를 구현해야 한다. 그것을 좀 더 간편하게 하기 위해 스태틱 팩토리 메서드 패턴을 사용하여 구현해보고자 한다. 배경 예외처리는 현재 다음과 같이 만들어져 있다.@Getter@Al.. 2024. 12. 8.