이번에 프로젝트를 하면서 다음과 같은 문제가 생겼다.
어떤 사용자에게 권한이 있는데, 이 사용자의 부서가 이동 되었을 때 해당 권한을 제거해줘야 하는 메서드를 만들었는데,
그냥 update를 날리는 단순한 쿼리만 돌리면 되서, 어느 지점에서 해당 메서드를 호출할 것인가? 가 문제였다.
처음에는 사용자가 로그인할때마다 체크해서 권한을 제거하는 방식으로 구현하였지만..
부서이동은 그렇게 자주 일어나는 이벤트가 아니므로, 하루나 일주일에 한번씩 돌리는게 낫지 않겠냐? 고 하여
스케줄러를 이용하여 구현 하는 김에 스케줄러를 정리한다.
@Scheduled
주기적인 작업이 있을 때 @Scheduled 어노테이션을 사용하면 쉽게 적용이 가능하다. 사용방법은 다음과 같다.
위와 같이 현재시간을 찍어 주는 메서드를 만들었다. 이제 간단히 관련 어노테이션을 붙여주면
스케줄러가 돌 것이다.
해당 메서드는 5초마다 현재시간을 콘솔에 찍어주는 메서드이다.
간단히 @EnableScheduling을 클래스에 붙여서 여기서 스케줄러를 사용하겠다! 라고 알려주고,
주기적으로 실행 할 메서드에 @Scheduled를 붙여주어 몇초마다 해당 메서드를 실행할 건지 옵션값을 주면 된다.
또한 클래스에 @Component, @Controller나 @Service 등을 적어주어야 하며 그럼 아래와 같이 된다.
5초마다 콘솔에 현재시간을 찍고 있다. 그런데 2번씩 찍힌다.. 이게 왜 그런가 하고 찾아보니..
Spring 설정의 경우 @Component 어노테이션이 등록이 되어 있는 상태에서 context-scan이 되면 bean이 두번 선언되어 중복 실행되는 경우도 있다고 한다. -> @Component를 @Controller으로 수정 하니 해결 되었다!
@Scheduled의 옵션값에 들어가는 cron은 구글에 검색하면 자세히 나오니 참고하면 될 거 같다.
'JAVA' 카테고리의 다른 글
[JAVA] redirect시 파라메터 담아서 보내기 ( feat. addAttribute, addFalshAttribute ) (0) | 2022.02.01 |
---|---|
[JAVA] org.springframework.web.multipart.MultipartException 에러 (maxPostSize) (0) | 2022.01.29 |
[JAVA] Spring을 이용하여 파일 업로드를 해보자. (1) ( feat Vue.js , axios ) (0) | 2022.01.29 |
[JAVA] @RequestParam 정리 (feat. Required String parameter '인자' is not present ) (0) | 2022.01.18 |
[JAVA] JAVA 설치하기 (0) | 2022.01.08 |