spring 86

spring 기초, 심화 몇가지 정리

DispatcherServlet이란?Spring MVC는 DispatcherServlet을 중심으로 동작하는 웹 프레임워크입니다.사용자의 요청이 들어오면 DispatcherServlet이 가장 먼저 요청을 받습니다.이후 요청 URL에 맞는 컨트롤러를 찾기 위해 HandlerMapping을 통해 적절한 핸들러(컨트롤러)를 조회하고, HandlerAdapter를 통해 해당 컨트롤러를 실행할 수 있도록 지원합니다.컨트롤러는 비즈니스 로직을 처리한 후, ModelAndView 객체나 단순 객체(JSON 응답)를 반환합니다.반환 결과가 객체(JSON) 라면, HttpMessageConverter가 이를 JSON 등으로 변환하여 응답 본문에 담습니다.반면에 반환 결과가 View 이름(String) 이라면, View..

spring 2025.06.05

DDD 4계층 구조와 역방향 의존성

계층 구조란관심사 분리를 위한 아키텍처 구조로 각 계층이 자기 역할만 수행하고, 상위 계층만 참조하는 것이다. DDD란Domain-Driven Design (Domain-Driven Design)은 소프트웨어 개발 방법론 중 하나로, 복잡한 도메인을 이해하고 효과적으로 모델링하기 위해 사용되는 개발 철학과 방법이다. 도메인 주도 설계라고도 부르는데, 도메인에 집중하며 도메인의 복잡성을 최소화하기 위해 소프트웨어를 설계하고 개발한다. 위에서 말하는 도메인 모델이란 도메인의 핵심 개념과 규칙을 객체로 표현한 것을 말한다. 도메인 자체를 표현하는 개념적인 모델을 의미하지만, 도메인 계층을 구현할 때 사용하는 객체 모델을 언급할 때에도 '도메인 모델'이란 용어를 사용한다. 비즈니스 로직을 담고 있으며, 도메인 ..

spring 2025.05.15

spring 요청처리 흐름과 흐름에 따른 에러처리 문제

spring 요청 흐름외부 요청에 따라 내부적으로 어떤 흐름을 거치고 각 요청에 대한 범위 목적에 대해 정리하고자 한다. 외부 요청에 따라 크게 필터, 인터셉터, 디스패처 서블릿, AOP, 컨트롤러가 어느 흐름과 목적을 가지는지 정리하자.위이미지를 기반으로 설명하고자 한다. Filter - 필터는 요청과 반환 맨 앞 단에 존재한다. 필터는 스프링의 기능이 아닌 자바 서블릿의 기능이다.Filter Chain을 통한 연쇄 기능을 동작하게 할 수 있다. 서블릿 컨테이너가 관리하며 WAS가 관리하게 된다. HTTP 요청을 가로채 기능하며 인증, 로깅 CORS 처리 등을 한다. Dispatcher Servlet - 여기서부터는 spring context 내부이다. Interceptor, Controller, E..

spring 2025.05.12

스케줄러 성능 체크 및 한계점 최적화

기존 DB Polling 방식을 사용하던 알림 도메인 스케줄러를 리팩토링 하기로 했다. 이유 - DB polling 방식의 한계점과 아키텍처 구성에 대해다. 한계점조회 주기 고정 - 정해진 시간에 따라 전체적으로 동작하기 때문에 실시간성이 떨어진다.DB I/O 부하 - 스케줄 진행시 조건에 맞는 모든 알림 데이터를 쿼리해야 한다.트래픽 증가에 대한 병목 - 대량 데이터 처리시 조회와 처리가 지연된다.스케일 아웃이 복잡해짐 - 스케줄러를 다중으로 구성할 때 중복 처리 방지가 필요하다(ex) 분산락)특정 시간대 트래픽 증가 - 특정 시간에만 트래픽이 발생한다.순차 처리에 의한 시간 보장 불가 - 스케줄러 주기에 의존하기 때문에 대량 데이터를 처리할 시 실시간성을 보장하기 어려울 수 있다.장애 복구 및 유실시..

spring 2025.04.24

TIL 코드 수정(비동기) Mono

이번 포스팅은 WebClient를 통해 네이버 maps api를 요청하는 부분이 있는데 WebClient가 비동기를 통한 외부 요청에 쓰이는데 프로젝트에서는 처음 써보는 WebClient를 사용해보고 싶었고 추후 카프카를 추가할 예정이었으니 같은 비동기로 하면 좋을 것 같았고 사용해 본 적 없었기에 사용해 보고자 사용했었다. 카프카를 추가해 보았고 내부적으로 WebClient가 block돼서 동기적으로 흘러 있는 게 마음에 들지 않아 이마저 비동기로 만들어 두도록 하겠다. 비동기로 바꾸며 나오는 단어나 개념에 대해서 정리를 해두고자 한다. 우선 이전과 이후 코드를 확인하자. @Override public PostHubRouteResponseDto createHubRouteExecute(KafkaFr..

spring 2025.03.31

TIL Saga 패턴 사전 공부

오늘은 특강에서 Saga 패턴에 대해 강의해주셨는데 정말 좋은 강의였다. 알아보고 적용하고 싶은 마음이 커지기도 했고 직접 해보기 이전에 강의에서 나온 Saga 패턴에서 사용되는 부분들에 대해 이해가 부족한 느낌이 있어서 정확하게 알아보고 가기 위해 정리하고자 한다.한 부분에 대해 연관된 부분들을 모두 정리하려는 것은 아니고 강의 자료 회독하며 이 부분에 대해 내가 공부가 더 필요하겠다고 느끼는 부분에 대해서만 자세히 알아보고 정리해 보자. 우선 자료를 회독하며 더 알아보고자 하는 부분을 추려냈다.XA 프로토콜(2PC)OrchestratorHAOUTBOX 패턴Correlation IDs  위와 같이 추렸으며 각각 하나씩 자세하게 파헤쳐보자.XA 프로토콜(2PC)XA 프로토콜은 여러 DB나 리소스 간 분산..

spring 2025.03.29

TIL git conflict

오늘은 프로젝트 내용 회고하다 생각나고 나온 컨벤션 중 하나인 git conflict를 포스팅하고자 한다. git conflict는 충돌로 최신 버전의 브랜치를 2명의 사람 A, B가 각각 사용하고 있을 때 같은 코드에 대해 수정이 일어나게 되고 A가 먼저 merge를 한 후 B가 push를 진행하게 되고 merge를 할 때 conflict가 발생하게 된다.같은 버전을 pull을 받고 같은 코드에 대해 merge 된 브랜치에서의 동시 수정에 대해 충돌을 일으키게 되는 부분인 것이다.이 부분을 해결하기 위한 컨벤션을 정한 부분을 확인하도록 하자.문제가 일어나게 되는 부분에 대해서 flow를 그려보았고 해결 방법에 대해서 정한 컨벤션을 기입해 보았다.자동적으로 일어나게 되는 부분이 아닌 개발자가 직접 주의해..

spring 2025.03.27

TIL API 명세

오늘은 간편하게 프로젝트에서 API 구성한 것을 전체적으로 확인할 수 있는 스크립트를 확인하고 결과를 보도록 하자!프로젝트 구조 최상위에 스크립트를 구성하도록 하자. #!/bin/bashtotal_get_count=0total_post_count=0total_patch_count=0total_put_count=0total_delete_count=0echo "API Count Summary"echo "=========================="for module_path in $(find ./ -type d -mindepth 1 -maxdepth 1); do module_name=$(basename "$module_path") controller_path="$module_path/src/main/..

spring 2025.03.26

TIL 의존관계 역방향 제거

이번엔 인텔리 제이에서 제공해 주는 Dependency Structure Matrix를 통해 패키지간 의존성을 확인해 보자.인텔리제이 Ultimate에서는 기본적으로 제공해 준다. MSA에서 아키텍처에서 중요한 점은 서비스가 독립적이고 자율적으로 동작할 수 있도록 설계하는 것이다.독립적이고 자율적인 부분이 서비스들에 한정되는 것이 아닌 내부적으로도 적용이 된다.내부적인 계층 간에도 presentation -> application -> domain -> infrastructure의 방향으로 흐르게 되고 이때, 역행해서 다음 계층의 의존성을 가지면 안 되고 도메인은 순수히 다른 계층 및 특정 프레임 워크나 라이브러리에 종속되어선 안 된다.  이는 각 계층이 독립적으로 동작해 결합을 낮추고 응집을 높여 유지..

spring 2025.03.25

TIL 트러블 슈팅 Redis Cache

프로젝트 중 허브 쪽에 레디스로 캐싱한 부분이 실행이 불안전하다는 것을 테스트 중 확인하게 되었고 수정하게 되었다.어떤 문제가 있었는지 확인해 보고 다시 제대로 실행시켜 보자! 우선 문제가 되는 부분을 확인해보자.허브의 findById 부분에서 일어난 문제이며 아래 문제 되는 코드 들에서 공통된 문제가 발생했다. 한 번은 실행되지만 이후 캐싱에 대한 문제가 생겨 접근도 반환도 할 수 없게 되어 버렸다.@Override@Transactional(readOnly = true)@Cacheable(value = "hubs", key = "#result != null ? #result.hubId : 'defaultKey'")public GetHubResponseDto findByHubId(UUID hubId) {..

spring 2025.03.24
728x90