728x90
서블릿 예외 처리스프링이 아닌 순수 서블릿 컨테이너는 다음 2가지 방식으로 예외 처리를 지원한다.- `Exception(예외 던지기)`- `response.sendError(HTTP 상태 코드, 오류 메시지)` Exception(예외)자바 직접 실행 : 자바의 main( ) 메서드를 넘어 예외가 던져지면, 예외 정보를 남기고 해당 쓰레드는 종료웹 애플리케이션 : 요청별로 별도의 쓰레드가 할당되고, 실행 : 예외가 발생했는데 예외를 잡지 못하면, WAS 까지 예외가 전달 : 컨트롤러(예외 발생) > 인터셉터 > 서블릿 > 필터 > WAS(여기까지 전파) : 스프링 부트가 제공하는 기본 예외 페이지 (WhiteLable 화면) : `server.error.whitelabel.enabled=false..
ArgumentResolver 활용ArgumentResolver 를 활용하면, 컨트롤러의 파라미터에서 공통적인 작업을 자동으로 처리할 수 있다.예시로 `@Login` 애노테이션을 만들어 로그인된 회원 정보를 세션에서 가져오는 작업을 자동화해보겠다. 1. 커스텀 애노테이션 @Login 생성 @Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)public @interface Login {}`@Target(ElementType.PARAMETER)` : 파라미터에만 사용`@Retention(RetentionPolicy.RUNTIME)` : 리플렉션 등 활용할 수 있도록 런타임에도 애노테이션 유지 2. LoginMemberArgumentResolve..
인터셉터스프링 인터셉터사용자 인가 없이 URL 을 직접 호출해서 페이지에 접속하는 것을 막아주는 역할을 한다.스프링 MVC 가 제공하는 기술로, 필터와 비슷하지만 필터보다 더 편리하고, 정교하다. 인터셉터 흐름HTTP 요청 > WAS > 필터 > 서블릿 > 인터셉터 > 컨트롤러 스프링 인터셉터는 디스패처 서블릿이 호출된 뒤, 컨트롤러 호출 직전에 호출된다.(스프링 MVC 가 제공하는 기술이기 때문에 스프링 MVC 시작점인 디스패처 서블릿 이후에 등장한다.)인터셉터에서 요청을 검토하여 적절하지 않은 요청이면 컨트롤러를 호출하지 않는다. 인터셉터 체인HTTP 요청 > WAS > 필터 > 서블릿 > 인터셉터1 > 인터셉터2 > 인터셉터3 > 컨트롤러 또한 인터셉터는 체인으로 구성되어 중간에 인터셉터를 추가할 ..
필터서블릿 필터사용자 인가 없이 URL 을 직접 호출해서 페이지에 접속하는 것을 막아주는 역할을 한다.서블릿이 제공하는 기술로, 인터셉터와 비슷하지만 인터셉터가 더 편리하고, 정교하다. 필터 흐름HTTP 요청 > WAS > 필터 > 서블릿 > 컨트롤러 필터가 호출된 다음 디스패처 서블릿이 호출되기 때문에,필터를 통해 요청을 검토하여 적절하지 않은 요청이면 디스패처 서블릿을 호출하지 않는다. 필터 체인HTTP 요청 > WAS > 필터1 > 필터2 > 필터3 > 서블릿 > 컨트롤러 또한 필터는 체인으로 구성되어 중간에 필터를 추가할 수 있다. 필터 인터페이스public interface Filter { public default void init(FilterConfig filterConfig) throw..
쿠키로그인사용자가 로그인에 성공하면 응답에 쿠키를 생성하여 리다이렉트 한다.@PostMapping("/login")public String login(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletResponse response) { ... Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId())); response.addCookie(idCookie); return "redirect:/";} 세션 쿠키로 설정하기 위해 쿠키에 시간 정보를 주지 않았다. `영속 쿠키` : 만료 날짜까지 유지`세..
Bean Validation검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고 표준화한 것이다. 우선 Bean Validation 을 사용하려면 다음 의존관계를 추가해야 한다.build.gradleimplementation 'org.springframework.boot:spring-boot-starter-validation' 해당 라이브러리를 넣으면, 자동으로 Bean Validator 를 인지하고, 스프링에 통합한다.그리고 LocalValidatorFactoryBean 을 자동으로 글로벌 Validator 로 등록한다. `@Valid`, `@Validated` 만 적용하면 되고,검증 오류가 발생하면 FieldError, ObjectError 를 생성하여 BindingReslut 에 담아준다.(이때 ..
검증 직접 처리...Map errors = new HashMap();// 필드 오류if (item.getQuantity() == null || item.getQuantity() >= 10000) { errors.put("quantity", "수량은 최대 9,999 까지 허용합니다.");}// 글로벌 오류if (item.getPrice() != null && item.getQuantity() != null) { int resultPrice = item.getPrice() * item.getQuantity(); if (resultPrice 이렇게 필드 오류와 글로벌 오류가 발생하면 errors 에 담아, errors 에 값이 있으면 다시 입력 폼이 있는 뷰 템플릿으로 보낸다. ...수량 필드 글로벌 ..
메시지 소스스프링은 다양한 메시지를 한 곳에서 관리할 수 있도록 메시지 기능을 제공한다.인터페이스 `MessageSource` 와 구현체 `ResourceBundleMessageSource` 를 스프링 빈으로 등록하면 된다.(스프링 부트를 사용하면 자동으로 등록한다.) 직접 등록@Beanpublic MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasenames("messages", "errors"); messageSource.setDefaultEncoding("utf-8"); return messageSource;}..