스프링 (34) 썸네일형 리스트형 서블릿으로 예외 처리하기 스프링이 아닌 순수 서블릿 컨테이너는 예외를 어떻게 처리하는지 알아보겠습니다. 그래야 스프링 개발 중에 문제가 발생했을 경우 어디를 수정해야 할지 알 수 있기 때문입니다. 서블릿은 다음 2가지 방식으로 예외 처리를 지원합니다. Exception (예외) response.sendError(HTTP 상태 코드, 오류 메시지) 서블릿에서 예외 처리하는 방식 Exception(예외) 자바 직접 실행 자바의 메인 메서드를 직접 실행하는 경우 main이라는 이름의 쓰레드가 실행됩니다. 실행 도중에 예외를 잡지 못하고 처음 실행한 main() 메서드를 넘어서 예외가 던져지면, 예외 정보를 남기고 해당 스레드는 종료됩니다. 웹 애플리케이션 웹 애플리케이션은 사용자 요청별로 별도의 스레드가 할당되고, 서블릿 컨테이너 안.. 스프링 인터셉터에 ArgumentResolver 활용하기 지난번에 스프링 인터셉터로 로그인 인증을 구현했고, ArgumentResolver를 사용해 더 간단하게 구현하는 방법을 알아볼 예정입니다. 기존에 @SessionAttribute를 세션을 검증한 기능 @GetMapping("/") public String home(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) { // 세션에 회원 데이터가 없으면 home if (loginMember == null) { return "home"; } model.addAttribute("member", loginMember); return "loginHome"; } ArgumentReso.. 스프링 인터셉터를 사용해 로그인 인증 체크하기 스프링 인터셉터를 사용해 로그인 인증하는 것을 구현할 것입니다. 인터셉터 생성 @Slf4j public class LoginCheckInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestURI = request.getRequestURI(); log.info("인증 체크 인터셉터 실행 {}", requestURI); HttpSession session = request.getSession(false); if (session == n.. 스프링 인터셉터를 사용해 요청 로그 확인하기 스프링 인터셉터 소개 스프링 인터셉터도 서블릿 필터와 같이 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술입니다. 서블릿 필터가 서블릿이 제공하는 기술이라면, 스프링 인터셉터는 스프링 MVC가 제공하는 기술입니다. 둘 다 웹과 관련된 공통 관심 사항을 처리하지만, 적용되는 순서와 범위, 그리고 사용방법이 다릅니다. 스프링 인터셉터 흐름 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러 스프링 인터셉터는 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출됩니다. 스프링 인터셉터에도 URL 패턴을 적용할 수 있는데, 서블릿 URL 패턴과는 다르고, 매우 정밀하게 설정할 수 있습니다. 스프링 인터셉터 제한 HTTP 요청 -> WAS -> 필터 -> .. 서블릿 필터 사용해 인증 체크하기 로그인되지 않은 사용자는 로그인이 필요한 여러 페이지에 접근을 하지 못해야 합니다. 여러 로직들은 인증이라는 공통 관심사를 가지고 있고 서블릿 필터를 사용해 해당 인증 기능을 공통적으로 적용하는 방법을 알아보겠습니다. 인증 체크 필터 만들기 @Slf4j public class LoginCheckFilter implements Filter { // 인증과 무관하게 항상 접근을 허용하는 요청 Url private static final String[] whitelist = {"/", "/members/add", "/login", "/logout", "/css/*"}; @Override public void doFilter(ServletRequest request, ServletResponse response.. 서블릿 필터 사용해 요청 로그 남기기 공통 관심 사항 애플리케이션 여러 로직에서 공통으로 관심이 있는 있는 것을 공통 관심사(cross-cutting concern)라고 합니다. 만약 게시물을 관리하는 것을 로그인한 사용자에게만 허락한다면 게시물 등록, 수정, 삭제, 조회 등등 여러 로직에서 공통으로 인증에 대해서 관심을 가지고 있습니다. 웹과 관련된 공통 관심사를 처리할 때는 HTTP의 헤더나 URL의 정보들이 필요한데, 서블릿 필터나 스프링 인터셉터는 HttpServletRequest를 제공합니다. 서블릿 필터 소개 필터 흐름 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 필터를 적용하면 필터가 호출된 다음에 서블릿이 호출됩니다. 그래서 모든 고객의 요청 로그를 남기는 요구사항이 있다면 필터를 사용하면 됩니다. 참고로 .. 세션 정보와 타임아웃 설정 세션 정보 확인 @Slf4j @RestController public class SessionInfoController { @GetMapping("/session-info") public String sessionInfo(HttpServletRequest request){ HttpSession session = request.getSession(false); if (session == null){ return "세션이 없습니다."; } session.getAttributeNames().asIterator() .forEachRemaining(name -> log.info("session name={}, value={}",name, session.getAttribute(name) )); log.info("s.. @SessionAttribute 어노테이션을 사용해서 세션 조회하기 @SessionAttribute 스프링은 세션을 더 편리하게 사용할 수 있도록 @SessionAttribute을 지원합니다. 이미 로그인된 사용자를 찾을 때는 다음과 같이 사용하면 된다. 참고로 이 기능은 세션을 생성하지 않습니다. @SessionAttribute(name = "loginMember", required = false) Member loginMember @GetMapping("/") public String homeLogin(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) { // 세션에 회원 데이터가 없으면 home if (loginMember == nu.. 이전 1 2 3 4 5 다음