[토이프로젝트] MailBadara - (8) 2차 서버 리팩토링

2023. 11. 23. 03:00·프로젝트/MailBadara

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
'프로젝트/MailBadara' 카테고리의 다른 글
  • [토이프로젝트] MailBadara - (10) 모바일 구현 시작
  • [토이프로젝트] MailBadara - (9) 디자인 리뉴얼
  • [토이프로젝트] MailBadara - (7) 1차 서버 리팩토링
  • [토이프로젝트] MailBadara - (6) 서버 최적화 생각 중
KimCookieYa
KimCookieYa
무엇이 나를 살아있게 만드는가
  • KimCookieYa
    쿠키의 주저리
    KimCookieYa
  • 전체
    오늘
    어제
    • 분류 전체보기 (576)
      • 혼잣말 (88)
      • TIL (3)
      • 커리어 (24)
        • Sendy (21)
        • 외부활동 기록 (2)
      • 프로젝트 (186)
        • 티스토리 API (5)
        • 코드프레소 체험단 (89)
        • Web3 (3)
        • Pint OS (16)
        • 나만무 (14)
        • 대회 (6)
        • 정글 FE 스터디 (16)
        • MailBadara (12)
        • github.io (1)
        • 인공지능 동아리, AID (5)
        • 졸업과제 (18)
        • OSSCA 2024 (1)
      • 크래프톤 정글 2기 (80)
      • IT (169)
        • 코딩 (4)
        • CS (18)
        • 에러 (5)
        • 블록체인 (23)
        • Front-End (40)
        • 알고리즘&자료구조 정리 (3)
        • 코딩테스트 (3)
        • BOJ 문제정리 (41)
        • WILT (12)
        • ML-Agents (4)
        • 강화학습 (1)
        • Android (0)
        • LLM (2)
      • 전공 (1)
        • 머신러닝 (1)
      • 자기계발 (20)
        • 빡공단X베어유 (2)
        • 독서 (15)
  • 블로그 메뉴

    • 홈
    • 방명록
    • Github
    • Velog
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    리액트
    docker
    NEAR Protocol
    사이드프로젝트
    OS
    RNN
    코드프레소
    프로그래머스
    핀토스
    크래프톤정글
    니어프로토콜
    Flutter
    센디
    pintos
    글리치해커톤
    머신러닝
    자바스크립트
    Pint OS
    JavaScript
    부산대
    나만무
    react
    알고리즘
    파이썬
    해커톤
    딥러닝
    블록체인
    MailBadara
    졸업과제
    numpy
  • hELLO· Designed By정상우.v4.10.3
KimCookieYa
[토이프로젝트] MailBadara - (8) 2차 서버 리팩토링
상단으로

티스토리툴바