04.23 학습

한강섭·2025년 4월 23일
1

학습 & 숙제

목록 보기
73/103
post-thumbnail

🚀 Spring 컨트롤러 및 인터셉터 정리


🎮 Controller를 @Controller로 변경하기

  • setupCookie만 필요해짐
  • implements ControllerHelper는 유지 (쿠키 생성)
  • service()에서 사용했던 action 파라미터들을 path로 활용하는 handler 메서드로 변경

🔍 Handler Method 특징

  • HttpServletRequest 사용 지양 → Model과 @RequesParam, @ModelAttribute 적극 사용
  • HttpServletResponse는 쿠키 생성 시에만 사용
  • ServletException, IOException 처리 제거
  • action 값을 경로로 변경
# 변경 전
"/auth?action=member-detail&email=" + email;

# 변경 후
"/auth/member-detail?email=" + email;

🔄 Interceptor

Filter 대신에 사용!
Handler Interceptor (인터페이스)에 정의되어 있음

📋 Handler Interceptor 특징

주요 메서드:

  • HttpServletRequest, HttpServletResponse, @Controller 객체, ModelAndView, Exception까지 모두 제공받을 수 있음
  • preHandle, postHandle, afterCompletion

인터셉터 처리 흐름

🔄 Filter vs AOP vs Interceptor

각각의 동작 위치를 알면 구분 쉽다!

필터/인터셉터/AOP 비교

Servlet Filter

  • Spring과 무관하며 DispatcherServlet 호출 이전에 동작
  • 스프링과의 협업은 어렵고 단지 ServletRequest, ServletResponse에 대한 전/후 처리

HandlerInterceptor

  • Spring에서 관리하며 DispatcherServlet 이후 동작
  • Spring의 빈으로 injection 등 모든 기능 사용 가능
  • Controller에 대한 부가 작업이 필요한 경우 사용

AOP

  • HTTP 관련 작업을 처리하기 위한 처리가 어려움
  • 일반적으로 Service, DAO에 적합

⚠️ 예외 처리

🔙 기존 방식

web.xml을 통한 전역 처리

<error-page>
    <error-code>404</error-code>
    <location>/error/404.jsp</location>
</error-page>

🔄 SpringBoot의 error page 연결

기본적으로 /error에 연결 → /error.jsp로 forward

  • JSP 파일이 있다면 해당 파일로 연결
  • 없다면 whitelabel error page로 연결

🛠️ BasicErrorController 활용

@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {
    
    @RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
    public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
        HttpStatus status = getStatus(request);
        Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(request,
        getErrorAttributeOptions(request, MediaType.TEXT_HTML)));
        
        response.setStatus(status.value());
        ModelAndView modelAndView = resolveErrorView(request, response, status, model);
        return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
    }
    
    @RequestMapping
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        HttpStatus status = getStatus(request);
        if (status == HttpStatus.NO_CONTENT) {
            return new ResponseEntity<>(status);
        }
        Map<String, Object> body = getErrorAttributes(request,
        getErrorAttributeOptions(request, MediaType.ALL));
        return new ResponseEntity<>(body, status);
    }
}

📁 파일 업로드

파일 업로드는 공식처럼 외우기!

  1. POST + multipart 설정
<form action="${root}/fileupload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="text" name="desc">
    <button>전송</button>
</form>
  1. properties에 제약사항 추가

  2. @RequestParam MultipartFile file로 받아서 사용


profile
기록하고 공유하는 개발자

0개의 댓글