본문 바로가기

전체 글90

낙관적 락, 데드락, 비관적 락 애니프렌즈 프로젝트는 봉사 모집 기능을 통해 봉사자들이 봉사 신청을 수행할 수 있습니다. 이 때, 각 봉사는 제한 인원이 정해져 있기 때문에 여러 인원이 한 번에 봉사 신청을 수행할 경우 제한 인원보다 많은 인원이 봉사 신청을 수행할 수 있습니다. 이러한 동시성 문제를 해결하기 위해서는 낙관적 락 또는 비관적 락을 이용해서 적절하게 처리해 줄 필요가 있습니다.저희 팀은 봉사 신청이 몰리는 인기 보호소가 있을 것으로 가정하였습니다. 따라서 빈번한 트랜잭션 충돌이 발생할 것이고, 낙관적 락을 사용하는 경우 서로 다른 트랜잭션이 공유락과 배타락을 획득하는 과정에서 데드락이 발생할 것이다라고 예측하였습니다. 다만 아직 데드락이 발생하는 상황을 직접 확인해 본 적이 없었기에 직접 두 눈과 손으로 확인해보고.. 2023. 12. 10.
로그 세팅하기 2탄. 프롬테일, 로키, 그라파나 애니프렌즈 프로젝트에는 AOP와 로그백을 이용해서 클라이언트 요청과 예외를 로깅하고 로그 레벨 별로 파일을 출력하도록 설정하였습니다. 개발 환경에서 클라이언트와 통신하면서 발생하는 문제를 좀 더 쉽게 파악할 수 있을 것이라고 기대했지만 여전히 문제가 되는 부분이 있었습니다. 다음과 같이 로그 파일을 확인하기 위해서는 몇 번의 단계를 거쳐야 했는데 이것이 쌓이면서 피로감이 점점 커져갔습니다. 1. 문제 발생 2. ec2 연결 3. 로그 파일 출력 경로 이동 4. 레벨 별 로그 파일 확인 터미널을 통해 로그를 확인하는 것도 쉬운 일이 아니었습니다. 적어도 지금보다 더 쉽게 로그를 확인 할 수 있는 방법이 필요했습니다. Loki Loki는 Grafana에서 만들어진 로그 수집 시스템입니다. Prometheus.. 2023. 12. 2.
존재하지 않는 객체와 협력하기 로버트 C. 마틴의 저서인 클린 코드 8장 경계와 클린 아키텍처의 17장 경계: 선긋기에서는 코드와 코드 사이의 경계를 나누는 것의 중요성에 대해서 다루고 있습니다. 인상 깊었던 내용으로는 외부 API와 우리 코드 사이에 선을 긋고 인터페이스와 협력하며 코드를 우리 통제 하에 둬라, 아직 존재하지 않는 코드를 사용하기 위해 경계를 파악하라가 있습니다. 이번 애니프렌즈 프로젝트를 진행하며 아직 존재하지 않는 객체와 협력해야 하는 상황이 있었습니다. 마치 책에서 설명하던 것과 유사하였습니다. 그리고 해당 문제를 해결하기 위한 방법을 생각하며 책에서 설명한 내용에 대해서 약간은 더 이해할 수 있는 기회였기에 이에 대해서 정리하고자 합니다. 구현되지 않은 기능 사용하기 저희 팀은 이번 프로젝트를 기획하면서 이미.. 2023. 11. 20.
로그 세팅하기 지난 금요일, 애니프렌즈 프로젝트의 백엔드와 프론트엔드 API 연동을 시작했습니다. 하지만 중간 중간 api가 연동이 잘 안될 때마다 문제를 확인하기 위해 INFO, WARN 여러 레벨의 로그가 기록된 콘솔을 들여다보는 것은 번거로운 일이라는 것을 절실히 느꼈습니다. 따라서 이번 이슈를 해결함으로써 달성하고자 하는 목표는 두 가지 입니다. 첫째, 예외와 API 요청 로깅하기 둘째, 로그 레벨 별 파일로 출력하기 이를 통해 클라이언트로부터의 요청에 응답하는 과정에서 어떤 문제가 발생했는지 훨씬 쉽게 파악할 수 있을 것이라 기대합니다. AOP 적용하기 프로젝트 초기, 예외 상황에 대해서는 AOP를 통해 로그를 남기는 것으로 계획하였습니다. 그러나 이번에 프론트엔드와 연동을 진행하며 어떤 요청이 들어왔는지에 .. 2023. 11. 19.
AWS CodeDeploy를 이용한 배포 성공 이후 발생하는 permission denied 개요 현재 제가 진행하고 있는 프로젝트인 애니프렌즈 백엔드의 개발 환경 배포는 Github Action + AWS S3 + CodeDploey로 이루어집니다. 배포 환경 설정을 위해 ec2 인스턴스에 S3와 CodeDeploy 접근 권한을 가진 역할을 부여하였고 CodeDeploy 역시 기본 생성 시 부여되는 권한을 가지고 있습니다. 문제는 배포까지 성공적으로 이루어졌음에도 애플리케이션이 실행되지 않았습니다. 원인 이유를 찾기 위해서 뒤져볼 로그는 /opt/codedeploy-agent/deployment-root/deployment-logs 디렉터리 하위의 codedeploy-agent-deployments.log 입니다. 로그를 읽기 위해 다음 명령어를 입력해줍니다. cat codedeploy-age.. 2023. 11. 7.
@WebMvcTest와 테스트 코드 개선하기 개요 프로젝트를 진행 초기에 반복적인 테스트 실행을 위해서 해결해야 하는 문제점이 두가지 있다고 판단하였습니다. 첫째, 애플리케이션 컨텍스트 초기화 횟수를 줄여 테스트 시간을 개선할 것 둘째, 문서화 코드 중복을 줄일 것 저는 해당 문제를 해결하기 위해 테스트 코드를 최적화한 테스트 컨벤션을 제시하였습니다. 프로젝트 종료 후 테스트 수행 시간을 체크하였을 때 약 30% 정도 테스트 시간이 감소한 것을 확인할 수 있었습니다. 이번 게시글에서는 상기한 문제의 해결 방법에 대해서 다루겠습니다. 컨텍스트 캐싱 스프링 부트는 통합 테스트를 지원하기 위해 다양한 어노테이션을 지원합니다. @WebMvcTest는 표현 계층 통합 테스트를 지원하기 위한 어노테이션으로 Spring MVC를 구성하는 빈들을 스캔하여 어플리.. 2023. 10. 4.