1차 서버 리팩토링 후 배포하니 문제가 발생했다. 계속해서 똑같은 정보를 담은 메일이 반복해서 전송되는 문제이다. 전송받은 게시물이 중복되지 않도록 DB에 게시물 인덱스를 저장하는데, 여기서 문제가 발생했다.
슈팅
- 원인
// server/src/types/UserType.ts
export interface UserType {
email: string;
latest_post_indexes: number[]; // here!
department_code: string;
subscribe_time: Date;
}
- 기존 유저 테이블에는 latest_post_indexs인데, 리팩토링하면서 latest_post_indexes으로 바꾼 것이 문제였다...
- 허무하게도 변수 이름을 원래대로 고치니 해결됐다.
메일 전송 로직 변경
- 기존 코드
// server/src/app.ts
// cron job at 11:00, 18:00 on Korea. 시차 9시간.
cron.schedule("0 2,9 * * 1-5", schedulingJobs);
// server/src/utils/jobs.ts
// ...
try {
// 특정 순간에 모든 학과를 가져옴!
const departments = await Department.find({});
// ...
}
- 기존 메일 전송 로직의 문제점은 특정 한 순간에 모든 작업을 처리하면서 메모리 사용량이 오버된다는 점이다.
- 모든 학과를 동시에 처리하려고 해서 발생한 문제로, 전송할 학과를 시간대별로 분리하기로 했다.
- 변경된 코드
// server/src/app.ts
// cron job at 10:00 on Korea. 시차 9시간.
cron.schedule("0 1 * * 1-6", schedulingJobs);
// server/src/utils/jobs.ts
// ...
try {
// 시간대별로 학과를 선택
const temp_departments = await Department.find({});
const departments = temp_departments.filter((__, index) => {
return (index + now.getHours() + 14) % 24 === 0;
});
// ...
}
- 1시간에 하나의 학과 만을 대상으로 하도록 구성했다.
- 오전 10시를 시작으로, 학과 리스트의 인덱스를 기준으로 계산했다.
- 오전 10시에는 0번째 학과, 오전 11시에는 1번째 학과, ...
- 학과가 24개 이상인 경우를 대비해 모듈러 연산을 수행한다.
- 학과가 24개 이상이 등록될 경우는 없겠지만..
- 실제로 잘 동작하는지는 아침에나 확인해볼 수 있을 것 같다.(현재 2023년 11월 23일 오전 2시 30분)
React Serving 에러
Error: ENOENT: no such file or directory, stat '/usr/src/app/server/dist/dist/index.html'
프론트를 호출하니 위 에러가 발생했다.
- 기존 코드
// server/src/app.ts
app.use(express.static(path.join(__dirname, "dist"))); // here!
// Endpoint: API Routing
app.use("/api/user", UserRouter);
app.use("/api/department", DepartmentRouter);
app.use("/api/email", EmailRouter);
app.use("/api/history", HistoryRouter);
// Endpoint: Client Routing
app.use("*", (__: Request, res: Response) => {
res.sendFile(path.join(__dirname, "dist", "index.html")); // here!!
});
- 변경된 코드
// server/src/app.ts
app.use(express.static(path.join(__dirname, "../../dist"))); // here!
// Endpoint: API Routing
app.use("/api/user", UserRouter);
app.use("/api/department", DepartmentRouter);
app.use("/api/email", EmailRouter);
app.use("/api/history", HistoryRouter);
// Endpoint: Client Routing
app.use("*", (__: Request, res: Response) => {
res.sendFile(path.join(__dirname, "dist", "../../index.html")); // here!!
});
- React 빌드 폴더의 위치를 제대로 지정해주지 않아 발생한 문제였다.
'프로젝트 > MailBadara' 카테고리의 다른 글
[토이프로젝트] MailBadara - (10) 모바일 구현 시작 (1) | 2024.02.14 |
---|---|
[토이프로젝트] MailBadara - (9) 디자인 리뉴얼 (1) | 2024.01.11 |
[토이프로젝트] MailBadara - (7) 1차 서버 리팩토링 (1) | 2023.11.22 |
[토이프로젝트] MailBadara - (6) 서버 최적화 생각 중 (0) | 2023.10.16 |
[토이프로젝트] MailBadara - (5) 트러블슈팅 (0) | 2023.10.13 |