게시판에 글을 쓸때 예약 글쓰기 기능을 사용해본 적이 있을 것이다.
여기서는 Spring의 기능 중 Schedule(cron)을 사용하여, mysql database를 update해 나감으로서 게시판의 예약 글쓰기 기능을 간단하게 구현해보고자 한다.
-관련 git source : https://github.com/kimseonguk197/spring_scheduler
-사용 stack : spring boot, JPA, mysql, thymeleaf
UI
글작성
기본적인 UI는 아래와 같이 글작성을 할 수 있는 게시판이다.
글작성란으로 들어오면 위와 같이 posting할 글 내용을 작성하면 되는데, 예약설정 여부를 check하고, 예약시간을 분단위로 입력해주면 된다. 현재시간은 15:33분이고, 15:50분으로 등록 예약을 걸어 글을 등록하였다.
글 목록
게시글 목록에서는 현재는 아무것도 보이지가 않는다. spring 프로그램에서 DB 컬럼 중에 scheduled컬럼이 checked인 것은 글목록에 조회되지 않도록 프로그래밍 해두었다. 스케쥴러로 시간이 다 되면 해당 컬럼의 checked를 없앰으로서 해당 글이 다시 보이게 될 것이다.
DB - mysql
db는 docker mysql과 JPA를 연동하여 간단히 구성해두었다.(git source 코드 참고)
데이터베이스의 post테이블을 조회해보면 scheduled 컬럼에 checked가 걸려있고, scheduled_time에 15:50분으로 걸려있는 것을 알수가 있다.
spring
spring boot로 프로젝트를 생성하였다. 먼저, 아래와 같이 메인 application에 @EnableScheduling 어노테이션을 붙여주도록 한다.
@EnableScheduling
@SpringBootApplication
public class BoardApplication {
public static void main(String[] args) {
SpringApplication.run(BoardApplication.class, args);
}
}
그 다음, 아래와 같이 클래스를 하나 만들어, 1분마다 한번씩 스케쥴러가 돌도록 하였다.
@Component
public class PostSchedule {
private final PostRepository repository;
public PostSchedule(PostRepository repository) {
this.repository = repository;
}
@Scheduled(cron = "0 0/1 * * * *")
public void postSchedule(){
//schedule걸린건만 조회
String scheduled = "checked";
for (Post post : repository.findByScheduled(scheduled)) {
// 1초 차이 용인
if(post.getScheduledTime().isBefore(LocalDateTime.now().plusSeconds(1))){
post.setScheduled(null);
repository.save(post);
}
}
}
}
서비스를 기동하기 전에 아래 경로에 있는 sql문을 mysql에서 실행해주도록 하자. batch_job과 관련있는 table을 DB에 추가해줘야지만 오류가 나지 않는다.
/spring-batch-core-4.3.7.jar!/org/springframework/batch/core/schema-mysql.sql
스케쥴러가 돌때, 현재시간이 scheduledTime을 초과하게 되면 scheduled컬럼을 null로 세팅하도록 하였다.(1초 정도 오차를 두었다.)
위와 같이 스프링이 열심히 아래와같이 1분에 한번씩 조회를 하다가 50분이 되었다.
스케쥴 시간이 지나면
DB
database에 scheduled컬럼이 아래와 같이 null로 업데이트가 되어 있음을 알수가 있다.(select now()는 utc기준으로 조회되니 현재 15:50분입니당)
UI
화면 또한 아래와 같이 이제 리스트에 조회가 된다.
마무리
간단히, 스프링부트에서 스케쥴러로 데이터베이스를 업데이팅 함으로서, 글쓰기 예약기능을 만들어 보았다.
다만, 이는 현업에서 그대로 사용하기에는 적합하지 않을 수 있다. 분단위로 게시판 DB를 조회하고 로직을 처리해야 하기 때문에, 서버에 부담이 많이 간다.
특히, 대용량 DB를 처리하는 배치라 가정하여 다음글에서는 spring에서 제공하는 batch 기능을 사용해보고자 한다.
애플리케이션 서버와 별개의 서버를 띄운 뒤 스케쥴러가 돌면서, 배치를 호출하고 DB조회 및 update 관련한 비지니스 로직은 배치에서 처리하도록 구성해보고자 한다.
'프로그래밍 > java, spring' 카테고리의 다른 글
junit repository test - 서비스용DB mysql과 테스트DB h2사용 (0) | 2023.01.01 |
---|---|
Spring Scheduler, Batch연동 (0) | 2022.12.31 |
mvc구조의 servlet, jsp와 비mvc구조의 jsp 비교 (0) | 2022.12.27 |
서블릿방식과 spring MVC 컨트롤러의 json처리 비교 (0) | 2022.12.26 |
서블릿의 필요성 (0) | 2022.12.25 |