Java/Spring

[Spring] 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 후기(+삽질)

jwKim96 2021. 11. 17. 23:12

스프링부트와 AWS로 혼자 구현하는 웹 서비스를 통해 공부한 개인적인 후기를 남깁니다.

이 책을 선택한 이유

평소 팔로우하던 개발자 중 한분이시고, 무중단 배포까지 다룬다는 점에서 기대하고 고르게 되었습니다.

그리고 사실, 이론 공부 보다는 손으로 만지작 거릴 수 있는걸 더 좋아하는 성향입니다.

그래서 실전 예제가 많이 포함되어있는 책으로 먼저 맛을 보고, 이론을 공부하고자 이 책을 선택했습니다.

이 책으로 공부하며

초~중반 프로젝트 진행하는 내용을 보며

초반에는 IntelliJ 설치, 프로젝트 환경 구성 등등 간단히 따라할 수 있는 예제들로 시작하여 빠르게 따라할 수 있었습니다.

2장 ~ 5장 까지 테스트코드 작성, JPA 맛보기, 머스테치로 화면 만들기, 스프링 시큐리티와 OAuth2로 소셜로그인 구현 등등

예제를 보며 따라 진행하기 좋도록 구성되어있었습니다.

오타가 있거나, 환경이 달라서 다른 결과가 나오거나, 2년전 책이라 예제의 설정이 deprecated된 경우가 있었는데요.

그래서 스스로 찾하가며 수정하고 혹은 제가 더 나을 것 같은 설정으로 변경하기도 하였습니다.

그런데 독자들의 네트워크가 아주 잘되어있는 점이 아주 큰 장점이었습니다.

다른 독자분들이 issue를 많이 올려놓으셔서 참고하여 해결하기도 하고, 없는 내용은 해결방법을 공유하기도 하였습니다.

(참고 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 github issue)

보다보니 리펙토링이 필요한 예제 코드들 몇몇 보여서 보여서 책을 끝내고 할 일로 적어두었습니다.

아마 이 책이 가장 빠르고 쉽게 웹 서비스의 모든 과정을 경험한다는 취지를 갖고 제작된 책이라서,

리펙토링이 된 코드를 예제로 하다 보면, 너무 많은 내용을 담아야해서 최대한 간단하게 예제를 만드신 것 같습니다.

그렇게 어느 정도 기본 기능을 구현한 다음, 대망의 배포 자동화 및 무중단 배포 구성 챕터로 진입하였습니다.

중~후반 CI/CD 자동화 및 무중단 배포 구성 내용을 보며

이 부분은 사진과 함께 예제가 아주 자세하게 설명이 되어있어서, TravisCI과 AWS에 대해 잘 모르시는 분도

쉽게 따라하며 CI/CD 파이프라인을 구성할 수 있습니다.

하지만, shell script가 사용되는 부분이 많아서 중간 중간 안되는 부분이 있을 경우 이 부분에서 헤메는

분들도 많겠다 생각이 들었습니다.

먼저, 책에서 제시하는 CI/CD 파이프라인 예시는 아래와 같습니다.

AWS를 활용하여 배포를 진행하도록 구성하였는데, 입문자 대상의 책이라 프리티어를 가정하고 있었습니다.

하지만 저는 이전에 AWS를 갖고 노느라 프리티어가 끝난지 오래였습니다.

저는 AWS는 이미 다룬적이 있었고, 마침 개인 NAS에 Docker를 설치하여 간단히 사용중 이었습니다.

그래서 '책에 있는 예제를 따라하지 말고, Docker로 Jenkins CI/CD 파이프라인 구축 해보자!' 라고 생각하게 되었습니다.

그렇게 저는 이 선택으로 인해 여러번 삽질을 경험하게 되었습니다(ㅋㅋㅋ...ㅠ)

첫 번째 삽질 (Jenkins로 TravisCI 역할 대체하기)

먼저, CI를 구성하기 위해 책을 눈으로만 끝까지 읽은 다음 어떤식으로 구성할지 생각해보았습니다.

Travis C는 간단한 yml 스크립트만 설정하면 정말 간편하고 빠르게 CI를 구성할 수 있습니다.

그리고 AWS S3와 같은 타 서비스로 배포도 지원하기 때문에, CD 또한 마찬가지로 편하게 구현할 수 있습니다.

하지만, 그럼에도 제가 Jenkins를 선택한 선택한 이유는 다음과 같습니다.

Jenkins는 수 많은 플러그인을 조합하여 기능을 추가할 수 있는 확장성이 뛰어난 자동화 서버입니다.

게다가 오픈소스라서 비용도 발생하지 않을 뿐더러 수많은 IT 기업에서 사용하고 있는 검증된 소프트웨어 입니다.

그래서 현업에서도 Travis CI 보다는 Jenkins가 더 많이 쓰인다고 들어 한번 다뤄보는것도 좋겠다 생각하였습니다.

그래서 저는 Jenkins를 활용하여 위와 같은 형식으로 CI/CD를 구성했습니다.

보기엔 책에서 제시한 구조보다 간단해보이지만, 처음이기도 했고 수작업이 많아서 생각보다 시간이 많이 소요되었습니다.

책에서의 빌드 자동화 구성 단계(Travis CI)
1. TravisCI에서 Github 계정으로 로그인
2. 설정에서 특정 repo 활성화
3. 프로젝트 yml 파일 설정(+email notification)

책에서는 위와 같은 순서로 아주 간단하게 CI를 구성하였습니다.

하지만 이를 직접 Jenkins에서 구현하자니 생각보다 간단하지 않았습니다.

내가 구성한 빌드 자동화 구성 단계(Jenkins)
1. Jenkins Docker 이미지로 컨테이너 생성 후 초기 설정 진행
2. 프로젝트용 Job 생성
3. Jenkins서버에서 ssh키 생성
4. Github에 공개키 등록
5. Jenkins Credentials에 비밀키 등록
6. 해당 Github Repository에 Github Webhook 설정 - 삽질(1스택)
7. 빌드 스크립트 추가
8. Notification 추가(email 대신 slack으로 변경) - 삽질(2스택)

1~5번 단계

진행과정에서 2번의 삽질스택(?)을 쌓았지만, 처음에는 순조로웠습니다.

무난하게 Jenkins Container를 올리고, Job을 생성, 공개키 Github Deploy key 등록.

그리고 Jenkins에 비밀키를 등록하고 수동으로 빌드를 실행해봤습니다.(5번까지 완료)

Jenkins console에서 정상적으로 git pull이 동작하는것을 확인하고 순조로운데(?) 라는 착각을 합니다.

프로젝트에서 젠킨스 테스트 커밋 후 푸쉬를 했는데, 아무리 기다려도 빌드가 안됐습니다.

그래서 여러번 수동 빌드도 해보고, 컨테이너를 내렸다 올려보고 ssh키를 새로 생성해서 등록 해보는 등

삽질을 하다가 Github Webhook에 대해 알게되었습니다. (삽질 1스택)

6번 단계

Repository에서 Webhook을 설정 한 뒤, 특정 이벤트(push 등)가 발생하면 미리 설정된 서버로 페이로드를 보냅니다.

그러면 Jenkins에서 Github에서 보낸 페이로드를 받아 빌드가 실행되는 방식입니다.

지나고 보니, Travis CI는 로그인 후 설정에 들어가서 해당 Repository 토글 버튼을 클릭하여 ON으로 설정하면,

제가 구성한 단계의 1~6번까지 원클릭으로 완료되는 것이었습니다.

7번~8번 단계

그렇게 다음 단계인 7번 빌드 스크립트는 간단히 성공하고, 대망의 8번이 남았습니다.

사실 별거 아니지만, 결과를 이메일로 받아보기 위해서 Jenkins에서 Email 보내기 설정을 하려 했습니다.

네이버 메일을 제일 자주 써서, 네이버의 SMTP서버 정보를 넣고 테스트를 해보니 계속 오류가 났습니다.

찾아보니 네이버 SMTP서버는 안전하지 않은 곳으로 부터의 요청(ex> https 가 아닌요청)은 차단한다고 합니다.(삽질 2스택)

그래서 GMail도 확인해봤더니, 개인 보안설정에서 안전하지 않은 요청 설정을 허용할 수 있었지만....

빌드 결과 알림 때문에 구글 계정 보안설정을 건드는건 과하다고 생각하여, Slack으로 노선을 변경하였습니다.

그렇게 Slack 알림 설정 후 정상적으로 알림을 받게됩니다...!

두 번째 삽질(80포트를 사용할수 없다구요?)

두 번째 삽질은, 80포트를 사용할 수 없는것 이었습니다.

CI/CD 파이프라인은 구성했고, 이제 Nginx를 프록시 서버로 두고 서비스 서버로 요청을 포워딩 해주는 설정만 하면 완성입니다.

그런데, 자꾸 80포트로 접속하면 NAS관리페이지로 리다이렉트되었습니다.

관리페이지에서 아무리 설정을 뒤져도 안나와서 찾아보니, NAS에 기본으로 Nginx가 설치되어있고,

이 여기서 80포트를 적절한 서비스로 리다이렉트 시킨다고 합니다.(삽질 3스택)

더 알아보다가 기본 설정을 덮어쓰는 방법은 알아냈지만, NAS 기본 설정을 건드리는 것이 별로 내키지 않았습니다.

그리고 관리시스템 업데이트를 하면 간혹 커스텀 설정이 초기화 된다는 말도 있어서 결국 80포트는 포기했습니다.

그래서 프록시 서버의 기본 포트를 다른 포트로 변경하여 무중단 배포를 구성하였습니다.

그 이외에도..

그 이외에도, 책에서는 AWS 웹 콘솔을 통해 EC2와 RDS의 timezone과 character-set을 편하게 설정하였지만,

저는 직접 cli로 해당 설정파일을 찾아가며 직접 수정하는것도 번거로운 작업이었습니다.

이렇게 다 끝내고나서 다시 책을 봤는데, 새삼 TravisCI와 AWS의 가치를 체감했습니다.

책을 끝내고 나서..

이 책을 사서 보길 잘했다는 생각이 들었지만, 이 책은 프로젝트 생성부터 웹 서비스 배포까지 전체 과정을 경험

하는것이 목표이기 때문에, SpringBoot와 JPA 혹은 배포에 대한 깊이있는 내용을 원하는 분들께는 추천드리지 않습니다.

하지만, 예제로 나와있는 전체 과정에서 제가 원하는 대로 더 수정도 해보고 다른 방법으로도 만들어보면서,

다양한 것들을 건드려보고 알게 되어 좋은 경험이었습니다.

그래서 전체 과정을 한번 쭉 해보고싶은 분들께는 정말 강력 추천 하고싶은 책입니다.