분류 전체보기 1341

Ch10. 스프링 타입 컨버터 소개 - 스프링 타입 컨버터

문자를 숫자로 변환하거나, 반대로 숫자를 문자로 변환해야 하는 것처럼 애플리케이션을 개발하다 보면 타입을 변환해야 하는 경우가 상당히 많다 @GetMapping("/hello-v1") public String helloV1(HttpServletRequest request){ String data = request.getParameter("data");//문자 타입 조회 Integer intValue = Integer.valueOf(data);//숫자 타입으로 변경 System.out.println("intValue = " + intValue); return "ok"; } HTTP 요청 파라미터는 모두 문자로 처리된다 따라서 요청 파라미터를 자바에서 다른 타입으로 변환해서 사용하고 싶으면 숫자 타입으로 변..

Ch09. API 예외 처리 - @ControllerAdvice

@ExceptionHandler를 사용해서 예외를 깔끔하게 처리할 수 있게 되었지만, 정상 코드와 예외 처리 코드가 하나의 컨트롤러에 섞여 있다. @ControllerAdvice 또는 @RestControllerAdvice를 사용하면 둘을 분리할 수 있다 @Slf4j @RestControllerAdvice(basePackages = "hello.exception.api") public class ExControllerAdvice { @ResponseStatus(HttpStatus.BAD_REQUEST) //해당 어노테이션을 붙여서 상태코드를 원하는 값으로 반환해 줄수 있다 @ExceptionHandler(IllegalArgumentException.class) public ErrorResult illeg..

Ch09. API 예외 처리 - 스프링이 제공하는 ExceptionResolver

스프링 부트가 기본으로 제공하는 ExceptionResolver는 다음과 같다. ExceptionHandlerExceptionResolver ResponseStatusExceptionResolver DefaultHandlerExceptionResolver -> 우선순위가 가장 낮다. ResponseStatusExceptionResolver HTTP 상태 코드를 지정해준다. 다음 두가지 경우를 처리해 준다 @ResponseStatus 가 달려있는 예외 ResponseStatusException 예외 BadRequestException @ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "error.bad") //400 코드로 변경 public class Ba..

Ch09. API 예외 처리 - HandlerExceptionResolver

상태 코드 변환 IllegalArgumentException을 처리하지 못해 밖으로 넘어가는 일이 발생하면 Client에러인 400 에러를 주고 싶다. 어떻게 해야 할까? @GetMapping("/api/members/{id}") public MemberDto getMember(@PathVariable("id") String id){ if(id.equals("ex")){ throw new RuntimeException("잘못된 사용자"); } if(id.equals("bad")){ throw new IllegalArgumentException("잘못된 입력 값"); } return new MemberDto(id, "hello " + id); } id 가 bad로 들어오게 되면 IllegalArgument..

Ch09. API 예외 처리 - 스프링 부트 기본 오류 처리

API 예외 처리도 스프링 부트가 제공하는 기본 오류 방식을 사용할 수 있다. BasicErrorController public BasicErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties, List errorViewResolvers) { super(errorAttributes, errorViewResolvers); Assert.notNull(errorProperties, "ErrorProperties must not be null"); this.errorProperties = errorProperties; } @RequestMapping(produces = MediaType.TEXT_HTML_VALUE) pub..

Ch09. API 예외 처리 - API 예외 처리 시작

API 예외 처리는 어떻게 해야 할까? 오류 페이지는 단순히 고객에게 오류 화면을 보여주고 끝이지만, API는 각 오류 상황에 맞는 오류 응답 스펙을 정하고, JSON으로 데이터를 내려주어야 한다 ApiController @Slf4j @RestController public class ApiExceptionController { @GetMapping("/api/members/{id}") public MemberDto getMember(@PathVariable("id") String id){ if(id.equals("ex")){ throw new RuntimeException("잘못된 사용자"); } return new MemberDto(id, "hello " + id); } @Data @AllArgsCo..

Ch08. 예외 처리와 오류 페이지 - 스프링 부트(오류 페이지)

지금까지 예외 처리 페이지를 만들기 위해서 다음과 같은 복잡한 과정을 거쳤다. WebServerCustomizer를 만들기 예외 종류에 따라서 ErrorPage 를 추가 예외 처리용 컨트롤러 ErrorPageController 를 만듦 스프링 부트는 이런 과정을 모두 기본으로 제공한다. ErrorPage를 자동으로 등록한다. 이때 /error라는 경로로 기본 오류 페이지를 설정한다. new ErrorPage("/error") , 상태 코드와 예외를 설정하지 않으면 기본 오류 페이지로 사용된다. 서블릿 밖으로 예외가 발생하거나, response.sendError(...)가 호출되면 모든 오류는 /error를 호출하게 된다. BasicErrorController라는 스프링 컨트롤러를 자동으로 등록한다. Er..

Ch08. 예외 처리와 오류 페이지 - 서블릿 예외 처리

순수 서블릿 컨테이너는 예외를 어떻게 처리하는지 알아보자 서블릿은 2가지 방식으로 예외 처리를 지원 Exception(예외) response.sendError(Http 상태 코드, 오류 메시지) Exception Java 에서 직접 실행 실행 도중에 예외를 잡지 못하고 처음 실행한 main() 메서드를 넘어서 예외가 던져지면, 예외 정보를 남기고 해당 쓰레드는 종료된다 웹 어플리케이션 웹 애플리케이션은 사용자 요청 별로 별도의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 실행된다. 애플리케이션에서 예외가 발생했는데, 어디선가 try ~ catch로 예외를 잡아서 처리하면 아무런 문제가 없다 그런데 만약에 애플리케이션에서 예외를 잡지 못하고, 서블릿 밖으로 까지 예외가 전달되면 어떻게 동작할까? WAS(여기..

Ch07. 로그인 처리(필터, 인터셉터) - ArgumentResolver 활용

Annotation 생성 @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface Login { } @Target(ElementType.PARAMETER) : 파라미터에만 사용 @Retention(RetentionPolicy.RUNTIME) : 리플렉션 등을 활용할 수 있도록 런타임까지 애노테이션 정보가 남아있음 HomeController 추가 @GetMapping("/") public String homeLoginV3ArgumentResolver(@Login Member member, Model model) { //세션에 회원 데이터가 없으면 Home if(member == null){ return "home..

Ch07. 로그인 처리(필터, 인터셉터) - 스프링 인터셉터

스프링 인터셉터도 서블릿 필터와 같이 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술이다. 서블릿 필터가 서블릿이 제공하는 기술이라면, 스프링 인터셉터는 스프링 MVC가 제공하는 기술이다. 둘 다 웹과 관련된 공통 관심 사항을 처리하지만, 적용되는 순서와 범위, 그리고 사용방법이 다르다 스프링 인터셉터 흐름 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러 스프링 인터셉터는 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출된다. 스프링 인터셉터는 스프링 MVC가 제공하는 기능이기 때문에 결국 디스패처 서블릿 이후에 등장하게 된다 스프링 인터셉터에도 URL 패턴을 적용할 수 있는데, 서블릿 URL 패턴과는 다르고, 매우 정밀하게 설정할 수 있다..