주특기 학습 주차가 끝나고 나서부터는 TIL에 소홀했던 것 같다.
21일에 최종 프로젝트를 무사히 마치고 발표까지 진행했다.
우리 팀은 B2B SaaS로 프로젝트를 기획해보았다.
사내 비품들을 엑셀로 관리하는 기업들이 많고, 비효율적인 방법으로 관리되고 있기 때문에 관리자나 사용자 모두 편리하게 비품을 관리할 수 있는 시스템을 만들어보고자 했다.
배포 URL
Bipum-In
www.bipumin.shop
Github
https://github.com/Bipum-In/Bipum-In-BE
GitHub - Bipum-In/Bipum-In-BE: 비품인 백엔드 레포입니다.
비품인 백엔드 레포입니다. Contribute to Bipum-In/Bipum-In-BE development by creating an account on GitHub.
github.com
그 간 프로젝트를 진행하면서 느꼈던 점들이나 어려웠던 점들에 대해서 회고하고자 한다.
SSE 관련
연결이 60초 이상 지속되지 않는 문제
이전 글에서 언급했던 문제점이다. 프론트와 백엔드 모두 EventStream 지속시간을 20분으로 맞추어 설정해주었음에도, 연결이 60초 이상 지속되지 못하고 끊어지는 문제가 발생했다.
확인 결과, 클라이언트와 서버 사이에 위치한 NGINX 설정에 문제가 있었다.
NGINX는 리버스 프록시 기능을 제공하는데, 클라이언트의 요청을 Nginx에서 받아 proxy_pass로 지정한 주소로 요청을 전달하게 된다.
[Nginx] 리버스 프록시(Reverse Proxy) 개념 및 사용법
1. 개요 리버스 프록시란? 클라이언트 요청을 대신 받아 내부 서버로 전달해주는 것을 리버스 프록시(Reverse Proxy) 라고 합니다. 저도 사실 프록시라는 개념이 낯설었는데요, 일단 프록시라는 개념
narup.tistory.com
요청을 서버로 전달할 때, Nginx에 설정한 대로 요청을 전달하게 되는데, 이 때 Nginx에 지정된 기본 연결 유지 시간은 60초이다.
그렇기 때문에 프론트나 서버에서 아무리 EventStream 유지시간을 지정한들, Nginx에서 연결을 끊어버려 유지되지 못했었던 것이다.
Nginx 설정에 해당 문구를 추가하여 해결했다.
읽기 및 쓰기 대기시간을 20분으로 지정하고, 연결 대기시간은 30분으로 지정하여 SSE 재 연결 시에 대기시간이 갱신될 수 있도록 조치했다.
무중단 배포 관련
프로젝트가 어느 정도 완성되고 유저 테스트를 진행해야했다. 현재 CI/CD만 구현된 상태이기에 프로젝트를 추가로 빌드하여 배포할 시에 일시적으로 서버가 다운되어 테스트에 장애가 발생할 가능성이 있었다.
멘토님께서도 Docker를 사용해서 배포를 진행해보면 좋을 것 같다는 피드백을 주셨기에, Docker를 사용한 무중단 배포에 도전해보았다.
Docker가 무엇인지도 잘 몰랐기 때문에, Container의 개념에 대해서 먼저 이해가 필요했다.
https://seosh817.tistory.com/345
[Docker] 도커란? - 도커 개념 정리
이 포스트는 시작하세요 도커! 책을 참고하였습니다. 도커란? 도커(Docker)는 리눅스 컨테이너에 리눅스 어플리케이션을 프로세스 격리기술을 사용하여 더 쉽게 컨테이너로 실행하고 관리할 수
seosh817.tistory.com
정리하자면, 우리가 클래스를 이용해 인스턴스를 생성하는 것 처럼 Docker 파일을 사용해서 이미지를 만들게 되는데 이미지 파일 실행 시에 이미지 안의 내가 적어둔 명령어들이 수행되어 이미지를 복사할 당시 서버의 상태와 동일한 환경에서 프로그램을 실행할 수 있다.
나는 GithubActions 와 CodeDeploy를 사용해서 CI/CD를 구현하였는데, 이 구조를 최대한 유지하는 선으로 무중단 배포를 시도해보고자 했다.
그려본 과정은 다음과 같다.
1. 포트를 8081, 8082로 나누어 2개 Spring Boot 프로젝트를 세팅한다.
2. CI 까지는 동일하다. Push 시에 프로젝트를 빌드하고, 해당 파일을 S3에 업로드 한다.
3. 실행되지 않고 있는 프로필(포트)에 프로젝트를 업데이트하고, 실행한다. (실행 중인 프로젝트는 종료한다.)
결과적으로는 무중단 배포에 실패했다.
업데이트된 프로젝트 파일이 업로드 되는 것까지 확인했는데, 세팅해둔 대로 프로필을 번갈아가면서 포트를 변경해주어야할 Nginx가 제대로 동작하지 않는 현상이 발생했다.
Build된 Docker 파일을 확인해보니, Nginx 설정이 옮겨지지 않아 Port를 변경해주지 못한 것으로 확인되었다.
#nginx 이미지와 spring 이미지 생성함.
version: "3"
services:
web:
image: ubuntu/nginx # 존재하는 nginx 이미지 사용
container_name: nginx # Nginx Container 이름 지정
ports:
- "80:80"
volumes:
- /etc/nginx:/etc/nginx # EC2 Nginx와 Docker Nginx Container 를 매핑
spring1:
build:
context: .
dockerfile : DockerFile # Dockerfile 실행
image: spring # 내가 만든 이미지 이름을 지정
container_name: real1 # 컨테이너 이름 지정
ports:
- 8081:8081
volumes:
- ./:/root/ # 요것은.. 필요 없을 수도 있는데 그 이유는 아래에서..
environment:
active: real1 # Dockerfile 실행될 때 환경변수를 사용할 수 있게 지정
spring2:
build:
context: .
dockerfile : DockerFile # Dockerfile 실행
image: spring
container_name: real2
ports:
- 8082:8082
volumes:
- ./:/root/
environment:
active: real2 # Dockerfile 실행될 때 환경변수를 사용할 수 있게 지정.
docker-compose 의 volumes 를 사용해서 현재 서버에 설정된 nginx 설정을 그대로 가져올 수 있도록 했는데, 이상하게도 기본 설정파일 외에는 옮겨지지 않았다. (폴더가 아니라 파일 한 개를 대상으로는 volumes 속성이 잘 작동했다)
해당 현상으로 골머리를 앓다가.. 프로젝트 일정 상 무중단 배포를 계속 잡고 있지는 못한 상황이라, 포기하게 되었다.
블로그를 참고해서 한게 대부분인지라, Docker 명령어들도 내가 원하는대로 커스텀해서 사용하지 못했다.
https://devlog-wjdrbs96.tistory.com/317
[AWS] Spring, Nginx, Docker로 무중단 배포하기 - 2탄
Nginx, Docker를 사용하여 무중단 배포하기 - 2 Nginx, Docker를 사용하여 무중단 배포하기 - 1 에서 간단한 초기 설정들에 대해서 알아보았습니다. 이번에는 실제로 Docker, Nginx를 설정하고 shell script 파일
devlog-wjdrbs96.tistory.com
추후에 기회가 생긴다면 제대로 공부해본 뒤에 다시 도전해보고 싶다.
프로젝트 후기
예상했던 일정대로 프로젝트를 끝마칠 수 있어서 6주 간의 시간이 보람차게 느껴졌다.
이번에 서버를 잡게 되면서 수 많은 에러를 접하게 되면서 클라이언트 - 서버의 통신에 대한 과정을 전보다 상세히 이해할 수 있게 되었다. 또한, 새까만 Git Bash 명령어 입력화면을 두려워하지 않게 된 것 같다.
이전에는 에러가 나는게 무섭고, 마주하지 않기 위해 노력했었던 것 같은데.. 지금은 에러가 문제 해결의 단서를 제시해주는 고마운 친구라는 생각이 든다.
운 좋게도, 항해 시작 때 토이 프로젝트를 함께했던 멤버들과 그대로 최종 프로젝트를 진행할 수 있었다. 협업한 디자이너 분도 열정적이고 유능한 분이셔서, 특별한 의견충돌 없이 화목하게 프로젝트를 완수해낼 수 있었다.
아직 지원 주차이므로, 항해 99가 완벽히 종료된 것은 아니지만 이제 다 왔다는 생각이 든다.
항해 99가 끝나도 넘어야할 문턱이 수없이 많이 남았기에, 나태해지지말고 다음 단계로 차근차근 밟아나가도록 해야겠다.
이후에는 스프링 기초지식과 컴퓨터공학, 알고리즘을 공부해볼 예정이고, 꾸준히 블로그에 정리글을 올려볼 생각이다.
'항해99' 카테고리의 다른 글
항해 99 12기 수료 후기 (Spring) (0) | 2023.04.29 |
---|---|
항해 99 - 2023.03.28 TIL (0) | 2023.03.28 |
항해 99 - 2023.03.09 TIL (0) | 2023.03.09 |
항해 99 - 2023.03.06 TIL (1) | 2023.03.06 |
항해 99 - 2023.03.01 TIL (0) | 2023.03.01 |