11import app from '@/app' ;
22import logger from '@/configs/logger.config' ;
33import { closeCache } from './configs/cache.config' ;
4+ import { closeDatabase , initializeDatabase } from './configs/db.config' ;
5+ import { Server } from 'http' ;
46
57const port = parseInt ( process . env . PORT || '8080' , 10 ) ;
68
7- const server = app . listen ( port , ( ) => {
8- logger . info ( `Server running on port ${ port } ` ) ;
9- logger . info ( `Environment: ${ process . env . NODE_ENV } ` ) ;
10- if ( process . env . NODE_ENV !== 'production' ) {
11- logger . info ( `API Docs: http://localhost:${ port } /api-docs` ) ;
9+
10+ async function startServer ( ) {
11+ try {
12+ // 데이터베이스 초기화
13+ await initializeDatabase ( ) ;
14+ logger . info ( '데이터베이스 초기화 완료' ) ;
15+
16+ // 서버 시작
17+ const server = app . listen ( port , ( ) => {
18+ logger . info ( `Server running on port ${ port } ` ) ;
19+ logger . info ( `Environment: ${ process . env . NODE_ENV } ` ) ;
20+ if ( process . env . NODE_ENV !== 'production' ) {
21+ logger . info ( `API Docs: http://localhost:${ port } /api-docs` ) ;
22+ }
23+ logger . info ( `Health Check: http://localhost:${ port } /health` ) ;
24+ } ) ;
25+
26+ // Graceful shutdown 핸들러 설정
27+ setupGracefulShutdown ( server ) ;
28+
29+ } catch ( error ) {
30+ logger . error ( '서버 시작 중 오류 발생:' , error ) ;
31+ process . exit ( 1 ) ;
1232 }
13- logger . info ( `Health Check: http://localhost:${ port } /health` ) ;
14- } ) ;
33+ }
34+
35+ function setupGracefulShutdown ( server : Server ) {
36+ // 기본적인 graceful shutdown 추가
37+ const gracefulShutdown = async ( signal : string ) => {
38+ logger . info ( `${ signal } received, shutting down gracefully` ) ;
39+
40+ try {
41+ // HTTP 서버 종료
42+ await new Promise < void > ( ( resolve ) => {
43+ server . close ( ( ) => {
44+ logger . info ( 'HTTP server closed' ) ;
45+ resolve ( ) ;
46+ } ) ;
47+ } ) ;
1548
16- // 기본적인 graceful shutdown 추가
17- const gracefulShutdown = async ( signal : string ) => {
18- logger . info ( `${ signal } received, shutting down gracefully` ) ;
19- await closeCache ( ) ;
49+ // 데이터베이스 연결 종료
50+ await closeDatabase ( ) ;
2051
21- server . close ( ( ) => {
22- logger . info ( 'HTTP server closed' ) ;
23- process . exit ( 0 ) ;
52+ // 캐시 연결 종료
53+ await closeCache ( ) ;
54+
55+ logger . info ( 'Graceful shutdown completed' ) ;
56+ process . exit ( 0 ) ;
57+ } catch ( error ) {
58+ logger . error ( 'Graceful shutdown 중 오류 발생:' , error ) ;
59+ process . exit ( 1 ) ;
60+ }
61+ } ;
62+
63+ // 시그널 핸들러 등록
64+ process . on ( 'SIGTERM' , async ( ) => gracefulShutdown ( 'SIGTERM' ) ) ;
65+ process . on ( 'SIGINT' , async ( ) => gracefulShutdown ( 'SIGINT' ) ) ;
66+
67+ // 예상치 못한 에러 처리
68+ process . on ( 'uncaughtException' , async ( error ) => {
69+ logger . error ( 'Uncaught Exception:' , error ) ;
70+ await gracefulShutdown ( 'UNCAUGHT_EXCEPTION' ) ;
71+ } ) ;
72+
73+ process . on ( 'unhandledRejection' , async ( reason , promise ) => {
74+ logger . error ( 'Unhandled Rejection at:' , promise , 'reason:' , reason ) ;
75+ await gracefulShutdown ( 'UNHANDLED_REJECTION' ) ;
2476 } ) ;
2577
2678 // 강제 종료 타이머 (10초)
27- setTimeout ( ( ) => {
79+ const forceExitTimer = setTimeout ( ( ) => {
2880 logger . error ( 'Could not close connections in time, forcefully shutting down' ) ;
2981 process . exit ( 1 ) ;
3082 } , 10000 ) ;
31- } ;
32-
33- process . on ( 'SIGTERM' , async ( ) => gracefulShutdown ( 'SIGTERM' ) ) ;
34- process . on ( 'SIGINT' , async ( ) => gracefulShutdown ( 'SIGINT' ) ) ;
3583
36- // 예상치 못한 에러 처리
37- process . on ( 'uncaughtException ' , async ( error ) => {
38- logger . error ( 'Uncaught Exception:' , error ) ;
39- await gracefulShutdown ( 'UNCAUGHT_EXCEPTION' ) ;
40- } ) ;
84+ // graceful shutdown이 완료되면 타이머 해제
85+ process . on ( 'exit ' , ( ) => {
86+ clearTimeout ( forceExitTimer ) ;
87+ } ) ;
88+ }
4189
42- process . on ( 'unhandledRejection' , async ( reason , promise ) => {
43- logger . error ( 'Unhandled Rejection at:' , promise , 'reason:' , reason ) ;
44- await gracefulShutdown ( 'UNHANDLED_REJECTION' ) ;
45- } ) ;
90+ // 서버 시작
91+ startServer ( ) ;
0 commit comments