[접근 제한 정책]
Pre : before(메소드 실행 전)
Authorization : 권한(인가)
-> 메소드 레벨에서 처리 가능
@PreAuthorize("hasRole('ROLE_MEMBER')") --> security-context에서 설정했던 거
@GetMapping("/register")
public String register() {
return "board/register";
}
스프링 시큐리티 애너테이션을 활성화
- pre-post-annotations="enabled" -> 골뱅이PreAuthorize, 골뱅이PostAuthorize 활성화
*** PreAuthorize : 특정 메소드를 실행하기 전에 role 체킹
PostAuthorize : 특정 메소드를 실행한 후에 role 체킹
- secured-annotations="enabled" -> 골뱅이Secured를 활성화
Secured : 스프링 시큐리티 모듈을 지원하기 위한 애너테이션
<security:global-method-security pre-post-annotations="enabled"
secured-annotations="enabled" />
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
.
.
.
xmlns:aop="http://www.springframework.org/schema/aop"
==> 아래 사용 가능
<!-- 스프링 AOP 활성화 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!-- kr.or.ddit.aop 패키지를 컴포넌트 스캔 대상으로 등록 -->
<context:component-scan base-package="kr.or.ddit.aop"></context:component-scan>
package) .aop =>
@Component
@Aspect --> root.context.xml렁 연결됨. 위에랑 짝궁
public class ServiceLoggerAdvice {
Aspect(애스팩트) : AOP의 단위가 되는 횡단 관심사
횡단 관심사(Cross-Cutting Concern) : 핵심(core) 비즈니스 로직(삼겹살구어먹기, 빵또아의 아이스크림)과
다소 거리가 있지만,
여러 모듈에서 공통적이고 반복적인 처리를 요구하는 내용(불판닦기, 불판교체, 빵또아의 빵)
횡단 관심사 분리(Separation Of Cross-Cutting Concern) : 횡단 관심사에 해당하는
부분(불판닦기, 불판교체, 빵또아의 빵)을 분리해서 한 곳으로 모으는 것을 의미
Component : 골뱅이Aspect와 짝궁. component-scan시 "여기 봐주세요"라는 의미
JoinPoint : 어드바이스가 적용될 수 있는 위치
Advice : 어떤 부가기능(불판닦기)을 언제(삼겹살을 굽기 전(Before)에) 사용할지 정의
* 언제?
- Before : 조인포인트 전에 실행. (삼겹살을 굽기 직전에)
- After : 조인 포인트에서 처리가 완료된 후 실행(삽겹살을 굽고 먹은 직후 실행)
- Around : 조인 포인트 전후에 실행(삽겹살을 굽기 직전과 먹은 직후 실행)
- After Returning : 조인 포인트가 정상적으로 종료 후 실행
- After Throwing : 조인 포인트에서 예외 발생 시 실행. 예외가 발생안되면 실행 안함
//로보트에 : AOP대상(로그, 보안, 트랜잭션, 에러)
//포인트컷 표현식. 별쩜쩜별괄호쩜쩜괄호
//excution : 포인트컷(대상(메소드)을 선별하는 것) 지정자
//(* : 임의의 1개의 리턴타입
//.. : 임의의 0개 이상
//kr.or.ddit.*..*(..) :
// 패키지 밑의 각각의 패키지가 있고
// 그 하위에 모든 파일/패키지
// 각각의 메소드가 있고
// (..) : 모든 파라미터
//결론 : 포인트컷에 포함된 메서드를 대상으로 그 메서드가 실행되기 전에 로그를 출력해보자
@Before("execution(* kr.or.ddit.*..*(..))")
public void startLog(JoinPoint jp) {
log.info("startLog");
// .getSignature() : 어떤 클래스의 어떤 메서드가 실행되었는지 보여줌. 파라미터 타입은 무엇인지 보여줌
// kr.or.ddit.service.BoardService.register(BoardVO)
log.info("startLog : " + jp.getSignature());
// .getArgs() : 전달 된 파라미터 정보를 보여줌
// [BoardVO [boardNo=127,title=개똥이]]
log.info("startLog : " + Arrays.toString(jp.getArgs()));
}