스프링/스프링 MVC 패턴
-
포맷터 - Formatter스프링/스프링 MVC 패턴 2023. 3. 7. 17:12
보통 문자 -> 다른 타입 혹은 다른 타입 -> 문자의 변환을 많이 사용한다. 스프링에서는 포맷터라는 문자의 자동 변환 기능을 제공한다. MyNumberFormatter.class @Slf4j public class MyNumberFormatter implements Formatter { // Number는 integer, double, long 등 숫자 형태 타입의 부모 @Override public Number parse(String text, Locale locale) throws ParseException { log.info("text={}, locale={}", text, locale); // "1,000" -> 1000 NumberFormat format = NumberFormat.getIns..
-
스프링 타입 컨버터스프링/스프링 MVC 패턴 2023. 3. 7. 15:14
반환 타입을 수정해야할 일이 있다. 스프링은 컨버터라는 변환기로 타입의 변환을 자동으로 시켜준다. 컨버터 직접 구현 @Getter @EqualsAndHashCode public class IpPort { private String ip; private int port; public IpPort(String ip, int port) { this.ip = ip; this.port = port; } } ipPort라는 타입을 만들어주고 stirng 타입에서 IpPort 타입으로 변경해 볼 것이다. @Slf4j public class StringToIntegerConverter implements Converter { @Override public Integer convert(String source) { lo..
-
스프링 API 예외처리 - @ExceptionHandler (대부분 쓰임)스프링/스프링 MVC 패턴 2023. 3. 5. 15:41
API 예외처리의 어려운 점 - 특정 컨트롤러에서만 발생하는 예외를 처리하기 어렵다. - 회원 처리하는 컨트롤러에서 발생한 RuntimeException 예외와 상품을 관리하는 컨트롤러에서 발생한 RuntimeException 예외를 서로 다른 방식으로 처리하고 싶다면?? 이러한 단점들을 보완하기 위해서 @ExceptionHanlder를 사용하면 된다. @Slf4j @RestController public class ApiExceptionV2Controller { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(IllegalArgumentException.class) public ErrorResult illegalExHandler(IllegalArg..
-
API 예외처리 - 스프링 ExceptionResolver스프링/스프링 MVC 패턴 2023. 3. 5. 15:10
BadRequestException.class를 새로 생성했다. @ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "잘못된 요청 오류") public class BadRequestException extends RuntimeException { } @ResponseStauts 애노테이션은 상태를 설정할 수 있게 도와주는 애노테이션이다. code = HttpStauts.BAD_REQUEST를 통해 400 에러로 변경시켰다. @GetMapping("/api/response-status-ex1") public String responseStatusEx1() { throw new BadRequestException(); } 컨트롤러에서 url을 매핑해주고 thr..
-
API 예외처리 - HandlerExceptionResolver스프링/스프링 MVC 패턴 2023. 3. 5. 14:30
HTML이 아니라 API에서 예외를 처리해야할 상황이 있다. 그 때는 HTML처럼 뷰 템플릿을 보여주는 것이 아니라 Json 방식으로 사용자에게 전달해야한다. @Slf4j @RestController public class ApiExceptionController { @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 Member..
-
스프링 부트의 오류 페이지스프링/스프링 MVC 패턴 2023. 3. 3. 22:38
스프링 부트에서 오류가 나면 자동으로 페이지를 연결해주는 기능이 있다. 뷰 템플릿은 resource/templates/error/~~~~~.html 이라는 정해진 규칙이 있어서 여기에 html 파일을 넣으면 된다. 404 오류 발생시 @Slf4j @Controller public class ServletExController { @GetMapping("/error-404") public void error404(HttpServletResponse response) throws IOException { response.sendError(404, "404 오류!"); } 404.html 404 오류 화면 스프링 부트 제공 오류 화면 입니다. 400 에러 발생시 @GetMapping("/error-400") ..
-
스프링 인터셉터 (서블릿 필터 상위 기능)스프링/스프링 MVC 패턴 2023. 3. 1. 16:44
스프링 인터셉터는 서블릿 필터와 비슷하지만 서블릿 필터보다 더 많은 기능을 지원하고 정교하게 사용할 수 있다. 스프링 인터셉터 흐름 HTTP 요청 ---> WAS ---> 필터 ---> 서블릿 ---> 스프링 인터셉터 ---> 컨트롤러 스프링 인터셉터 또한 체인 형식이라 인터셉터를 여러개 넣을수도 있다. preHandle : 컨트롤러 요청 전에 호출 - preHandle의 응답값이 true면 다음으로 진행하고 false면 인터셉트, 핸들러 어댑터 전부 호출하지 않는다. postHandle : 컨트롤러 요청 후에 호출 afterCompletion : http 최종 요청 후에 호출 (뷰가 렌더링 된 이후에 호출) 컨트롤러에서 예외가 발생하면 postHandle은 호출되지 않는다. 하지만 afterComple..
-
서블릿 필터스프링/스프링 MVC 패턴 2023. 3. 1. 15:42
로그인이 된 사용자만 상품 관리 페이지에 들어갈 수 있어야 하는데 로그인을 하지 않은 사용자가 URL을 직접 호출하면 상품 관리 화면에 들어가서 기능들을 사용할 수 있다. 웹에 관련된 공통 관심사를 처리할 때에는 서블릿 필터나 스프링 인터셉터를 사용하는 것이 좋다. 이 글에서는 서블릿 필터에 대해 배우도록 하겠다. 필터 흐름 HTTP 요청 ---> WAS ---> 필터 ---> 서블릿 ---> 컨트롤러 필터를 적용하면 피터가 호출된 다음에 서블릿이 호출되며 특정 URL 패턴에 적용할 수 있다. 로그인 한 사용자는 필터, 서블릿을 건너서 컨트롤러까지 호출하는데 로그인을 하지 않은 사용자는 필터에서 요청을 끝내버릴 수 있다. 로그인 여부 등을 체크하기에 좋은 기능이다. 필터는 체인으로 구성되기 때문에 필터를..