@SessionAttributes("student") // Model에 키 값이 "student"로 지정되는 값은 모두 세션에 저장됨
http://localhost/detail?studentNo=13
@GetMapping("/detail")
public String studentDetail(@RequestParam("studentNo") int studentNo){ ... }

@Target({ElementType.적용위치}) // 1
@Retention(RetentionPolicy.적용범위) // 2
public @interface LogExclusion {
// ...
}
| 이름 | 위치 |
|---|---|
| package | 패키지 |
| type | 타입 |
| constructor | 생성자 |
| field | 멤버변수 |
| local_variable | 지역변수 |
| parameter | 매개변수 |
| type_parameter | 패러미터타입(제네릭타입 변수) |
| type_use | 어떤 타입에도 적용 가능 |
| 이름 | 범위 |
|---|---|
| runtime | 컴파일 이후에도 사용 가능(로깅에 주로 사용) |
| class | 클래스 참조 시까지 |
| source | 컴파일 전까지. 컴파일 이후 소멸 |
- 어노테이션 정의
@Target({Element.TYPE, Element.FIELD})
@Retention(RetentionPolicy.runtime)
public @interface testAnnotation{}
- 사용
@testAnnotation
public class Example{
@testAnnotation
private static A = "student1";
@testAnnotation // 컴파일에러. field와 type에만 적용 가능
public Student(){}
}
https://gmlwjd9405.github.io/2018/12/02/spring-annotation-types.html
https://velog.io/@gillog/Spring-Annotation-%EC%A0%95%EB%A6%AC

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
| 메서드 | 설명 |
|---|---|
| preHandle | 요청이 컨트롤러 도착하기 전에 실행 |
| postHandle | 요청 처리 후 실행. 예외 발생시 실행안됨 |
| afterCompletion | 컨트롤러에서 뷰를 통해 응답이 전송 된 후 실행 |
@Component
public class LoginCheckInterceptor implements HandlerInterceptor{
// 요청이 컨트롤러에 도착 전 실행됨
// 로그인여부 확인
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
User user =(User) SessionUtils.getAttribute("LOGIN_USER");
if (user == null) {
request.setAttribute("error", "로그인 후 사용 가능한 서비스 입니다.");
request.getRequestDispatcher("/WEB-INF/jsp/loginForm").forward(request, response);
return false;
}
return true;
}
// 요청이 컨트롤러에서 처리 된 후 실행(view 전)
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
// 응답이 view로 전달 된 후 실행
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}