HandleMethod로 공통 로그인 체크
- 로그인 체크 여부 메소드를 가지는 RequestConfig 어노테이션 클래스 생성
생성한 어노테이션은 Controller 메소드에 활용할 것
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestConfig {
boolean loginCheck() default false;
}
- Controller에 위에서 생성한 어노테이션 추가
로그인 체크가 필요한 부분인 save, delete 메소드에만 추가
public class BoardController {
...
@PutMapping
@RequestConfig
@ApiOperation(value = "등록 / 수정 처리", notes = "신규 게시물 저장 및 기존 게시물 업데이트가 가능합니다.")
@ApiImplicitParams({
@ApiImplicitParam(name = "boardSeq", value = "게시물 번호", example = "1"),
@ApiImplicitParam(name = "title", value = "제목", example = "spring"),
@ApiImplicitParam(name = "contents", value = "내용", example = "spring 강좌")
})
public BaseResponse<Integer> save(BoardParameter parameter) {
// 제목 필수 체크
if (StringUtils.isEmpty(parameter.getTitle())) {
throw new BaseException(BaseResponseCode.VALIDATE_REQUIRED, new String[] { "title", "제목" });
}
// 내용 필수 체크
if (StringUtils.isEmpty(parameter.getContents())) {
throw new BaseException(BaseResponseCode.VALIDATE_REQUIRED, new String[] { "contents", "내용" });
}
boardService.save(parameter);
return new BaseResponse<Integer>(parameter.getBoardSeq());
}
...
@DeleteMapping("/{boardSeq}")
@RequestConfig
@ApiOperation(value = "삭제 처리", notes = "게시물 번호에 해당하는 정보를 삭제합니다.")
@ApiImplicitParams({
@ApiImplicitParam(name = "boardSeq", value = "게시물 번호", example = "1")
})
public BaseResponse<Boolean> delete(@PathVariable int boardSeq) {
Board board = boardService.get(boardSeq);
if (board == null) {
return new BaseResponse<Boolean>(false);
}
boardService.delete(boardSeq);
return new BaseResponse<Boolean>(true);
}
}
- BaseHandlerInterceptor의 컨트롤러 메소드 호출 전에 사용하는 preHandle에 로그인 체크 조건 추가
현재 요청 url이 컨트롤러 메소드에 매핑된 경우라면 HandlerMethod 클래스로 캐스팅하여 어노테이션을 사용할 수 있으므로
현재 url에 매핑된 컨트롤러 메소드에 선언된 RequestConfig 어노테이션을 가져올 수 있음
public class BaseHandlerInterceptor extends HandlerInterceptorAdapter {
...
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("preHandler requestURI : {}", request.getRequestURI());
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
logger.info("handlerMethod : {}", handlerMethod);
RequestConfig requestConfig = handlerMethod.getMethodAnnotation(RequestConfig.class);
if (requestConfig != null) {
// 로그인 체크가 필수인 경우
if (requestConfig.loginCheck()) {
throw new BaseException(BaseResponseCode.LOGIN_REQUIRED);
}
}
}
return true;
}
...
}
- 로그인 체크가 필수인 경우 에러 메시지를 리턴하기 위해 BaseResponseCode 클래스와 message_ko.properties 추가
public enum BaseResponseCode {
SUCCESS, // 성공
ERROR, // 실패
LOGIN_REQUIRED, // 로그인
DATA_IS_NULL, // NULL
VALIDATE_REQUIRED, // 필수 체크
;
}
SUCCESS = 정상적으로 처리되었습니다.
ERROR = 오류가 발생했습니다.
DATA_IS_NULL = 요청하신 데이터는 {0} 입니다.
LOGIN_REQUIRED = 요청하신 {0} URL은 로그인이 필수입니다.
VALIDATE_REQUIRED = {0}({1}) 필드는 필수로 입력하셔야 합니다.
- 결과
save 호출시 인터셉터에서 로그인이 필수라고 에러 메세지가 리턴됨

'Java-Spring > 자바 스프링부트 활용 웹개발 실무용' 카테고리의 다른 글
[자바 스프링부트 활용 웹개발 실무용] cron으로 로컬, 개발, 운영 설정값 프로퍼티에 따른 스케줄러 사용 (0) | 2022.08.18 |
---|---|
[자바 스프링부트 활용 웹개발 실무용] @PostConstruct로 로컬, 개발, 운영 설정값 프로퍼티 클래스 관리 (0) | 2022.08.17 |
[자바 스프링부트 활용 웹개발 실무용] Mybatis를 이용한 검색, 배열 검색과 페이징 (0) | 2022.08.16 |
[자바 스프링부트 활용 웹개발 실무용] Enum class를 활용해 DB 컬럼 값이 코드일 경우 in out 사용 방법 (0) | 2022.07.26 |
[자바 스프링부트 활용 웹개발 실무용] Mybatis와 Mysql 환경에서 대용량 빠르게 등록 (0) | 2022.07.21 |
HandleMethod로 공통 로그인 체크
- 로그인 체크 여부 메소드를 가지는 RequestConfig 어노테이션 클래스 생성
생성한 어노테이션은 Controller 메소드에 활용할 것
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestConfig {
boolean loginCheck() default false;
}
- Controller에 위에서 생성한 어노테이션 추가
로그인 체크가 필요한 부분인 save, delete 메소드에만 추가
public class BoardController {
...
@PutMapping
@RequestConfig
@ApiOperation(value = "등록 / 수정 처리", notes = "신규 게시물 저장 및 기존 게시물 업데이트가 가능합니다.")
@ApiImplicitParams({
@ApiImplicitParam(name = "boardSeq", value = "게시물 번호", example = "1"),
@ApiImplicitParam(name = "title", value = "제목", example = "spring"),
@ApiImplicitParam(name = "contents", value = "내용", example = "spring 강좌")
})
public BaseResponse<Integer> save(BoardParameter parameter) {
// 제목 필수 체크
if (StringUtils.isEmpty(parameter.getTitle())) {
throw new BaseException(BaseResponseCode.VALIDATE_REQUIRED, new String[] { "title", "제목" });
}
// 내용 필수 체크
if (StringUtils.isEmpty(parameter.getContents())) {
throw new BaseException(BaseResponseCode.VALIDATE_REQUIRED, new String[] { "contents", "내용" });
}
boardService.save(parameter);
return new BaseResponse<Integer>(parameter.getBoardSeq());
}
...
@DeleteMapping("/{boardSeq}")
@RequestConfig
@ApiOperation(value = "삭제 처리", notes = "게시물 번호에 해당하는 정보를 삭제합니다.")
@ApiImplicitParams({
@ApiImplicitParam(name = "boardSeq", value = "게시물 번호", example = "1")
})
public BaseResponse<Boolean> delete(@PathVariable int boardSeq) {
Board board = boardService.get(boardSeq);
if (board == null) {
return new BaseResponse<Boolean>(false);
}
boardService.delete(boardSeq);
return new BaseResponse<Boolean>(true);
}
}
- BaseHandlerInterceptor의 컨트롤러 메소드 호출 전에 사용하는 preHandle에 로그인 체크 조건 추가
현재 요청 url이 컨트롤러 메소드에 매핑된 경우라면 HandlerMethod 클래스로 캐스팅하여 어노테이션을 사용할 수 있으므로
현재 url에 매핑된 컨트롤러 메소드에 선언된 RequestConfig 어노테이션을 가져올 수 있음
public class BaseHandlerInterceptor extends HandlerInterceptorAdapter {
...
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("preHandler requestURI : {}", request.getRequestURI());
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
logger.info("handlerMethod : {}", handlerMethod);
RequestConfig requestConfig = handlerMethod.getMethodAnnotation(RequestConfig.class);
if (requestConfig != null) {
// 로그인 체크가 필수인 경우
if (requestConfig.loginCheck()) {
throw new BaseException(BaseResponseCode.LOGIN_REQUIRED);
}
}
}
return true;
}
...
}
- 로그인 체크가 필수인 경우 에러 메시지를 리턴하기 위해 BaseResponseCode 클래스와 message_ko.properties 추가
public enum BaseResponseCode {
SUCCESS, // 성공
ERROR, // 실패
LOGIN_REQUIRED, // 로그인
DATA_IS_NULL, // NULL
VALIDATE_REQUIRED, // 필수 체크
;
}
SUCCESS = 정상적으로 처리되었습니다.
ERROR = 오류가 발생했습니다.
DATA_IS_NULL = 요청하신 데이터는 {0} 입니다.
LOGIN_REQUIRED = 요청하신 {0} URL은 로그인이 필수입니다.
VALIDATE_REQUIRED = {0}({1}) 필드는 필수로 입력하셔야 합니다.
- 결과
save 호출시 인터셉터에서 로그인이 필수라고 에러 메세지가 리턴됨

'Java-Spring > 자바 스프링부트 활용 웹개발 실무용' 카테고리의 다른 글
[자바 스프링부트 활용 웹개발 실무용] cron으로 로컬, 개발, 운영 설정값 프로퍼티에 따른 스케줄러 사용 (0) | 2022.08.18 |
---|---|
[자바 스프링부트 활용 웹개발 실무용] @PostConstruct로 로컬, 개발, 운영 설정값 프로퍼티 클래스 관리 (0) | 2022.08.17 |
[자바 스프링부트 활용 웹개발 실무용] Mybatis를 이용한 검색, 배열 검색과 페이징 (0) | 2022.08.16 |
[자바 스프링부트 활용 웹개발 실무용] Enum class를 활용해 DB 컬럼 값이 코드일 경우 in out 사용 방법 (0) | 2022.07.26 |
[자바 스프링부트 활용 웹개발 실무용] Mybatis와 Mysql 환경에서 대용량 빠르게 등록 (0) | 2022.07.21 |