본문 바로가기

spring boot

(11)
[Spring Boot] ApplicationEventPublisher를 활용한 도메인 간 역할 분리 OOP 기반으로 애플리케이션을 설계하다 보면 자연스럽게 도메인 간의 영역, 역할, 책임에 대해 고민하게 된다.처음에는 기능이 정상 동작하는 것에 집중하지만, 시간이 지날수록 이런 질문이 반복된다."이 로직이 정말 이 도메인에 속하는 게 맞는가?" 예를 들어 주문이 생성되면 다음과 같은 작업이 연쇄적으로 발생할 수 있다.포인트 적립알림 발송감사 로그 기록외부 시스템 연동통계 집계이때 주문 서비스에서 관련 서비스들을 직접 호출하기 시작하면,주문 도메인이 여러 도메인에 강하게 결합된 중앙 허브가 되어버린다.이 방식은 초기 개발 속도는 빠르지만, 코드가 커질수록 다음과 같은 문제가발생한다.도메인 간 결합도 증가테스트 복잡도 상승변경 영향 범위 확대책임 집중사이드 이펙트 증가기능 확장 시 기존 코드 수정 필요이 ..
[Spring Boot] refreshVersions로 gradle 설정하기 멀티 모듈 프로젝트를 생성할 때, buildSrc를 활용한 Gradle 파일 모듈화는 거의 필수적이다.이 과정에서 더욱 편리한 관리가 가능하도록 refreshVersions을 활용한 Gradle 파일 모듈화 및 버전 관리를 적용해보자. plugins { // See https://jmfayard.github.io/refreshVersions id 'de.fayard.refreshVersions' version '0.60.5'}먼저 settings.gradle에서  rootProject.name 위에 refreshVersions 사용을 위한 plugins를 추가하자.더 자세한 내용을 보고 싶으면 해당 링크를 참조하면 된다. 추가를 하고 gradle 새로고침을 한 후 조금만 기다려보면version..
Spring Boot - ResponseBodyAdvice를 활용한 공통 응답 처리 Spring Boot에서 API의 응답을 표준화하거나, 공통 데이터를 추가하고 싶을 때는 @ControllerAdvice를 사용하여 응답을 가로채 변형할 수 있다.이때 핵심적인 역할을 하는 것이 바로 ResponseBodyAdvice 인터페이스이다.1. ResponseBodyAdvice란?Spring 공식 문서를 보면 ResponseBodyAdvice는 다음과 같이 설명되어 있다.@ResponseBody 또는 ResponseEntity를 사용하는 컨트롤러 메서드가 실행된 후, 응답 본문이 HttpMessageConverter를 통해 작성되기 전에 이를 수정할 수 있도록 해줍니다.해당 인터페이스의 구현체는 RequestMappingHandlerAdapter 및 ExceptionHandlerException..
Spring Boot - @RestController의 동작 과정과 MessageConverter Spring Boot에서 @RestController를 사용하면 일반적인 @Controller와 달리 ViewResolver가 관여하지 않고, MessageConverter가 실행된다. 이를 통해 API의 응답이 클라이언트가 원하는 형태(JSON, XML 등)로 변환된다. @RestController와 MessageCoverter의 동작 과정1. 핸들러 메서드 실행클라이언트가 요청을 보내면, Spring MVC는 적절한 @RestController의 핸들러 메서드를 실행한다.@RestControllerpublic class ExampleController { @GetMapping("/hello") public String hello() { return "Hello, World!";..
Spring Boot - 요청 프로세스와 검증 먼저 Spring Boot의 요청 처리 프로세스를 다시 한 번 알아보자1. 사용자로부터 요청이 들어온다. 2. DispatcherServlet이 받아서 Header에 저장된 부가적인 정보를 이용해서 요청 처리를 위임할 Controller를 찾는다 (HandlerMapping)3. 요청를 위임할 HandlerAdapter를 찾아서 전달한다.※ 직접 Controller로 요청을 위임하지 않는 이유는 Controller 구현 방식이 다양하기 때문에 Adapter 패턴을 적용해 컨트롤러의 구현 방식에 상관 없이 요청을 위임한다.4. HandlerAdpater가  Controller를 호출한다. 여기까지가 스프링 부트를 공부할 때, 평범하게 알고가는 요청 프로세스이다.여기서 조금 더 자세히 알아보자. Contro..
Spring Boot - RestTemplate를 사용한 Server To Server 연결(2) 이 전 포스트에서는 RestTemplate로 queryString과 header에 데이터를 담아서 GET요청을 보내는 법을 알아보았다. 이번에는 pathParameter와 지금까지 한 것들을 DTO로 바꿔서 유연하게 대응할 수 있는 코드로 리팩토링 해보자.  이전 포스트에서 마지막으로 완성된 client와 server는  public ResponseEntity hello() { // 요청 보낼 uri 생성 URI uri = UriComponentsBuilder .fromUriString("http://localhost:10000") // baseUrl .path("/api/server/hello") // 경로 .encode() // 인코딩 .build() ..
Spring Boot Interceptor란? Interceptor란Spring이 제공하는 기술로써, 디스패처 서블릿(Dispatcher Servlet)이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공한다Filter와 매우 유사한 형태로 존재하지만, 차이점은 Spring Context에 등록이 된다.AOP와 유사한 기능을 제공할 수 있으며, 주로 인증단계를 처리하거나, Logging하는 데에 사용한다.Interceptor 동작 위치 및 순서1. DispatcherServlet은 Request 객체를 받아서 분석한뒤 HandlerMapping에게 사용자의 요청을 처리할 핸들러를 찾도록 요청 한다.  2. 그결과로 HandlerExecutionChain이 동작하게 되는데, 이 HandlerExecutionChain은..
Spring Boot Filter란 Filter란Web Application에서 관리되는 영역으로써 Spring Boot Framework에서 Client로 부터 오는 요청/ 응답에 대해서 최초/ 최종 단계의 위치에 존재하며, 이를 통해서 요청/ 응답의 정보를 변경하거나, Spring에 의해서 데이터가 변환되기 전의 순수한 Client의 요청/ 응답 값을 확인할 수 있고 유일하게 ServletRequest, ServletResponse의 객체를 변환할 수 있다.주로 Spring Framework에서 request/ response의 Logging용도로 활용하거나, 인증과 관련된 Logic들을 해당 Filter에서 처리한다.또한 요청으로 들어온 정보중에 노출되면 위험한 정보들이 들어 있을 수 있어  DispatcherServlet 이 처리하..