분류 전체보기(164)
-
CI시 JPA Entity와 DB Schema 검증하기
최근 PR에서 발생한 데이터베이스 스키마와 JPA 엔티티 간의 불일치 문제로 인해 서버가 과부화되는 문제가 발생했습니다. 이로 인해 EC2의 CPU 사용률과 CPU 크레딧 사용량을 급증시키고, 결국 예상보다 높은 비용이 발생하게 되었습니다. 이를 방지하기 위해 CI 파이프라인에 JPA Entity와 DB Schema 검증 단계를 추가하였습니다.문제 상황스키마 오류로 인해 서버 애플리케이션이 지속적으로 재시작되는 상황이 발생했습니다. 이는 다음과 같은 문제를 야기했습니다.서버 과부하: 애플리케이션이 지속적으로 재시작되면서 EC2 인스턴스의 CPU 사용률과 CPU 크레딧 사용량이 급증비용 증가: 예상보다 높은 비용이 발생 문제 해결 방법 이러한 문제를 방지하기 위해, JPA Entity와 DB Schema가..
2024.06.28 -
통합 테스트에 테스트컨테이너 도입
프로젝트를 진행하며 개발집의 테스트에 대해 고민하게 되었습니다. 현재 프로젝트에서 테스트의 상당수를 차지하고 있는 것은 통합 테스트입니다. 통합 테스트는 애플리케이션의 모든 구성 요소가 개발자의 예상대로 작동하는지 확인하는 것입니다. 그러나 기존 개발팀의 통합 테스트는 서비스 환경의 DB와는 달리 H2를 사용하고 있었습니다.또한, Redis의 경우에는 테스트 전 수동으로 실행하고 있었습니다. 문제점이러한 방식은 실제 환경과 다른 데이터베이스를 사용하기 때문에 테스트의 신뢰성을 보장하기 어렵고, 테스트 시마다 Redis를 수동으로 실행해야 하므로 개발자의 생산성이 저하되며, 개발자의 로컬 환경마다 테스트 데이터가 상이할 수 있다는 문제가 있었습니다. 따라서, 통합 테스트 시 DB를 세팅하는 방법에 대해 ..
2024.06.25 -
Spring Event와 @Aysnc를 사용해 회원가입 개선
이번 포스팅에서는 기존에 회원가입 코드를 Spring Event와 @Async를 사용해서 개선하는 과정을 포스팅하려합니다. 필요성 - Event 저희 서비스의 회원가입 기능안에는 해당 회원이 회원가입을 할 수 있는 유저인가 확인, 특정 이메일로 인증 메일 보내기 그리고 회원 정보 생성으로 이루어져있습니다. 위와 같이 코드를 작성하게 되면, "메일 보내기"와 "회원가입"의 의존성이 강해집니다.의존성이 강해진다는 것은 재사용성이 낮아지고 단위 테스트가 어려워집니다. 특히, 이메일 보내기는 여러 도메인에서 사용될 가능성이 높은 경우이기 때문에 Event를 사용해서 회원가입 서비스에서 이메일 서비스에대한 의존성을 제거하여 재사용성을 높인다는 것이 큰 이점이라 판단했습니다. 필요성 - 비동기 처리비동기 처리 전..
2024.06.09 -
Request Time Out이 발생하는 이유 - ALB Connection idle timeout
프로젝트를 진행하며 배포 직후 회원 가입 요청에서 request time out이 몇 번이고 발생하였습니다.(몇 번 요청한 이후에는 발생하지 않았다.) 이에 대한 원인은 무엇일까?배포 직후라는 점에서 JVM의 동작 방식과 관련이 있을 수 있습니다. 또한, 제가 작성한 코드 안에서 병목 지점이 있을 수 있습니다.그것도 아니라면, 인프라상에 문제가 있을 수도 있습니다. 이번 포스팅에서는 Request Time Out 문제를 해결하기 위해 인프라에서 시도한 것들에 대해서 이야기하겠습니다. 현재 인프라에서 Request Time Out 응답이 오는 케이스를 생각해보면, 아래와 같을 것입니다. 첫 번째, 애플리케이션에서 해당 API 처리가 지연된 경우 해당 서버의 TimeOut 시간을 초과해 애플리케이션에서 A..
2024.06.03 -
전략 패턴을 이용해서 요구사항 대응하기
프로젝트를 진행하다가 요구사항이 변경되었다. 기존 요구사항은 "식사 등록시 한 식사에 대해 인 분(multiple)이란 단위만을 사용하는 것이었다." 요구사항은 "식사 등록시 각 음식에 대해 인 분(multiple) 또는 g(무게) 단위를 사용하는 것"으로 바뀌었다.식사를 등록할 때 단위는 얼마든지 바뀌거나 수정될 수 있다. 문제는 바뀐 요구사항에의해 음식의 영양소를 분석하는 기존 로직을 수정해야한다는 것이었다.이는 OSP(Open Closed Principle)에 위배된다. 따라서, 전략 패턴을 사용해 새로운 "단위"가 도입되더라도 변경이 최소화되도록 코드를 개선하였다. 전략 패턴 전략 패턴은 실행 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 해주는 디자인 패턴이다. 전략..
2024.06.01 -
CI/CD 파이프라인 구축
이번 학기 캡스톤 프로젝트에서 CI/CD 파이프라인 구축을 해보아서, 이번에도 비슷하게 하면 되겠지 라는 마음으로 임하였다가 꼬박 몇 시간 동안 파이프라인 작업만 하였습니다.. 개발집에서는 GitHub Actions를 사용해 파이프라인을 구축하였습니다.GitHub Actions를 사용한 이유는 아래와 같습니다.GitHub과 하나로 통합된 환경인 만큼 친숙하다.친숙한 문법인 YAML 파일을 사용하여 파이프라인 구축이 가능하다.다음으로, 파이프라인의 흐름을 살펴보겠습니다. 전체적인 흐름docker image를 build 후 push 한 후 EC2 서버내에서 해당 이미지들을 Pull해와 docker-compose로 컨테이너들을 작동시키는 것이다.그리고, docker-compose할 때 필요한 설정 파일들은 ..
2024.05.26