안녕하세요! 클라우드스퀘어에서 현장실습을 진행하면서 Naver Cloud Platform을 활용한 3-Tier 아키텍처 설계 및 Todo Calendar 서비스를 구현한 경험을 공유하고자 합니다.

이번 프로젝트는 단순히 Todo Calendar 서비스를 만드는 것을 넘어, 왜 3-Tier 아키텍처를 선택했는가에 대한 명확한 근거를 가지고 진행했습니다.
3-Tier 아키텍처는 웹 애플리케이션을 세 개의 논리적 계층으로 분리하는 구조입니다:


이번 프로젝트에서 구현한 아키텍처는 다음과 같은 특징을 가지고 있습니다:

이렇게 5단계의 ACG를 구성하여 각 계층별로 필요한 트래픽만 허용하고, 불필요한 접근을 철저히 차단했습니다.
LB에는 ACG적용이 불가능하기 때문에 리스너 포트를 적용해 불필요한 포트 접근을 차단할 수 있습니다.
KMS는 데이터 암호화에 사용되는 키를 안전하게 관리해주는 서비스입니다. 암호화 키를 서버나 코드에 직접 저장하지 않고, NCP KMS가 키의 생성, 보관, 사용을 대신 관리합니다.
데이터베이스가 유출되더라도 데이터를 읽을 수 없도록 NCP KMS로 민감 데이터를 암호화하여 저장했습니다.
실제 데이터베이스를 조회하면 다음과 같이 암호화된 형태로 저장됩니다:

모든 서버는 Private Subnet에 위치하여 인터넷에서 SSH 접근이 불가능합니다. 관리자는 SSL VPN을 통해서만 서버에 접속할 수 있어, 데이터 전송을 암호화하고 안전한 통신을 보장합니다.



각 알고리즘의 특성을 고려하여 서비스 특성에 맞는 방식을 선택할 수 있습니다.
Cloud DB는 Active-Standby 구조로 설계했습니다.
Active-Active 같은 경우는 여러 DB에 동시에 쓰기 때문에 데이터 충돌 가능성이 있습니다.
Active-Standby 구조는 하나의 Master만 쓰기 수행하기 때문에 데이터 일관성을 보장할 수 있습니다.
그렇다고 Active-Active를 모든 경우에서 사용하지 않는 건 아닙니다.
Multi Region 환경이나 읽기/쓰기 부하가 매우 높은 경우에는 Active-Active 구조를 택하기도 합니다.

이미지 업로드 기능을 구현하면서 두 가지 방식을 비교했습니다:
WAS에 0.49MB의 파일이 적재됨
메모리 사용: 약 3MB (파일 버퍼링 + S3 업로드)
WAS에 파일이 전달되지 않음
메모리 사용: 32KB (URL 생성 비용만)
Presigned URL: 0.02s user 0.01s system 2% cpu 1.102 total

WAS 경유: 0.01s user 0.01s system 11% cpu 0.152 total


Presigned URL 방식을 채택하여 WAS의 부하를 크게 줄일 수 있었습니다.
nodemailer + Gmail SMTP
javascript// 이메일 발송 설정 (Gmail SMTP)
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.GMAIL_USER,
pass: process.env.GMAIL_APP_PASSWORD
}
});
node-cron 스케줄러
javascript// 이메일 알림 스케줄러 (매분 실행)
function startNotificationScheduler() {
cron.schedule('* * * * *', async () => {
try {
const now = new Date()
const currentDate = now.toISOString().split('T')[0]
const currentHours = String(now.getHours()).padStart(2, '0')
const currentMinutes = String(now.getMinutes()).padStart(2, '0')
const currentTime = `${currentHours}:${currentMinutes}`
// ... 알림 로직
}
});
}
이를 통해 사용자가 설정한 시간에 Todo 알림을 이메일로 받을 수 있습니다.

| 구성 요소 | 역할 | 위치 |
|---|---|---|
| Prometheus | 메트릭 수집 및 저장 (시계열 DB) | Monitoring 서버 |
| Grafana | 대시보드 시각화, 알림 설정 | Monitoring 서버 |
| Node Exporter | 서버별 시스템 메트릭 수집 에이전트 | Web, WAS 각 서버 |
| 항목 | 의미 |
|---|---|
| Utilization (사용률) | 리소스가 실제로 사용 중인 비율 |
| Saturation (포화도) | 처리 대기 중인 작업량 (큐 길이, 로드 등) |
| Errors (오류) | 리소스 오류 발생 수 |

CPU 사용률이 85%를 초과하면 Slack으로 알림이 전송되어 즉각적인 대응이 가능합니다:

증분 백업은 전체 백업 이후에 업데이트된 내용만 백업하여 효율성을 높였습니다.

실제로 복원 기능이 정상 작동하는지 테스트를 진행했습니다:
home 디렉터리에 test.txt 파일 생성
이를 통해 실제 장애 상황에서도 데이터를 안전하게 복구할 수 있음을 검증했습니다.
실제 서비스는 다음 URL에서 확인할 수 있습니다:
http://todo-public-lb-125947158-91f454bb0656.kr.lb.naverncp.com
프로젝트를 진행하며 리소스를 사용할 때 "왜 이것을 선택했는가"에 대한 근거를 갖는 것이 중요하다는 것을 느꼈습니다.
최신 기술을 무리하게 도입하기보다, 3-Tier 아키텍처의 기본 원리를 직접 설계하고 구축하면서 다음을 배울 수 있었습니다:
다음 단계로는 아키텍처를 더욱 확장해 나가고 싶습니다:
이번 현장실습을 통해 클라우드 인프라의 기초를 탄탄히 다질 수 있었고, 실무에서 요구되는 아키텍처 설계 능력을 키울 수 있었습니다.
감사합니다.
정택준
Email taekjunnnn@gmail.com
Team https://nangman.cloud