프로젝트 개요
|개발 기간
2025.08.01 -
|팀 규모
김영주 [1인]
|프로젝트 요약
해당 프로젝트는 Oracle DB 활용법 및 RESTful API 설계, 클라우드를 이용한 애플리케이션 배포 등 처음 접하는 기술을 빠르게 학습하고 프로젝트에 적용하는 경험을 하기 위해, 현대오토에버에서 개발한 블루멤버스 서비스를 참고하여 제작한 멤버십 서비스 관련 프로젝트로, 배포 테스트를 완료했지만 아직 개발 단계에 있습니다.
- 완성: 로그인, 회원가입(이메일 인증, 비밀번호 암호화), 새로운 비밀번호 발급, 메인 페이지(MVC, filter)
- 미완성: 마이페이지(개인정보 수정), 자동차/결제수단 CRUD
전체 서비스 흐름
|로그인
이메일과 비밀번호를 이용해 로그인합니다.
눈 모양의 아이콘을 클릭해 작성한 비밀번호를 확인할 수 있으며,
로그인 버튼 클릭시 마이페이지로 이동합니다.
또한, 중앙 우측에 Forgot password?를 통해 비밀번호 재발급 신청이 가능하며,
Create Account을 누르면 뜨는 화면 정중앙 회원가입 팝업을 통해 계정을 생성할 수 있습니다.
|임시 비밀번호 발급
이메일을 통해 임시 비밀번호를 발급받을 수 있습니다.
이메일 형식으로 입력하지 않을 경우 Get new password 버튼이 비활성화되어 임시 비밀번호를 발급받을 수 없습니다.
Cancel 버튼을 누를 경우 로그인 화면으로 이동합니다.
|회원가입
이름, 이메일, 비밀번호, 비밀번호 확인을 통해 회원가입을 할 수 있습니다.
이메일 인증과 비밀번호 입력 조건을 모두 만족해야 회원가입 버튼이 활성화 됩니다.
인증하기를 누르면 입력한 이메일로 인증 코드를 받을 수 있습니다.
1분 안에 새롭게 뜨는 팝업에 인증 코드를 입력하면 이메일 인증이 완료됩니다.
또한, 비밀번호는 영어와 특수문자를 모두 포함해 8자이상 적어야 회원가입 버튼이 활성화 됩니다.
※ 비밀번호는 BCryptPasswordEncoder를 이용해 암호화하여 저장합니다.
|마이페이지
페이지의 우측에서 블루링크 스토어 바로가기를 포함해, 적립된 블루멤버스 포인트/보유한 자동차 수/보유한 카드 현황을 한 눈에 확인할 수 있습니다.
좌측에는 사진과 이름을 포함한 페이지 네비게이션이 존재합니다.
카드 보유 현황에서 카드 상태(전체, 정상, 정지)와 카드 종류(전체, 비신용카드, 신용카드, 체크카드)를 필터링한 결과를 확인할 수 있습니다.
|계정 관리
대표 이미지와 비밀번호, 이름을 변경할 수 있습니다.
|결제 수단 관리
결제 수단을 관리할 수 있습니다.
결제 수단(카드)을 추가, 삭제하거나 정보를 수정할 수 있습니다.
|나의 현대자동차
보유한 자동차를 등록 및 관리합니다.
현재 보유 차량과 삭제(이전 보유) 차량을 확인할 수 있으며, 보유 차량을 삭제 및 추가(차종분류(현대차보유, 타사차보유)선택, 차종, 차량 번호, 출고년월)할 수 있습니다.
|로그아웃
로그아웃하여 마이페이지를 나간 뒤, 로그인 페이지로 이동합니다.
핵심 기능
|Docker를 이용한 OracleDB 환경 구축 및 활용
MacOS(M1 칩) 환경에서는 Oracle이 공식 설치 파일을 제공하지 않고, Apple Silicon(ARM 아키텍처)은 기존 x86_64 기반 DB를 직접 실행할 수 없기 때문에 Docker를 활용해 OracleDB를 구동했습니다.
- 오픈 소스 컨테이너 런타임인 Colima를 이용해 x86_64 환경으로 만들어 줍니다.
- docker를 이용해 oracle-xe 이미지를 다운 받습니다.
- docker 컨테이너를 생성하고 실행합니다.
단, ARM 아키텍처를 쓰는 경우, gvenzl/oracle-xe 이미지 사용 시, platform 호환성 문제가 생겨 실행은 되지만 내부에서 느려지거나 깨져 아예 작동하지 않을 수 있습니다. 이 문제를 해결하기 위해 컨테이너 생성 시, 조건을 붙여 주었습니다.
docker-compose(Yaml)를 이용해 컨테이너 구축 및 관리할 수 있지만, 터미널을 이용한 방법을 경험해보고자 해당 방법을 선택했습니다. 이 과정을 통해 로컬 개발 환경에서의 Docker를 이용해 DB를 구축하고 실행하여 MacOS(M1)에서도 안정적으로 OracleDB 기반의 CRUD 및 쿼리 테스트를 수행할 수 있었습니다.
※ 구체적으로 정리한 자료(Notion) - Docker
※ 참고 자료 - M1 맥북에서 Docker로 Oracle DB 실행하는 방법
|RESTful API 설계: 이메일 인증 시스템
회원가입 과정에서 사용자 이메일의 유효성을 검증하기 위해 RESTful API 기반 이메일 인증 시스템을 설계했습니다. 인증 코드 발급/발송/검증의 세 단계로 구성했고, 추후 다른 서비스에서도 쉽게 확장 가능하도록 모듈화된 구조로 구현했습니다.
- 인증 코드 발급
사용자가 회원가입 시 이메일 주소를 입력하면, 서버에서 6자리 난수 기반의 인증 코드를 생성합니다. 생성된 코드는 MySQL(RDS)에 저장하며, 1분의 유효기간을 설정해 기한이 지나면 자동으로 무효화되도록 설계했습니다. - 이메일 발송
JavaMailSender를 활용해 Gmail과 같은 이메일 전송 서버(SMTP)에 인증 코드 발송 요청을 보내고, 서버가 이를 수신자 메일로 전달하도록 구현했습니다. - 인증 코드 검증
사용자가 입력한 인증 코드를 서버에서 조회해 저장된 값과 비교하여 유효성을 검증합니다. 유효 시간이 지났거나 코드가 일치하지 않으면 인증에 실패하도록 처리했습니다.
|AWS를 이용한 애플리케이션 배포
Github Actions에 deploy.yml 파일을 설정하여 코드 업로드 시, 자동으로 배포가 가능하게 구현했습니다. 추가로, MacOS(SSH 클라이언트 내장)를 사용하고 있기 때문에 PuTTY 설치 없이 터미널에서 바로 EC2에 접속할 수 있었고, 아래와 같은 과정을 통해 배포를 진행했습니다.
~$ ssh -i {my-key.pem} ubuntu@{EC2-퍼블릭-IP}
- EC2 생성
Ubuntu 기반 EC2 인스턴스를 생성한 후, 보안 그룹에서 22(SSH), 8080(Tomcat), 3306(MySQL/RDS) 포트를 열어 원격 접속 및 서비스 요청을 허용했습니다. 또한 키 페어(.pem)를 발급받아 로컬에서 SSH 접속 환경을 구성했습니다. - RDS 생성
AWS RDS에서 MySQL DB 인스턴스를 생성하고, EC2의 보안 그룹을 RDS에 추가해 EC2와 RDS 간 네트워크 통신을 설정했습니다. 애플리케이션의 DB 연결 정보는 src/main/resources/driver.properties에 RDS 엔드포인트, 계정, 포트를 지정해 연동했습니다. - WAS 환경 구성
프로젝트가 Maven 기반 Spring Legacy 구조이므로, Maven build로 WAR 파일을 생성하고, target 디렉토리에서 결과물을 확인했습니다. EC2에는 Tomcat9을 설치해 애플리케이션 서버 환경을 구성했습니다. - 배포
Github Acitions 를 통해 자동으로 배포 되도록, 아래와 같이 deploy.yml 파일을 설정해 주었습니다.
생성한 WAR 파일을 EC2로 전송name: Build and Deploy to EC2 # 워크플로우 이름 on: push: branches: [ "master" ] # master 브랜치에 푸시될 때 실행 jobs: deploy: runs-on: ubuntu-latest # 최신 우분투 환경에서 실행 steps: # 1. 저장소 코드 가져오기 - name: Checkout Repository uses: actions/checkout@v2 # 2. Java 11 설치 및 설정 - name: Set up JDK 11 uses: actions/setup-java@v1 with: java-version: 11 # 3. Maven으로 빌드 및 테스트 실행 (MembershipMini 폴더에서 실행) - name: Build with Maven working-directory: MembershipMini run: mvn clean package # 프로젝트 정리(clean) 후 패키징(war 생성) # 4. 생성된 WAR 파일을 EC2 서버로 전송 - name: Transfer WAR to EC2 uses: appleboy/scp-action@master with: host: ${{ secrets.EC2_HOST }} # EC2 퍼블릭 IP (GitHub Secrets) username: ubuntu # EC2 로그인 사용자명 key: ${{ secrets.EC2_KEY }} # SSH 접속용 PEM 키 (GitHub Secrets) source: "MembershipMini/target/membership-1.0.0-BUILD-SNAPSHOT.war" # 상대 경로로 변경 target: "/home/ubuntu/" # EC2 내 전송 위치 # 5. EC2 서버에 접속해 WAR 파일을 Tomcat 웹앱 폴더로 이동 후 Tomcat 재시작 - name: Deploy on EC2 uses: appleboy/ssh-action@master with: host: ${{ secrets.EC2_HOST }} username: ubuntu key: ${{ secrets.EC2_KEY }} script: | sudo mv /home/ubuntu/MembershipMini/target/*.war /opt/tomcat9/webapps/membership.war # Tomcat 웹앱 경로로 WAR 이동 sudo /opt/tomcat9/bin/startup.sh # Tomcat 서버 재시작
Tomcat 서버로 WAR 파일 이동~$ scp -i {my-key.pem} {WAR파일} ubuntu@{EC2-퍼블릭-IP}:/home/ubuntu/
Tomcat을 재시작하여 애플리케이션을 배포ubuntu@EC2:~$ sudo mv {WAR파일} /opt/tomcat9/webapps/
ubuntu@EC2:~$ sudo systemctl restart tomcat9
※ 참고 자료 - AWS EC2 + RDS를 이용한 스프링 프로젝트 배포 (1)~(3)
개발 과정에서 발생한 문제 및 해결 방안
|RDS 생성 후, OracleDB ➡︎ MySQL로 변경하며 환경 설정 과정에서 발생한 문제
RDS 생성 시 비용 문제로 OracleDB 대신 MySQL을 선택했습니다. 하지만 프로젝트가 OracleDB 기반으로 개발되어 있어 배포 테스트 시, XML 설정 파일의 데이터베이스 관련 설정이 맞지 않아 404 에러가 발생했습니다. 이는 SQL 문법 차이와 Spring Bean 설정 불일치에서 비롯된 문제였습니다. 이를 해결하기 위해 MySQL에 맞게 SQL 문법과 데이터베이스 관련 매퍼 XML 파일을 수정하고, Spring 설정 파일 내 데이터 소스와 SqlSessionFactoryBean 관련 Bean 설정을 MySQL 환경에 맞게 재구성했습니다. 또한, XML 매퍼 파일의 경로와 네임스페이스도 함께 점검하여 정상적으로 매핑되도록 조치한 결과, WAR 파일이 정상적으로 배포되었습니다.
|AWS 설정 과정에서 발생한 보안 그룹 포트 문제
EC2 인스턴스 생성 후 애플리케이션 접근이 되지 않는 문제가 있었습니다. 원인은 AWS 보안 그룹 설정에서 HTTP 및 Tomcat 기본 포트가 차단되어 있었기 때문입니다. 문제 해결을 위해 보안 그룹 인바운드 규칙에 해당 포트들을 추가하여 외부에서 접근 가능하도록 설정을 변경했습니다. 이후 정상적으로 웹 애플리케이션에 접속할 수 있었습니다.
프로젝트 성과 및 느낀점
|배운점 및 성장한 역량
이번 프로젝트를 통해 처음 다뤄본 OracleDB와 AWS 배포 과정을 직접 경험하며, 새로운 기술을 빠르게 학습하고 프로젝트에 적용하는 방법을 익혔습니다. 특히 Docker를 활용해 M1 환경에서 OracleDB를 실행하고, MySQL RDS로 전환하며 SQL 문법과 Spring Bean 설정 차이를 이해하고 조정할 수 있었습니다. 또한 RESTful API 설계를 구현하며, 백엔드 로직과 클라이언트 간의 상호작용 구조를 보다 명확하게 파악하게 되었습니다.
|다음 개선 과제
현재는 GitHub Actions를 활용하여 EC2에 직접 WAR 파일을 배포하는 방식을 시도해 보았습니다. 앞으로는 S3와 CodeDeploy를 활용하는 방식을 적용해 보고자 합니다. 이를 통해 여러 EC2 인스턴스에 동시에 배포하고, 배포 버전 관리도 보다 효율적으로 할 수 있도록 설계할 계획입니다.