본문 바로가기

전체 글88

존재하지 않는 객체와 협력하기 로버트 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.
낙관적 락과 동시성 테스트하기 개요 여러 명의 라이더가 하나의 배달에 대해 동시에 배차 요청을 하는 상황이 있을 것입니다. 라이더A가 배달에 대해 배차 요청을 하고, 동시에 라이더B가 배달에 대해 배차 요청이 들어오게 된다면 다음과 같은 상황이 발생할 것입니다. 이 경우 라이더A가 배달에 대해 배차 요청을 하고 요청이 성공했다는 응답까지 받게 됩니다. 그러나 동시에 들어온 라이더B의 배차 요청으로 인해 라이더A의 갱신 내역은 사라지고 라이더B의 갱신 내역이 저장되게 됩니다. 이를 두 번의 갱신 분실 문제라 합니다. 이를 해결하기 위해서는 다음과 같은 방법이 있습니다. 마지막 커밋만 인정하기 최초 커밋만 인정하기 충돌하는 갱신 내용 병합하기 기본적으로는 마지막 커밋만 인정하기가 사용됩니다. 하지만 배차 요청의 경우 마지막 커밋만 인정해.. 2023. 9. 16.
분산 환경에서의 스프링 스케줄러 사용 개요 스케줄러를 사용할 때, 서버가 하나뿐인 환경에서는 동시에 같은 스케줄링 작업이 중복해서 실행되는 것을 고려할 필요가 없습니다. 그러나 둘 이상의 서버를 사용하는 분산 환경에서는 클러스터링이 필요합니다. 세션 기반 로그인을 분산 환경에서 사용해보았다면 레디스나 JDBC를 이용해서 세션 클러스터링을 고민해보거나 시도해본 경험이 있을 것입니다. 스케줄러도 동일합니다. 분산 환경에서 스케줄링한 작업이 동시에 한 번만 실행하는 것을 보장해주기 위해 클러스터링이 필요합니다. 이에 대한 해결방법은 두 가지입니다. 첫째, 스케줄러 락을 제공하는 라이브러리인 shedlock을 사용하는 것 둘째, 스프링이 제공하는 스케줄러 대신 quartz를 사용하여 스케줄러 클러스터링을 하는 것 저는 전자의 방법인 shedlock.. 2023. 9. 10.