1. Trouble Shooting

Github Action CI/CD

  • github action + EC2 + S3 + Codedeploy를 사용해서 배포하려고 시도했으나, 자동 배포까진 되지만 권한 문제로 자동 실행이 되지 않아서 Beanstalk로 변경

  • application.properties파일을 보안 문제로 업로드 하지 않아서 깃헙 액션에서 빌드 실패

  • → deploy.yml 파일에서 깃헙 시크릿 키를 이용해서 동적으로 생성

  • 502 에러 발생

  • → nginx 서버 포트 문제여서 application.properties에서 서버포트 5000번으로 변경

  • 화면 연결

  • thymeleaf 와 jquery를 이용해서 Model과 Ajax로 통신

  • SyntaxError: Unexpected token '<', "을 ResponseEntity로 변경

  • detached entity passed to persist → 카드 이동 시에 기존 카드를 삭제하고 새로운 카드를 생성하는데, 새로운 엔티티가 영속화되지 않아서 생기는 오류 → Col 내에 있는 CardList에 대한 CASCADE.ALL을 CASCADE.REMOVE로 변경

  • 참가자가 중복으로 추가돼서, 댓글 추가 때 여러 결과가 리턴된다는 에러 → 참가자 업데이트 메서드에서 중복 제거, 사용자 엔티티에 닉네임을 추가해서 닉네임은 유니크로 설정 후 참가자에 닉네임 사용

  • 카드 이동시에 jquery.ui가 인덱스를 제대로 찾지 못하는 에러 → 기존 코드에서 .dd-item이 ol > ul > li / ol > li 이렇게 두 개가 존재해 중복이라서 제대로 못찾음 → .kanban .cards 자체에서 sortable로 변경

Redis Lock

  • 락 구성 단위에 대한 고민
  1. 모든 행동에 락 부여

  2. 보드를 생성하는 행동과 컬럼을 생성하는 행동은 독립적임에도 불구하고 오히려 너무 큰 락으로 인해 유저의 활동이 지나치게 제한됨

  3. 동일 엔티티에만 락 부여

    1. 엔티티끼리 같은 LockKey를 가진다면 독립된 엔티티에서의 활동은 모두 정상 작동 → 보드를 삭제하는 요청과 동시에 해당 보드의 컬럼을 수정하는 요청이 들어온다면, 동시성 이슈 발생
  4. 계층적으로 락 부여

    1. Col에서 락을 걸었다면 → Col, Card에선 락 획득 불가
    2. Card에서 락을 걸었다면 → Card에서 락 획득 불가
    3. 다른 엔티티를 대상으로 한 요청이 들어와도 동시성 이슈가 생기지 않음 → 서로 다른 보드들을 삭제하는 요청이 동시에 들어온다면 두 요청은 독립적임에도 락을 걸게 됨 → 계층적으로 락을 구성하고, 락 키를 엔티티 + 락 + 엔티티Id로 구성

HTTPS

  • 보안 그룹, 리스너, 대상 그룹 간 연동 과정에서 health check를 계속 실패하는 문제가 발생

  • → 로드 밸런서에 SSL이 적용되도록 수정하고, 로드 밸런서에 443번 포트로 들어오는 요청 값을 80번 포트로 전환해서 EC2 인스턴스에 전달하는 방법으로 수정

Docker

  • 로컬과 인스턴스 간 환경 차이로 배포 시에 문제를 겪음

  • Redis 서버를 도입하면서, EC2가 종료되면 새로 설정해줘야 하는 문제가 생김

  • 도커 사용에 목적을 두고 JAR이 배포된 빈스토크에 도커 기반 웹을 실행시키고자 함

  • 빈스토크를 JAR 기반 인스턴스로 설정함

  • 깃허브 액션을 통해 JAR 기반 프로젝트 빌드 Flow를 적용함

  • EC2 인스턴스에 레디스 서버를 설정하고 6379 포트를 사용함

  • EC2 인스턴스에 도커 툴 설치

  • 도커 컴포즈 파일 작성 레디스도 배포가 필요했기 때문에 컴포즈를 사용

  • 도커 컴포즈 파일을 작성하고 docker-compose up -d 명령어를 통해 구동에 성공

  • 자동 배포를 위해 깃허브 액션 워크 플로우를 작성

  • 도커 컴포즈를 작성하고 scp-action으로 EC2에 전송

  • 기존 8080, 443, 6379 포트는 이전 프로젝트 배포로 사용중이기 때문에 도커 기반의 스프링 웹 어플리케이션(1234)과 redis 포트(6380)를 새로 할당

  • 깃허브 액션 워크플로우에 이미지 삭제 기능을 추가

  • 빈스토크 환경 에러

  • 빈스토크에 메모리 90% 사용 문제가 발생함

→ 빈스토크 프리티어의 기본 메모리는 1GB → 스왑 메모리를 통해 1GB 추가

  • webapp cpu 사용률 200% 도달
    → 레디스 관련 코드를 배포했는데, 서버에 레디스가 설치되지 않아서 발생

→ 인스턴스 서버에 레디스 설치

2. 주특기 프로젝트 최종 회고

처음으로 스프링을 이용해서 팀원들과 프로젝트를 성공적으로 마쳤다.
앞으로 있을 실전 프로젝트에서는 진짜 대용량 트래픽을 처리한다는 생각에
미리 대용량 트래픽 처리 연습을 해볼 수 있는 기회였다.
그 방법 중 하나로 락을 구현했는데, 대용량 트래픽을 맞이했을 때를 대비해서
많은 시간을 들여서 최대한 다양한 상황을 생각했다.
어떤 부분에 락을 걸고, 락을 걸 때 일어나는 일에 대해서 생각을 많이 하면서
개인적으로 컴퓨터적 사고가 많이 성장한 프로젝트라고 생각한다.

'항해99 > [항해99] Spring' 카테고리의 다른 글

[Spring ] 24.01.24 - TIL  (0) 2024.01.24
[Spring] 24.01.18 TIL  (0) 2024.01.19
[Spring] 24.01.15 - TIL  (0) 2024.01.16
[Spring] 게시판 만들기  (0) 2024.01.04