본문 바로가기

분류 전체보기159

[springdoc-openapi] 공통 에러 응답 설정하기 API 문서를 생성할 때 심플하면서 API를 직접 호출 할 수 있도록 Swagger를 주로 사용한다.그리고 Spring을 사용하여 Swagger를 사용하기 위해 springdoc-openapi를 사용한다.springdoc-openapi starter 의존성을 추가하고 서버 애플리케이션을 실행하면 Controller의 API 요청과 응답을 스캔하여 기본 API 문서가 생성된다. 하지만 서버 애플리케이션은 항상 정상 응답만 주는 것은 아니다.상황에 따라 만료된 토큰을 사용했을 때 인가 실패 응답을 주거나 예상치 못한 오류에 대한 응답을 줄 수도 있다.이번 포스팅에서는 Swagger에 전체 API에서 응답할 수 있는 공통적인 오류 응답을 추가하는 방법에 대해서 알아보도록 하겠다. 공통 오류 응답서비스 오류 시.. 2025. 5. 10.
여러 유저를 사용한 E2E test (RestAssured 사용) 플랫폼 서비스의 경우 서비스 내에서 다양한 역할이 존재하며, 도메인/서비스에 따라 구체적인 역할이 나뉘게 된다.간단한 커머스 서비스에 예로 들자면 다음과 같은 역할들이 있다.내부적으로 CS 처리나 운영에 있어 사용되는 Admin서비스를 통해 물건을 구매하는 Buyer서비스를 통해 물건을 판매하는 Seller 시스템에 따라 이러한 역할에 대한 계정 시스템이 분리될 수도 있지만,(특히 어드민은 사용자가 사용하는 서비스와 분리되기 때문에 어드민 계정 시스템은 서비스 계정 시스템과 분리되어 관리되는 경우가 있다)시스템에 따라 여러 역할이 모두 하나의 계정 시스템 내에서 관리되기도 한다. 그리고 '물품 구매와 구매 물품 리뷰'에 대해 다음과 같은 시나리오를 생각할 수 있다.Seller 역할을 가진 유저가 판매할 .. 2025. 5. 6.
AI 시대에 엔지니어에게 중요한 것은? 딥러닝 분야를 연구하기 위해 잠시 대학원 랩실에 몸을 담군적이 있는데이를 계기로 최근에 랩실 멤버들 대상으로 Introduction to Backend Engineering in the Era of AI를 주제로 세미나를 했다. 이와 관련하여 'AI 시대에 엔지니어에게 중요한 것은?' 이라는 주제로 글을 적어본다. 요즘은 LLM과 AI 툴들을 매우 낮은 비용(금액, 노력) 혹은 무료로 사용할 수 있다.그리고 이를 사용하는 방법과 노하우는 유튜브나 블로그, Github 등 모든 곳에 오픈되어 공개되어 있기 때문에 이제는 쓰는 것 자체는 누구나 어렵지 않게 할 수 있다. (비개발자라면 모든게 블랙박스이기에 조금은 어려울 수 있겠다) 또한 LLM으로 대변되는 AI로 인해 여러 산업 분야의 패러다임이 바뀌.. 2025. 4. 27.
Spring graceful shutdown (+ async, virtual thread) 배포나 scale-in 등의 이유로 Spring 서버 종료 시, 해당 서버가 처리하고 있는 HTTP 요청은 어떻게 될까?요청 처리를 중단하고 서버가 종료되기 보다는 요청 처리를 다 마친 뒤에 서버가 종료되는 것이 좋지 않을까? Spring에서는 프로세스 종료 시 처리하고 있는 요청을 끝까지 처리할 수 있도록 graceful shutdown 기능을 제공한다. 이번 포스팅에서는 Spring의 graceful shutdown 기능과 이를 비동기 작업에서 적용하는 방법에 대해서 알아보도록 하겠다.추가로 virtual thread 설정 시 TaskExecutor를 커스터마이징 해야하는 이유를 알아보도록 하겠다. graceful shutdown 설정graceful shutdown 설정을 하기 위해서 server.s.. 2025. 3. 9.
Kotlin + Spring MVC 사용 시 요청 List 필드에 null이 들어가는 경우 Java와 비교했을 때 Kotlin은 컴파일 타임에서의 null-safety를 가질 수 있다는 장점이 있다.이를 통해 NullPointerException과 같은 런타임 오류 발생을 줄이고 더욱 안전한 코드를 작성할 수 있다. 하지만 generic에 있어서는 얘기가 조금 달라질 수 있는데generic은 컴파일 타임에 타입 체크가 이루어져 타입 안정성을 보장하지만, 런타임에는 타입 정보가 삭제되는 타입 소거(type erasure)가 발생하며 이로 인해 Kotlin의 null-safety가 깨질 수도 있다. 이번 포스팅에서는 Kotlin과 Spring MVC를 사용할 때, 요청 List 내 element의 null-safety가 깨지는 케이스에 대해 알아보고 이에 대한 대처에 대해 알아보도록 하겠다. (코.. 2025. 3. 3.
Kotlin SpringBoot 환경에서 jOOQ 설정 JPA가 주는 개발의 편리함은 많은 사람들에 의해 검증되었지만, dirty checking과 같이 under the hood에서 동작하는 기능들로 인해 배포 후 운영 시에 마주치는 문제도 생기게된다.(관련해서 읽어보면 좋은 글: Hibernate 의 ‘불편한’ 편의 기능들) 가끔은 MyBatis를 쓰던 시절이 품은 조금 더 들지만 동작하는 방식은 명확해서 좋았던 것 같다.하지만 MyBatis를 쓰면서 생기는 가장 큰 불편함은 문자열로써 SQL query를 다루기 때문에 쿼리 상의 오류를 런타임에서나 알 수 있다는 것이다.반면 jOOQ의 경우 DB를 직접 스캔하여 query 용 class를 생성하는데 이 class를 사용하여 type safe 하게 SQL query를 사용할 수 있다.(DB를 스캔 방.. 2024. 12. 3.