DispatcherServlet Spring MVC의 핵심 요소인 DispatcherServlet은 Front Controller 역할을 하며,모든 요청을 중앙에서 처리하고 적절한 컴포넌트로 분배하는 역할1. DispatcherServlet 동작 개요클라이언트가 HTTP 요청을 보내면 DispatcherServlet이 이를 가로채고, 내부적으로 여러 컴포넌트(HandlerMapping, HandlerAdapter, ViewResolver 등)를 사용하여 요청을 처리한 후 응답을 반환합니다.2. DispatcherServlet의 요청 처리 흐름① 클라이언트 요청 수신클라이언트가 GET /api/users 같은 HTTP 요청을 보냅니다.Spring Boot 애플리케이션에서는 DispatcherServlet이..
기본적인 예외 처리 흐름Spring MVC에서 컨트롤러 또는 서비스 계층에서 예외가 발생하면, DispatcherServlet이 이를 감지하고 적절한 방식으로 처리합니다.컨트롤러 또는 서비스에서 예외 발생HandlerExceptionResolver가 예외를 처리할 수 있는지 확인등록된 예외 처리 로직(@ExceptionHandler, @ControllerAdvice 등) 실행예외가 처리되지 않으면 기본적인 Spring 예외 처리(DefaultHandlerExceptionResolver) 실행그래도 해결되지 않으면, sendError()를 호출하여 기본적인 HTTP 에러 응답 반환예외 처리 우선순위Spring MVC에서 예외가 발생하면 아래 순서로 처리됩니다.@ExceptionHandler (컨트롤러 단위..
@ValidJava의 표준 Bean Validation API(javax.validation.Valid)에서 제공단일 객체(단순 DTO)에 대한 유효성 검사 수행중첩 객체(내부 객체)도 함께 검사그룹(group) 검증 기능 없음import jakarta.validation.Valid;import jakarta.validation.constraints.NotNull;import jakarta.validation.constraints.Size;public class UserDto { @NotNull private String name; @Size(min = 6, message = "비밀번호는 최소 6자 이상이어야 합니다.") private String password; // Get..
@JsonProperty를 사용한 객체 매핑 (지원되지 않음)OpenFeign은 Jackson을 활용한 JSON 변환(Body 처리)을 지원하지만, 쿼리스트링(Query String) 변환에서는 @JsonProperty를 인식하지 않습니다.public class UserRequest { @JsonProperty("user_name") private String name; @JsonProperty("user_age") private int age; // 기본 생성자, Getter, Setter 생략}@FeignClient(name = "userClient", url = "http://example.com")public interface UserClient { @GetMapp..
Spring MVC에서 HTTP 요청의 데이터를 객체로 바인딩할 때 사용하는 어노테이션입니다.주로 폼 데이터를 DTO(또는 VO) 객체로 매핑할 때 사용됩니다.컨트롤러 메서드의 매개변수나 모델에 추가할 객체에 적용할 수 있습니다.HTTP 요청의 parameter(쿼리 스트링, 폼 데이터)를 자동으로 객체에 바인딩함.GET/POST 요청 모두 지원.내부적으로 setName(), setAge() 같은 setter 메서드를 사용하여 값을 할당함.import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.ann..
JPASQLQuery네이티브 SQL 쿼리를 생성하고 실행하기 위한 QueryDSL 클래스SQL 힌트나 기타 데이터베이스에 종속적인 설정(예: 인덱스 힌트)을 적용반면, JPAQuery는 JPQL을 생성하는 데 사용됩니다.JPQL은 데이터베이스 독립적인 추상화 계층을 제공하기 때문에,힌트나 플래그 같은 SQL 종속적인 요소를 직접 추가하는 기능을 지원하지 않습니다.addFlag()addFlag(QueryFlag.Position, String) 메서드는 쿼리에 특정 플래그를 추가하여 QueryDSL이 생성하는 SQL에 원하는 텍스트(예: SQL 힌트)를 삽입할 수 있도록 해줍니다.첫 번째 인자: 플래그를 삽입할 위치 (QueryFlag.Position)두 번째 인자: 삽입할 텍스트 (예: SQL 힌트)htt..
Spring Boot에서 템플릿 엔진으로 mustache를 사용할 때 key 값이 없으면 에러가 발생되는데 MustacheEnvironmentCollector로 default value 값을 설정할 수 있었다. @Bean public Mustache.Compiler mustacheCompiler( Mustache.TemplateLoader templateLoader, Environment environment) { MustacheEnvironmentCollector collector = new MustacheEnvironmentCollector(); collector.setEnvironment(environment); return Mustache.compiler() .defaultValue("Some D..
What? springdoc-openapi Swagger를 접속할 때 Fail to load remote configuration 에러 문구와 함께 swagger 접속 불가 Why? **/v3/api-docs/swagger-config 를 불러오지 못하는 문제 (404 Error) 로컬이나 서버 도메인으로 접속할 때는 정상 호출되지만 API Gateway를 통해 접속할 때 API path prefix가 변경될 때 이슈 비정상 호출 : http://apigw.com/v3/api-docs/swagger-config 정상 호출 : http://apigw.com/aa/v3/api-docs/swagger-config How? 아래 옵션을 .yml 에 추가해주면 해결된다. server: forward-headers..
@ControllerAdvice의 basePackages, annotations 속성으로 Controller 별로 Exception을 구분해서 처리할 수 있지만 URL Path 별로 구분하기는 어렵다. 아래처럼 동일 Exception을 구분해서 처리할 때는 @RequestMapping 으로 URL 을 구분할 수 있다. @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) @RequestMapping("/api/**") // Specify the URL path pattern public ResponseEntity handleApiExceptions(HttpServletRequest request,..
이슈 spring boot 2.4 업그레이드 후 bootstrap.yml 에 설정해둔 spring.config 제대로 동작하지 않고 부팅 시 에러 발생 No spring.config.import property has been defined Action: Add a spring.config.import=configserver: property to your configuration. If configuration is not required add spring.config.import=optional:configserver: instead. To disable this check, set spring.cloud.config.enabled=false or spring.cloud.config.import-c..