해당 프로젝트는 이동욱 개발자님의 "스프링 부트와 AWS로 혼자 구현하는 웹 서비스" 책을 읽으며 공부한 클론 프로젝트입니다.
-
- Java8
- gradle version 4.x
- Spring Boot 2.4.x
- IntelliJ Ultimate
-
스프링부트를 사용한 웹어플리케이션 개발의 전반적인 설계
-
스프링부트 기반 어플리케이션이 실행될 AWS 인프라 관련 구축
-
CI/CD
2가지 핵심요소를 중점적으로 배우고 이해한 부분을 작성하겠습니다.
웹 어플리케이션의 기본적인 UI는 부트스트랩을 통해 구성했으며, Mustache 뷰 엔진을 사용했습니다.
- Google, Naver 등의 console에 프로젝트를 등록 후 OAuth client-id, secret을 발급
- application-oauth.properties file 생성 이후 client-id, client-secret 등을 spring-security 등록
- 각 console에 승인된 URL, Redirection URL을 입력
- spring-security dependency 추가 - compile('org.springframework.boot:spring-boot-starter-oauth2-client')
- 테스트 코드 작성의 장점
단위 테스트는 개발단계 초기에 문제를 발견하게 도와준다.
단위 테스트는 개발자가 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기존 기능이 올바르게 작동하는지 확인할 수 있다.
단위 테스트는 기능에 대한 불확실성을 감소시킬 수 있다.
단위 테스트는 시스템에 대한 실제 문서를 제공한다. 즉, 단위 테스트 자체가 문서로 사용할 수 있다.
DB와 직접적으로 연결 된 Entity Class는 절대로 Request/Response 목적으로 사용되면 안된다. Entity Class를 기준으로 테이블이 생성되고, 스키마가 변경된다. 만약 이러한 Entity Class가 뷰에 통해 빈번하게 변경된다면, 로직에 의도하지 않게 많은 변화가 초래될 수 있다. 따라서 view Layer와 DB Layer 간 철저하게 분리를 유지하는 것이 좋다!
- 추가적으로 데이터의 join이나 변경등의 목적으로도 DTO가 유용하게 사용된다.
-
EC2 보안 인바운드 SSH를 내IP로 변경
-
HostName에 ec2-user@EC2 EIP를 입력 후 접속
- ssh -i (.pem 위치) EC2 EIP
- ~에 .ssh dir을 생성하여 .pem파일을 등록 후 chomod 600
- .ssh dir에 config를 생성 후 chomod 700
Host ServiceName
HostName EC2 EIP
User ec2-user
IdentityFile ~/.ssh/.pem file
- 이후 ssh (config에 등록한 ServiceName) 으로 접속 가능
스프링부트 프로젝트 실행을 위한 EC2 Server 내 필수 설정
- JDK설치 (여기서는 Java 8)
sudo yum install -y java-1.8.0-openjdk-devel.x86_64
- timeZone 변경
sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
이후 date로 KST확인
- hostName 변경(여러 서버 관리의 경우 IP만으로 서비스 파악이 힘듬)
sudo vim /etc/sysconfig/network를 열어 HOSTNAME=원하는 이름을 추가
sudo vim /etc/hosts에 127.0.0.1 등록한 원하는 Hostname을 등록
- RDS 인스턴스 생성 후 timeZone, character Set 변경
- character Set의 경우 utf8mb4를 보편적으로 많이 사용
- RDS 보안 그룹에 IP를 추가
- 보안 그룹 ID와 IP를 RDS 보안 그룹의 인바운드로 추가
- Database Navigator Plugin 설치 (InteliJ)
- Host에는 RDS의 엔드 포인트를 등록 (RDS 설정에 보면 엔드포인트 확인가능)
- User는 RDS생성시 입력한 마스터 사용자 이름(기본 admin)
- EC2에 MySql 설치 sudo yum install mysql 이후 계정, 비밀번호, host주소를 사용해 RDS접속
- 접근 가능 확인
- Travis CI
- 프로젝트에서 .travis.yml생성
- Travis CI와 AWS S3, CodeDeploy 연동 (인바운드 규칙 확인 필요)
- .travis.yml에서 정의한 branch에 push하면 자동으로 배포
-
서버 개발자는 InteliJ 를 사용해 개발을 진행하며, GitHub에서 코드가 관리 .
-
GitHub master branch에 푸쉬가 이뤄지면 TravisCI를 통한 테스팅 과정 및 빌드가 진행되고 jar 파일을 AWS S3에 저장.(CodeDeploy에 저장 기능이 없기때문)
-
이 jar 파일을 통해 AWS CodeDeploy에서는 EC2로 배포를 진행.
-
EC2 에서 설계된 scprit가 실행되며 nginx가 바라보고 있지 않은 포트를 찾고 새로운 버젼의 배포가 실행.
-
배포가 정상적으로 실행되었으면 nginx가 바라보는 포트를 새로운 버젼의 포트를 바라보게 스위치 시킴.
- 스프링부트를 통한 웹 어플리케이션 제작의 전반적인 흐름을 이해할 수 있었습니다.
- SpringSecurity를 통해 보다 안전한 인증 및 인가 절차를 제공할 수 있다는 것을 배웠습니다.
- DTO의 존재 목적에 대한 고민을 해 보았습니다.
- 클라우드 환경에서 서버 및 배포환경을 구축하고 무중단 배포까지 배포 과정의 전체적인 흐름을 이해하고, 경험해 볼 수 있었습니다.
