MDC란? (Mapped Diagnostic Context)**MDC는 로깅 프레임워크가 관리하는 “쓰레드 로컬 컨텍스트 저장소”**입니다.키-값 형태(traceId, userId, path 등)를 넣어두면, 로거 패턴에서 %X{traceId}처럼 꺼내 모든 로그 라인에 자동 포함시킬 수 있습니다.왜 필요한가동시 처리되는 요청의 로그가 섞여 보이는 문제 해결“이 에러가 어떤 요청에서, 어떤 사용자에게서 발생했는지”를 한 번에 필터링분산 환경(외부 호출, 마이크로서비스)에서 호출 체인 추적 근간 제공핵심 포인트MDC는 쓰레드 로컬입니다.→ 같은 쓰레드에서는 유지되지만, @Async처럼 스레드가 바뀌면 사라져요.→ 그래서 TaskDecorator로 컨텍스트를 복사/전파해야 합니다.반드시 요청 끝에서 MDC를..
Spring
오류 코드 (무한 루프)public MemberService(){ private final MemberService instance = new MemberService();} 무한 루프의 동작 원리final 키워드를 사용하면 해당 필드는 생성 시점에 반드시 초기화되어야 합니다.클래스 내부에서 다른 인스턴스를 생성하는 final 변수가 있다면, 이 필드를 초기화하기 위해 생성자가 호출될 때 새로운 인스턴스를 생성하게 됩니다.그런데 new MemberService()로 인스턴스를 생성할 때, 클래스 내에서 또 다른 new MemberService()가 호출되면 무한 재귀가 발생하게 됩니다.즉, 객체가 생성되기 전에 final 필드를 초기화하기 위한 과정에서 또 다른 객체 생성이 발생하므로 무한 루프에 빠지..

HTTP 메서드 매핑 PathVariable(경로 변수)URL 경로에 동일한 패턴의 가변 값을 받아서 처리하기 위할 때 사용/** * PathVariable 사용 * 변수명이 같으면 생략 가능 * @PathVariable("userId") String userId -> @PathVariable String userId */@GetMapping("/mapping/{userId}")public String mappingPath(@PathVariable("userId") String data) { log.info("mappingPath userId={}", data); return "ok";} 특정 조건 매핑파라미터헤더미디어 타입 조건 매핑 - HTTP 요청 Content-Type, consume미디어 타입..
FrontController vs 스프링 MVCFrontController => DispatcherServlethandlerMappingMap => HandlerMappingMyHandlerAdatper => HandlerMappingModelView => ModelAndViewviewResolver => ViewResolverMyView => View DispatcherServlet부모 클래스에서 HttpServlet을 상속 받아서 사용, 서블릿으로 동작DispatcherServlet => FrameworkServlet => HttpServletBean => HttpServlet스프링 부트는 DispatcherServlet을 서블릿으로 자동으로 등록모든 경로(urlPatterns="/")에 대해서 매..

V1 구조public class MemberControllerV1 implements ControllerV1 { @Override public void process(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException { String viewPath = "/WEB-INF/views/new-form.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request, response); }}@WebServlet(name = "frontControllerServlet..
개요너무 많은 역할하나의 서블릿이나 JSP만으로 비즈니스 로직과 뷰 렌더링까지 모두 처리하는 문제점너무 많은 역할 담당유지보수 어려워짐 변경의 라이프 사이클내부와 외부의 라이프 사이클이 다름UI 수정과 비즈니스 로직 수정은 각각 다르게 발생할 가능성이 매우 높음대부분 서로 영향을 주지 않는다분리되어 있기 때문에 함께 관리하는 것은 좋지 않다 기능 특화뷰 테플릿은 화면을 렌더링 하는데 최적화 되어 있기 때문에 분리하여 담당하는 것이 효과적이다 Model View Controller컨트롤러HTTP 요청을 받아서 파라미터를 검증하고, 비즈니스 로직을 실행한다. 그리고 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다모델뷰에 출력할 데이터를 담아둔다.뷰가 필요한 데이터를 모두 모델에 담아서 전달해주기에 뷰는 비..