728x90
HTML 폼 전송 방식 `application/x-www-form-urlencoded` : Form 태그에 enctype 옵션이 없으면 웹 브라우저가 요청 HTTP 메시지 헤더에 Content-Type 으로 추가 : 입력한 폼 데이터를 HTTP Body 에 & 로 구분하여 전송 : 파일 전송 불가`multipart/form-data` : Form 태그에 enctype 옵션을 지정해야 함 : 다른 종류의 여러 파일과 폼 내용 동시에 전송 가능 : 각각의 전송 항목이 구분되어 한 번에 전송됨 멀티파트 사용 옵션spring.servlet.multipart.max-file-size=1MBspring.servlet.multipart.max-request-size=10MB`max-file-size` : ..
컨버터새로운 타입을 만들어 변환하고 싶을 때, 컨버터를 만들어 등록하면 쉽게 사용할 수 있다. 컨버터 인터페이스public interface Converter { T convert(S source);}`S` 타입에서 `T` 타입으로 변환하는 것이다. > 참고 `org.springframework.core.convert.converter` 를 사용해야 한다. 사용 예시@Getter@EqualsAndHashCodepublic class IpPort { private String ip; private int port; public IpPort(String ip, int port) { this.ip = ip; this.port = port; }}public class IpPortToStr..
서블릿 API 에러 처리에러 페이지는 단순히 에러 페이지만 랜더링 하면 되지만,API 는 각 오류 상황에 맞는 응답 스펙을 정하고, 데이터를 JSON 으로 주어야 한다. 오류 페이지 컨트롤러에 JSON 응답을 해주는 메서드를 추가하면 된다.@RequestMapping(value = "/error-page/500", produces = MediaType.APPLICATION_JSON_VALUE)public ResponseEntity> errorPage500Api( HttpServletRequest request, HttpServletResponse response) { Map result = new HashMap(); Exception ex ..
서블릿 예외 처리스프링이 아닌 순수 서블릿 컨테이너는 다음 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:/";} 세션 쿠키로 설정하기 위해 쿠키에 시간 정보를 주지 않았다. `영속 쿠키` : 만료 날짜까지 유지`세..