지인의 소개로 프로그램을 구상하기 시작했다. 2019년 처음 프로그램 개발을 시작해서 서비스를 염두에 두고 설계부터 시작하기는 처음이다.
얼마나 커질지는 모르겠지만, 그동안 공부하고 배우며 했던 내용들을 바탕으로 만들게 될 것이다. 만들 수 있는 시간은 퇴근 후, 주말 뿐이지만 6월까지 목표로 만드는 중이다.
지난 2월부터 시작하기는 했지만, 피곤해서 꾸준히 진행하기란 정말 쉬운일이 아니다. 요즘에는 너무나도 흔하지만 현재 회사에서는 주로 사용하지 않아 많이 미숙한 QueryDsl을 사용해서 만들어보기로 했다.
2월부터 시작해서 현재 진행중이지만 이제서야 쓰게 됐다. Querydsl이 많이 미숙하여 단순한 기능조차도 진행하며 많이 애를 먹고 있지만 그만큼 배워가는 것도 크다.
원래 개발공부는 직접 부딪혀가며 하는게 습득이 빠른 것 같다.
- 다양한 언론사의 뉴스를 수집하여 제공.
- 문자 또는 메일 등 알림 서비스 제공.
- 기사 요약 및 기사 스크랩 기능 제공.
- 고객이 원하는 키워드에 따른 기사 제공.
springboot 3.3.6 / Java 17/ MySQL
우선적으로 크게 두 가지를 기준으로 개발을 진행했다.
1 .기사 수집
뉴스기사는 조간, 주간 석간 을 모두 수집해야 하며, 추가로 올라오는 기사에 대한 수집도 꾸준히 진행되어야 한다. 따라서, 스케줄에 따라 수집을 진행하여야 한다.

시간 별, 언론사 별, 키워드 별, 각각의 스케줄에 따라 수집이 진행되어야 하며, 이미 수집된 기사라면 이 데이터는 중복으로 저장되지 않아야 한다.
이 서비스에서 기사 수집이 가장 중요하므로 예외적인 상황에 대한 처리가 가장 중요했다.
아래는 스케줄링을 위한 엔티티다. 실행해야 할 작업에 대한 내용은 execute 에 JSON 형태로 들어간다.
@Entity
@Table(name = "t_task_schedule")
@Getter
public class TaskScheduleEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int seq;
@Column(name = "task_code")
private String taskCode;
@Column(name = "reserve_time")
private LocalDateTime reserveTime;
@Column(name = "execute")
private String execute;
@Column(name = "description")
private String description;
@Column(name = "is_active")
private boolean isActive;
@Column(name = "is_complete")
private boolean isComplete;
@Column(name = "expire_time")
private LocalDateTime expireTime;
@Column(name = "create_time")
private LocalDateTime createTime;
}
2. 메일 발송
서비스에서 모든 메일발송은 한 곳에서 관리가 되며 예약시간을 설정하여 발송한다. 메일을 보낼 때는 테이블에 우선적으로 인입되며 예약시간마다 병렬처리를 통해 메일을 발송한다.
아래는 메일 발송을 위한 엔티티다. is_send 속성으로 메일 발송여부를 확인한다.
@Entity
@Table(name = "t_mail_schedule")
@Getter
@DynamicUpdate
public class MailScheduleEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long seq;
@Column(name = "to_mail")
private String toMail;
@Column(name = "from_mail")
private String fromMail;
private String title;
private String message;
@Column(name = "reserved_time")
private LocalDateTime reservedTime;
@Column(name = "is_send")
private boolean isSend;
@Column(name = "send_attempts")
private int sendAttempts;
@Column(name = "update_time")
private LocalDateTime updateTime;
@Column(name = "create_time")
private LocalDateTime createTime;
public void updateSendAttemptsCount(int count) {
this.sendAttempts = count;
}
public void updateIsSend(boolean isSend) {
this.isSend = isSend;
}
}
일단 크게 두 가지 기능에 대해서만 작성했다. 기본적인 기능을 만든 이후부터 구체적인 개발이 진행될 것 같다.