개인 개발 리포트(중급 프로젝트)
1. 프로젝트 개요
- 프로젝트명: MONEW - MongoDB 및 PostgreSQL 백업 및 복구 시스템
- 목적: 여러 뉴스 API를 통합하여 사용자에게 맞춤형 뉴스를 제공하고, 의견을 나눌 수 있는 소셜 기능을 갖춘 서비스
- 핵심 기능 요약: 사용자 관리, 관심사 관리, 뉴스 기사 관리, 댓글 관리, 활동 내역 관리, 알림 관리
2. 담당한 작업
- 맡은 역할: CI/CD 파이프라인 구축, 뉴스 기사 관리 : 백업 및 복구
- 구체적인 기여 내용:
- AWS
- IAM 사용자 생성, 정책 수립
- S3 버킷 구성, .env 파일 추가
- RDS 구성, EC2 인스턴스 생성
- ECR 구성, ECS 생성 및 태스크 정의 생성(ecs/taskdef-base.json)
- CI/CD 파이프라인 구축
- ci.yml 설계 및 구축
- cd.yml 기초 설계
- Jacoco 테스트 커버리지 라이브러리 사용
- Git Actions, Git Secret 활용
- 뉴스 기사 백업 및 복구
- 뉴스 기사 데이터 백업
- 날짜 단위로 백업하는 기능 구현
- 백업 저장소로 AWS S3 활용
- 백업 작업을 배치로 수행하게끔 구현
- 뉴스 기사 데이터 복원
- S3와 DB 데이터를 비교하여 유실된 데이터만 새로 등록
- 논리삭제와 물리삭제 둘 다 복원되게끔 구현
- 물리삭제 시 기사와 관련된 정보(댓글)도 함께 복
- 뉴스 기사 데이터 백업
- AWS
3. 기술적 성과
- 사용 기술 스택:
- Backend
- Java 17 / Spring Boot 3.4.9 / Spring Data JPA 3.5.2 / Spring Batch 3.4.9 / PostgreSQL 42.7.7 / Junit 5 / mokito 5.1.2 / MapStruct 1.5.5 / logback 1.5.18 / querydsl 5.1.0 / spring web flux 6.2.1.0 / H2 2.3.232
- Infra
- AWS
- EC2 / ECR(Elastic Container Registry) / ECS(Elastic Container Service) / S3 / RDS
- Docker
- GitHub Actions
- Git Secret
- AWS
- Collaboration
- GitHub
- Notion
- etc
- JaCoCo(테스트 커버리지 라이브러리)
- Backend
- 구현한 주요 기능:
- CI/CD 파이프라인 구축
- 깃 브랜치 전략을 수립하고, GitHub Actions를 활용해 CI/CD 파이프라인 구축
- PR(Pull Request) 생성시 테스트가 수행되도록 하기, 테스트 커버리지 80% 이상 달성하기(로직만 구성함)
- AWS ECS를 통해 자동으로 배포되도록 하기
- 백업 및 복구
- 기사 수집 배치작업에 따른 데이터 유실에 대비해 뉴스 기사 데이터 백업하기
- 날짜 단위로 백업하기
- 백업 저장소는 AWS S3 활용하기
- 백업 작업은 배치로 수행하기
- 날짜별로 뉴스 기사를 복구하기
- (S3에 저장된) 백업 데이터와 (DB에 저장된) 현재 데이터를 비교해 유실된 데이터를 새로 등록하기
- 기사 수집 배치작업에 따른 데이터 유실에 대비해 뉴스 기사 데이터 백업하기
- CI/CD 파이프라인 구축
4. 문제점 및 해결 과정
단계 내용
| 상황 (Situation) | 뉴스 기사 데이터 백업 과정에서 트랜잭션 문제 발생 - 지워진 뉴스 기사를 복구하기 위해 S3에 있는 백업파일을 가져와서 deleted를 false로 수정하고 repository에 저장하는 과정에서 오류 발생 |
| 과제 (Task) | 하나의 엔티티를 다수의 트랜잭션에서 동시에 수정할 때 발생하는 충돌을 해결해야함 |
| 행동 (Action) | - 백업 과정에서 발생한 트랜잭션 문제를 팀원들이 알 수 있도록 공유함 - 발생한 오류 분석, 해결하는 데 드는 시간 예측 등 수정에 대한 계획 수립 - 관련된 트랜잭션 클래스&메서드 및 트랜잭션이 바라보는 엔티티등을 분석하며 fix 시작 - 수정하는 과정에서 로그, 디버깅의 적극적 활용 및 테스트 - 부족한 부분은 AI의 조언을 통해 추가적으로 개선 - 해결과 동시에 팀원들에게 공유하고 내 Branch에 업로드 |
| 결과 (Result) | 결과로 얻은 성과, 개선된 점, 배운 점 - 영속성 컨텍스트에 대한 1차 캐시, 애플리케이션 범위의 2차 캐시의 존재를 알게 됨 - DB에 접근해서 데이터를 동시수정할 때 벌어지는 트랜잭션 문제에 대한 해결법으로 낙관적 락, 비관적 락에 대한 존재를 알게 됨 - 여러개의 트랜잭션이 1차 캐시를 바라보기 때문에 발생하는 문제라고 이해하였고, 이를 애플리케이션에서 동일 엔티티에 대해 백업 트랜잭션 로직 내부에서 결과값을 '복사'하여 반환시켜서(2차 캐시) 락을 통해 벌어질 수 있는 동시성 문제를 해소함과 동시에 트랜잭션 문제를 해결함 - 이를 통해 DB에 접근하는 트랜잭션은 하나의 과정에서 여러개가 될 수 있음을 배웠고, 트랜잭션 문제가 무엇인지, 해결법은 구체적으로 무엇이 있는지 명확하게 알게 되었음 |
5. 협업 및 피드백
- 팀원들과의 협업 과정에서 느낀 점 : 이번 협업에서는 요구사항에 따른 코드 작성도 중요했지만, 무엇보다 컨벤션을 준수하고 이와 관련하여 팀원들과 이야기를 적극적으로 주고받는 것을 중요한 부분으로 삼았습니다. 회의 중 나눈 대화와 이에 대한 산출물들에 대해 모든 팀원들이 알고 부족한건 없는지, 이해하지 못한 부분은 무엇인지 등을 공유하며 서로 채워가는 과정을 경험해서 좋았습니다. 이전보다 나아졌지만 아직 부족한 부분이 많다고 봅니다. 앞으로 저 자신을 더욱 갈고 닦겠습니다.
- 피드백 및 개선 사항 반영 내용 : 나아졌지만 아직 부족한 컨벤션 준수에 대해 더욱 신경써야겠다고 생각합니다. 브랜치 전략을 수립할 때 더욱 주의하여 Git 활용을 적극적으로 해나가겠습니다. 무엇보다 협업인만큼 팀원들과의 약속은 가장 중요한 부분입니다. 서로가 공유하면서 사용하는 공간과 컨벤션을 더욱 세심하게 다루겠습니다.
6. 코드 품질 및 최적화
- 코드 가독성 및 유지보수성 고려한 부분 : 컨벤션에 따른 코드 작성법을 준수하면서 최대한 이해하기 쉽게 읽히게끔 메서드명과 변수명을 정하려고 노력했습니다. AWS 관련된 정보들은 민감한 정보라는 것을 이해하고 최대한 형상관리를 통해 사용하기 위해 노력하였고 이를 팀원들과 공유했습니다. Article 폴더 안에 Backup폴더를 따로 만들어 백업&복원 관련된 기능만 관리하게끔 만들어서 유지보수에도 신경썼습니다.
- 성능 최적화를 위해 수행한 작업 : PK와 FK를 활용하여 테이블을 검색하기 위해 최선을 다했습니다. 로직 부분에서도 트랜잭션 문제가 있었던 부분을 제외하고 메서드들을 끌어와서 사용하기 위해 도우미 메서드들을 만들어서 사용했습니다. AWS에서 제공하는 S3 메서드들을 활용하여 간결하게 인증/인가를 하려고 노력했습니다.
7. 향후 개선 사항 및 제안
- 프로젝트 종료 후 개선 가능한 부분 : 백업은 실제 S3에 올라가는지 로컬을 통해 테스트했지만, 복원 부분은 실제로 Get 요청을 받아서 처리하기 때문에 테스트 코드가 작성될 수 있었지만 적지 못했습니다. 이를 추가하여 따로 로그를 적지 않아도 테스트코드 차원에서 잘 들어오는지 확인할 수 있을 것이며, 테스트 커버리지 또한 채울 수 있을 것입니다.
- 다음 프로젝트에서 적용하고 싶은 제안 : 조금 더 직관적이고 구체적으로 팀 컨벤션을 정하고 이를 회의록에 적극적으로 적는 자세를 가지고 싶습니다. 실시간 문서화를 하기엔 회의하는 과정에서 주어지는 정보들을 이해하기도 어려웠는데, 이번 과정에서 얻은 경험을 통해 다음 프로젝트때는 저 자신이 개선되었으면 하는 바램입니다.
8. 참고 링크
- 주요 PR 링크
'Monew' 카테고리의 다른 글
| CD(지속적 배포) 작성 (0) | 2025.09.19 |
|---|---|
| S3에 백업한 뉴스 기사를 '복구'하는 기능 (0) | 2025.09.19 |
| S3 버킷에 데이터를 '백업'하는 로직 (0) | 2025.09.16 |
| CI(지속적 통합) 작성 (0) | 2025.09.12 |
| build.gradle (0) | 2025.09.04 |