반응형

Spring 21

Spring Boot 예외 처리 실전 가이드: @ControllerAdvice로 통합하기

"에러는 언제나 발생한다. 중요한 건 예쁘게, 일관되게, 의미 있게 처리하는 것."문제 상황: 예외는 늘 예상치 못하게 찾아온다실무에서 API 개발을 하다 보면, 가장 골치 아픈 것 중 하나가 바로 예외 처리다.처음엔 간단한 try-catch나 throw new RuntimeException() 정도로 시작하지만, 프로젝트 규모가 커지고 클라이언트가 붙기 시작하면 얘기가 달라진다.어떤 API는 500 에러를 내고,어떤 API는 그냥 null 리턴하고,어떤 API는 메시지도 없이 400만 띄운다.결국 클라이언트 개발자는 혼란스럽고, 서버 로그엔 에러 메시지가 뒤섞여 보기 어려워진다.나도 과거에 그런 문제를 겪었고, 그때부터 Spring Boot에서의 예외 처리를 통합적으로 설계하는 법을 정리하게 됐다.내가..

Spring 2025.08.04

Spring Boot 성능 개선기: 캐싱과 DB 튜닝으로 응답속도 2배 빠르게

"실제 서비스에서 직접 겪은 병목 문제, 어떻게 해결했는지 기록합니다"문제 상황: 느려지는 API, 그리고 답답한 사용자실무에서 운영 중인 API가 점점 느려진다는 이야기를 듣기 시작했다.처음에는 단순히 트래픽이 많아서 그런 줄 알았지만, 로그를 분석해보니 특정 API 호출에만 응답이 2~3초씩 걸리는 상황이 반복되고 있었다.특히 사용자 목록을 조회하는 /api/users나 특정 조건의 통계를 보여주는 /api/stats 같은 API에서 병목이 심했다.그 상태로 배포를 계속 진행했더니, 배포할수록 더 느려지고, 결국에는 클라이언트 쪽에서 요청 타임아웃이 나는 상황까지 갔다.그때부터 본격적으로 성능 개선 작업에 들어갔고, 크게 두 가지 방법으로 개선할 수 있었다.첫째, Redis 캐싱을 통한 조회 속도 향..

Spring 2025.07.31

RestTemplate vs WebClient 무엇을 써야 할까?

Spring Boot 개발을 하다 보면, 외부 API를 호출해야 하는 일이 정말 자주 생기죠. 이때 사용할 수 있는 대표적인 HTTP 클라이언트가 바로 RestTemplate과 WebClient입니다. 그런데 둘 중 뭘 써야 할지 고민해본 적 없으신가요? 저도 처음엔 "RestTemplate도 잘 되는데 굳이 WebClient로 바꿔야 하나?" 싶었거든요.이번 글에서는 실제로 제가 겪은 실무 경험을 바탕으로, RestTemplate과 WebClient를 비교해보고 어떤 상황에서 어떤 걸 쓰는 게 좋은지 정리해볼게요. 이 글이 여러분의 선택에 조금이라도 도움이 되었으면 좋겠습니다!문제 상황: API 호출, 어떤 방식으로 할까?몇 달 전, 외부 인증 서버와 통신해야 하는 기능을 개발하게 되었어요. 이 기능은..

Spring 2025.07.23

[Spring] Restclient > proxy guide

이번에 팀 프로젝트에서 외부 공공 API를 연동하면서 Spring 6에서 새롭게 도입된 RestClient를 사용해볼 일이 있었다.기존에 쓰던 RestTemplate이나 WebClient랑 비교해도 꽤 직관적이고 깔끔해서 앞으로 메인으로 써볼 만하겠다는 생각이 들었는데, 프록시 환경에서 설정하는 과정에서 몇 가지 삽질이 있었다.이 글에서는 RestClient의 기본 설정부터, 프록시(proxy) 환경에서 어떻게 세팅하는지에 대해 내가 겪은 내용과 함께 정리해본다.RestClient에 대해 간단히 정리하면Spring 6부터 등장한 RestClient는 기존의 RestTemplate보다 더 직관적이고 builder 기반으로 작성할 수 있는 HTTP 클라이언트다.내부적으로는 HttpComponentsClien..

Spring 2025.04.24

리액티브 프로그래밍 > RxJava와 Spring WebFlux 비교

리액티브 프로그래밍은 비동기 데이터 스트림과 이벤트 흐름을 처리하는 새로운 패러다임입니다.Java 환경에서 사용되는 RxJava와, Spring 생태계에서 제공하는 Spring WebFlux의 리액티브 기능에 대해 알아보고,각 기술의 예제 코드를 통해 설명해보겠습니다.1. 리액티브 프로그래밍 개념리액티브 프로그래밍은 다음과 같은 특징을 가지고 있습니다.비동기 처리: 데이터가 도착하는 대로 즉시 처리할 수 있음논블로킹 I/O: 요청이 끝날 때까지 기다리지 않고 다른 작업을 수행 가능데이터 스트림: 연속적으로 발생하는 데이터를 스트림으로 다룸백프레셔(Backpressure): 소비자가 데이터를 처리하지 못할 경우, 생산자가 데이터를 조절하는 메커니즘 제공이러한 개념은 고성능 서버, 실시간 애플리케이션, 그리..

Spring 2025.02.06

Spring MVC의 DispatcherServlet: 핵심 개념과 역할

Spring MVC는 Model-View-Controller (MVC) 디자인 패턴을 기반으로 하는 강력한 웹 애플리케이션 프레임워크입니다.이 구조에서 DispatcherServlet은 Spring MVC의 중심에 위치하며 중요한 역할을 담당합니다.이번 글에서는 DispatcherServlet의 역할, 동작 방식, 그리고 왜 중요한지에 대해 자세히 알아보겠습니다.1. DispatcherServlet이란?DispatcherServlet은 Spring Framework의 서블릿으로, 클라이언트 요청을 받아 다양한 처리 로직과 협력하며 적절한 응답을 생성하는 역할을 합니다. 간단히 말해, 웹 애플리케이션의 요청과 응답을 조율하는 "프론트 컨트롤러" 역할을 합니다.2. DispatcherServlet의 주요 역..

Spring 2024.12.24

Spring Boot Run: 내부 동작 과정과 Bean 등록

Spring Boot 애플리케이션을 실행할 때, 여러 단계의 과정을 거쳐 애플리케이션이 구동됩니다. 이 글에서는 Spring Boot의 실행 과정, Bean 등록 과정, 그리고 IOC(Inversion of Control)와 DI(Dependency Injection)가 이 과정에 어떻게 녹아있는지 정리합니다.1. Spring Boot Application 시작Spring Boot 애플리케이션은 @SpringBootApplication 어노테이션으로 시작합니다. 이 어노테이션은 세 가지 어노테이션을 포함합니다:@SpringBootConfiguration: @Configuration을 포함하며, Spring 컨텍스트를 위한 설정 클래스를 나타냅니다.@EnableAutoConfiguration: 클래스패스와..

Spring 2024.12.23

Java Spring MVC에서 ArgumentResolver

Spring MVC에서 ArgumentResolver는 컨트롤러 메서드의 매개변수를 처리하고 주입하는 데 사용되는 중요한 구성 요소입니다.이 글에서는 HandlerMethodArgumentResolver와 이를 활용하여 사용자 정의 로직을 구현하는 방법에 대해 설명하겠습니다.ArgumentResolver란 무엇인가?Spring MVC의 HandlerMethodArgumentResolver는 컨트롤러 메서드의 매개변수를 처리하는 전략 인터페이스입니다.이를 통해 HTTP 요청 데이터를 분석하거나 추가적인 비즈니스 로직을 적용하여 매개변수 값을 동적으로 생성할 수 있습니다.기본 동작 방식Spring MVC는 HTTP 요청을 처리하는 과정에서 컨트롤러 메서드와 매핑된 매개변수를 확인합니다.각 매개변수에 대해 등..

Spring 2024.12.22

Spring 디자인 패턴: 팩토리 메소드 패턴 vs 템플릿 메서드 패턴

토비의 스프링을 읽은 후 궁금한점을 기재하였습니다. Spring 프레임워크는 다양한 디자인 패턴을 활용하여 유연하고 확장 가능한 애플리케이션을 개발할 수 있도록 도와줍니다.그중 팩토리 메소드 패턴(Factory Method Pattern)과 템플릿 메서드 패턴(Template Method Pattern)은 자주 언급되는 패턴입니다.하지만 이 두 패턴은 목적과 활용 방식이 다르지만, 이해가 되지 않아서 서칭한 정보를 기재하였습니다.1. 팩토리 메소드 패턴 (Factory Method Pattern)정의팩토리 메소드 패턴은 객체의 생성 로직을 서브클래스에서 정의하도록 하여 객체 생성을 캡슐화하는 패턴입니다. 즉, 객체를 생성하는 책임을 서브클래스로 위임하여 클라이언트 코드가 특정 클래스에 의존하지 않도록 만..

Spring 2024.12.19

DAO의 개인적인 오해

DAO의 대해서 개인적인 오해를 하고 있었다이전 회사에서 진행한 프로젝트는 DAO를 마치 DTO처럼 사용하고 있었다.public class UserDao { private long userId; private String userName; private String email; private String password;}DB > DAO > DTO 순으로 데이터를 옮겨가며 사용하였고, 때문에 DAO는 그저 model이지만 db와 직접적으로 접근하는 객체로만 생각하고 있었다.하지만 토비의 스프링 책에서는 DAO를 model이 아닌 class로 정의하는 것을 보게되었다.public class UserDao { public long createUser(PostUserRe..

Spring 2024.12.17
반응형