이번 새싹 교육과정에서 세미 프로젝트를 진행했다.
요구사항은 아래와 같다.

어떤 주제로 프로젝트를 진행해볼까... 많은 생각을 하던 중
얼마 전 AWS SAA 기출문제를 많이 풀면서 '이런 건 있었으면 좋겠다~' 하는 기능들을 담은 기출문제 풀이 플랫폼을 만들어보고자 했다.
내가 생각한 플랫폼의 기능은 아래와 같다.
- 기본 콘텐츠 제공: SAA 기출문제 텍스트와 공식 해설은 시스템(관리자)이 기본으로 제공한다.
- 틀린 문제 모아보기 (오답 노트): 사용자가 채점 후 틀린 문제만 별도로 모아 다시 풀어볼 수 있다.
- 플래그 (다시 볼 문제): 헷갈리거나 복습이 필요한 문제에 플래그(북마크)를 지정하여 따로 확인한다.
- 나만의 팁 기록: 각 문제에 대해 사용자 본인만의 풀이 방식, 암기 팁, 메모 등을 기록하고 열람한다.
주어진 아키텍쳐 요구사항을 보고, 내 프로젝트에 맞게 조금 수정해보려고 한다.
우선 주어진 아키텍쳐의 요구사항을 분석해보자.
서비스 중단 없이 안정적으로 운영하고, 트래픽 증가 시 유연하게 대처하는 것이 핵심이다.
- Load Balancing: 사용자가 몰려도 서버가 다운되지 않게 웹 서버, DB 서버 앞에 로드밸런서를 배치했다.
- 정적/동적 데이터 분리 저장: 변경 없는 데이터는 NFS에, 변경 있는 데이터는 DB에 분리 저장하여 성능을 높인다.
근데, 내 플랫폼에서는 조금 변경이 필요해보인다.
현재 요구하는 아키텍쳐의 경우 Database 서버 2개가 동일한 iSCSI를 가리키고 있다.
초기 계획은 db1, db2가 동일한 iSCSI LUN을 공유하도록 설계하려고 했으나, iSCSI는 블록 스토리지이므로 두 서버가 동시에 마운트하면 LVM 메타데이터 충돌이 발생한다.
- 즉, 일반 ext4와 같은 파일시스템은 동시 마운트를 할 수 없고, GFS2, OCFS2 등 클러스터 파일시스템이 필요하다.
- 내 프로젝트는 사용자가 DB에 쓰기를 하는 경우가 많다. (etc: 틀린 문제 기록, 피드백 정리글 기록)
- 따라서 이 부분을 조금 수정하기로 했다.

여기까지 수정을 했을 때, '그럼 사용자가 새로 고침을 해서 WebServer1에서 WebServer2로 갔을 때 어떻게 로그인 상태가 유지되도록 하지?' 라는 생각을 했다.
왜냐면, 특정 사용자가 기록하는 오답/피드백 기록이 특정 사용자에게만 제공을 하려면 로그인 기능이 있어야 할 거라고 생각을 했고, 로드 밸런싱이 된 이후에도 특정 사용자의 로그인 상태가 유지되어야 하기 때문이다.
그래서 도입한 기능이 JWT를 이용한 로그인 상태 인증이다.
- 2대의 웹 서버 중 어디로 접속해도 로그인 상태가 유지되도록 JWT 방식을 채택해, DB 조회 없이 토큰만으로 인증하여 부하를 줄이는 것이다.
인프라 구성 요소 정리
| 계층 | 사용 기술 | 서비스 내 역할 |
| DNS | BIND | 사용자가 브라우저에 sesac.cloud.com을 입력하면 접속할 수 있도록 한다. |
| 외부 Load Balancer | Nginx(L7) | 트래픽을 2대의 웹 서버로 배분한다. |
| 웹 서버 | httpd * 2대 | 웹 페이지를 렌더링하고, NFS에 저장된 문제 파일과 DB의 사용자 정보를 조합해 화면에 보여준다. JWT 토큰을 검증해 로그인 상태를 확인한다. |
| 내부 Load Balancer | Nginx(L4) | 웹 서버의 DB 접속 요청을 관리하며, 주 DB 장애 시 예비 DB로 연결을 자동 전환해 서비스 연속성을 보장한다. |
| DB 서버 | MySQL * 2대 | 사용자 계정, 오답 기록, 플래그, 사용자 팁 등 개인별 동적 데이터를 관리한다. |
| 공유 파일 스토리지 | NFS | 웹 소스 코드, 정적인 문제 데이터(문제 텍스트, 보기, 해설 파일)를 저장하여 두 웹 서버가 공유한다. |
| 공유 블록 스토리지 | iSCSI | DB 서버가 의존하는 실제 데이터 저장용 하드디스크다. (외장 USB 드라이버라고 생각하자) 빠르고 안정적인 데이터 읽기/쓰기 기능을 제공한다. |
서비스 흐름
최종 서비스 흐름은 아래와 같다.
- 사용자가 sesac.cloud.com으로 접속한다.
- 사용자가 로그인/회원가입을 한다.
- 웹 서버가 DB를 조회해 일치 여부를 확인한다.
- 인증 성공 시, 웹 서버는 사용자 고유 식별자(User ID)가 포함된 암호화된 JWT를 생성하고 클라이언트에 전달한다.
- 웹 서버는 NFS에서 '문제 데이터'를 파일 형태로 빠르게 불러와 화면을 구성한다.
- 사용자는 이후 모든 요청 헤더에 JWT를 포함해 보낸다.
- 웹 서버는 DB 조회 없이 자체적으로 토큰의 서명을 검증하고 User ID를 추출하고, 이 ID를 바탕으로 DB 서버에 요청을 보내 기록(오답, 팁)을 저장하거나 불러온다.
단계별 구축 로드맵
데이터 보관 -> 클라이언트 순으로 인프라를 구축하려고 한다.
- 1단계 (스토리지): 웹 소스 및 문제 파일 공유용 NFS 서버와, 데이터베이스용 iSCSI 블록 스토리지 서버를 구축한다.
- 2단계 (DB): MySQL 서버 2대를 구축하고, 1단계에서 만든 iSCSI 스토리지를 연결(마운트)한다.
- 3단계 (내부 LB): 내부 로드밸런서를 만들어 2대의 DB 서버로 트래픽이 분산되도록 설정한다.
- 4단계 (웹 서버): httpd 웹 서버 2대를 구축하고, NFS 스토리지를 연결한 뒤 내부 LB와 통신하도록 세팅한다.
- 5단계 (외부 LB): 외부 로드밸런서를 만들어 웹 트래픽을 2대의 웹 서버로 분산시킨다.
- 6단계 (DNS): sesac.cloud.com 도메인을 외부 로드밸런서와 연결하여 최종 서비스를 오픈한다.
데이터셋
사용한 코드 파일(php)
사실 이전에 배웠지만 까먹기도 하고, 가볍게만 써봤던 기술에 대해 정리해보면서 할 예정이다.
'Infra > Project' 카테고리의 다른 글
| [세미 프로젝트] AWS SAA 기출문제 풀이 플랫폼 - Web 서버 (2) | 2026.02.25 |
|---|---|
| [세미 프로젝트] AWS SAA 기출문제 풀이 플랫폼 - LoadBalancer(internal) 구성 (0) | 2026.02.25 |
| [세미 프로젝트] AWS SAA 기출문제 풀이 플랫폼 - DB 서버 (0) | 2026.02.25 |
| [세미 프로젝트] AWS SAA 기출문제 풀이 플랫폼 - Storage 서버 (0) | 2026.02.25 |
| [세미 프로젝트] AWS SAA 기출문제 풀이 플랫폼 - VM 세팅 (0) | 2026.02.25 |