개발공작소
article thumbnail
728x90
반응형

이번에 프로젝트를 하면서 다음과 같은 문제가 생겼다.
어떤 사용자에게 권한이 있는데, 이 사용자의 부서가 이동 되었을 때 해당 권한을 제거해줘야 하는 메서드를 만들었는데,
그냥 update를 날리는 단순한 쿼리만 돌리면 되서, 어느 지점에서 해당 메서드를 호출할 것인가? 가 문제였다.
처음에는 사용자가 로그인할때마다 체크해서 권한을 제거하는 방식으로 구현하였지만..
부서이동은 그렇게 자주 일어나는 이벤트가 아니므로, 하루나 일주일에 한번씩 돌리는게 낫지 않겠냐? 고 하여 
스케줄러를 이용하여 구현 하는 김에 스케줄러를 정리한다.

@Scheduled

주기적인 작업이 있을 때 @Scheduled 어노테이션을 사용하면 쉽게 적용이 가능하다. 사용방법은 다음과 같다.

테스트용 클래스/메서드

위와 같이 현재시간을 찍어 주는 메서드를 만들었다. 이제 간단히 관련 어노테이션을 붙여주면 

스케줄러가 돌 것이다.

 

해당 메서드는 5초마다 현재시간을 콘솔에 찍어주는 메서드이다.

 

간단히 @EnableScheduling을 클래스에 붙여서 여기서 스케줄러를 사용하겠다! 라고 알려주고,

주기적으로 실행 할 메서드에 @Scheduled를 붙여주어 몇초마다 해당 메서드를 실행할 건지 옵션값을 주면 된다.

또한 클래스에  @Component, @Controller나 @Service 등을 적어주어야 하며 그럼 아래와 같이 된다.

 

실행 화면

5초마다 콘솔에 현재시간을 찍고 있다. 그런데 2번씩 찍힌다.. 이게 왜 그런가 하고 찾아보니..

 

Spring 설정의 경우 @Component 어노테이션이 등록이 되어 있는 상태에서 context-scan이 되면 bean이 두번 선언되어 중복 실행되는 경우도 있다고 한다. -> @Component를 @Controller으로 수정 하니 해결 되었다!

 

 

@Scheduled의 옵션값에 들어가는 cron은 구글에 검색하면 자세히 나오니 참고하면 될 거 같다.

728x90
반응형
profile

개발공작소

@모찌바라기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!