Development/Spring
-
Spring Controller Advice: Global vs. Custom AdviceDevelopment/Spring 2025. 3. 20. 11:00
Spring의 @ControllerAdvice는 애플리케이션 전역에서 발생하는 예외를 처리하는 강력한 도구이며 특정 컨트롤러나 패키지에 국한되지 않고 다양한 방식으로 활용할 수 있습니다. 자사 API 코드를 분석하던 중 Custom @ControllerAdvice에 MissingServletRequestParameterException 예외를 처리하도록 정의되어 있는 것을 확인했습니다. 하지만 이 예외는 Custom @ControllerAdvice에서 절대 처리되지 않는다는 사실을 알고 있었기 때문에 이를 Global @ControllerAdvice에서 정의해야 한다는 의견을 제안했습니다. 이 기회에 Custom @ControllerAdvice가 왜 MissingServletRequestParameter..
-
[Rest Docs]Test 없는 API 문서는 시한폭탄Development/Spring 2025. 2. 26. 22:43
개발자로 일하다 보면 코드를 작성하고 API를 설계하는 것만큼이나 문서화하는 과정이 중요하다는 걸 깨닫게 되는데 문서화는 단순히 기록하는 것이 아니라 팀원이나 다른 개발자와의 소통을 원활하게 하는 핵심 도구로 작용합니다.그러나 문서를 작성하는 과정에서 실수가 발생할 수 있으며 이를 제대로 검증하지 않으면 작은 오류가 큰 오해로 이어질 수 있기 때문에 이 글에서는 두 가지 문서화 방식을 비교하며 검증 과정이 왜 필요한지 살펴보겠습니다.1. 검증 없이 기록만 남기는 문서화아래는 검증 없이 API의 요청과 응답 형식만을 문서화한 코드입니다.public RestDocumentationResultHandler getTest() { return document("test", requestParam..
-
Spring Cloud Eureka와 Go의 만남Development/Spring 2025. 1. 6. 13:49
최근 Go 언어에 대한 흥미가 생겨 간단한 API 서버를 Go로 만들고 이를 Spring Eureka에 등록해보자는 생각이 들어서 이에 대한 방법을 작성했습니다.1. 필요한 PackageGo에서 사용할 패키지는 Gin과 eureka-client이며 설치하려면 Go 모듈을 사용하여 필요한 의존성들을 추가해야 합니다.go get github.com/gin-gonic/gingo get github.com/xuanbo/eureka-client2. Go 구현 코드package mainimport ( "fmt" "log" "net" "vaultis-go-module/module/decryption" "github.com/gin-gonic/gin" eureka "github.com/x..
-
[레거시 리팩토링] 상속을 넘어 컴포지션으로 가보자Development/Spring 2024. 12. 17. 23:11
문제점 : 깊은 상속 관계의 DTO 무리들...레거시 프로젝트에서는 각각의 DTO들이 모두 깊은 상속 관계를 갖은 채 하나씩 정의되어 있으며 해당 DTO를 사용해서 모든 행위에 대해 사용하고 있었습니다.불필요한 데이터 전송요청과 응답에 불필요한 필드들이 포함되어 있습니다.유지보수 어려움새로운 필드 추가시 모든 DTO를 검토해야 할 수 있습니다.리팩토링 방향 : 상속에서 컴포지션으로비록 정상적으로 작동하고 있지만 앞으로도 계속해서 사용될 제품이기 때문에 데이터 전송의 효율성과 유지 보수성을 개선하기 위해 리팩토링을 결정했습니다. 처음 리팩토링 관련 이야기를 했을때 "이미 동작하는 프로젝트를 굳이 수정할 필요가 있는가?"라는 반응이였지만 내가 생각하는 중요하다고 생각드는 점을 강조하며 설득했습니다.명확성요청..
-
DTO(Data Transfer Object)를 쓰는 이유?Development/Spring 2024. 11. 11. 12:50
"Controller에서는 DTO로 요청 정보를 받는 게 좋다."라는 말을 개발 공부를 시작했을 무렵 접하게 되었습니다.하지만 이유를 정확히 알지 못한 상태에서 사용해 오다가 이번에 JPA 공부를 하면서 그 의미를 더 깊이 이해하게 되었습니다. 해당 글에서는 Entity 대신 DTO를 사용해야 하는 이유를 정리했습니다.Entity와 DTO란 무엇일까?JPA와 같은 ORM(Object Relational Mapping) 기술을 사용할 때 Entity란 DB 테이블과 1:1로 매핑되는 클래스를 의미하며 각 필드는 테이블의 컬럼과 연결되어 애플리케이션에서 DB와 상호작용하는 도메인 모델의 역할을 합니다.DTO(Data Transfer Object)는 데이터 전송을 위한 전용 객체로써 주로 API 요청과 응답 ..
-
BeanPostProcessor 사용법: 빈 초기화 과정에서의 조작과 시점 이해하기Development/Spring 2024. 11. 7. 18:02
BeanPostProcessor는 Spring에서 빈이 등록되기 전 빈을 조작할 수 있는 강력한 기능입니다.빈 초기화 과정에서 BeanPostProcessor의 역할을 알아보고 @PostConstruct와의 실행 순서 차이에 따른 충돌 가능성을 알아보겠습니다.Bean이 등록되는 과정Spring Container가 빈을 등록할 때 간단하게 아래와 같은 순서로 진행됩니다.빈 정의 등록 - 빈 메타데이터를 등록합니다.빈 인스턴스 생성 - 빈 객체를 생성합니다. 의존성 주입 - 의존성을 주입합니다.빈 초기화 - 초기화 메소드를 호출합니다. 빈 등록 - 컨테이너에 등록합니다.BeanPostProcessor를 사용하면 빈 초기화 전후 단계에서 빈을 조작할 수 있습니다.※ BeanPostProcessor는 가장 우선..
-
[Spring] Proxy 내부 호출 문제 해결 및 순환 참조 문제 해결Development/Spring 2024. 8. 28. 17:35
Proxy 내부 호출@Component@Slf4jpublic class A { public void external() { log.info("external"); internal(); } public void internal() { log.info("internal"); }}---@Aspect@Slf4jpublic class AllAspect { @Before("execution(* *(..))") public void doA(JoinPoint joinPoint) { log.info("aop = {}", joinPoint.getSignature()); }}위 상황에서 external()을 호출하면 doA 메서드에서 작..
-
[Spring] Thread Local 사용 시 주의 사항Development/Spring 2024. 8. 3. 20:11
Java에서 기본적으로 제공하는 ThreadLocal은 동시성 문제를 해결하는 가장 기본적인 방법 중 하나입니다.ThreadLocal은 내부적으로 Map 자료 구조를 통해 각 Thread 별로 데이터를 저장하고 불러오기 때문에 각 Thread는 자신만의 데이터를 독립적으로 가질 수 있습니다.Thread와 ThreadPoolThread는 하나의 프로세스 내에서 실행 단위를 뜻합니다.Spring을 통해 웹 개발을 할 때 일반적으로 ThreadPool을 통해 Thread를 관리합니다.이러한 상황에서 ThreadLocal을 사용할 경우, 몇 가지 주의해야 할 점이 있습니다.주의사항 1. ThreadPool 재사용 문제ThreadPool에서는 Thread가 응답 후 사라지는 것이 아니고 다시 ThreadPool로..