백엔드16 낙관적 락, 데드락, 비관적 락 애니프렌즈 프로젝트는 봉사 모집 기능을 통해 봉사자들이 봉사 신청을 수행할 수 있습니다. 이 때, 각 봉사는 제한 인원이 정해져 있기 때문에 여러 인원이 한 번에 봉사 신청을 수행할 경우 제한 인원보다 많은 인원이 봉사 신청을 수행할 수 있습니다. 이러한 동시성 문제를 해결하기 위해서는 낙관적 락 또는 비관적 락을 이용해서 적절하게 처리해 줄 필요가 있습니다.저희 팀은 봉사 신청이 몰리는 인기 보호소가 있을 것으로 가정하였습니다. 따라서 빈번한 트랜잭션 충돌이 발생할 것이고, 낙관적 락을 사용하는 경우 서로 다른 트랜잭션이 공유락과 배타락을 획득하는 과정에서 데드락이 발생할 것이다라고 예측하였습니다. 다만 아직 데드락이 발생하는 상황을 직접 확인해 본 적이 없었기에 직접 두 눈과 손으로 확인해보고.. 2023. 12. 10. 로그 세팅하기 2탄. 프롬테일, 로키, 그라파나 애니프렌즈 프로젝트에는 AOP와 로그백을 이용해서 클라이언트 요청과 예외를 로깅하고 로그 레벨 별로 파일을 출력하도록 설정하였습니다. 개발 환경에서 클라이언트와 통신하면서 발생하는 문제를 좀 더 쉽게 파악할 수 있을 것이라고 기대했지만 여전히 문제가 되는 부분이 있었습니다. 다음과 같이 로그 파일을 확인하기 위해서는 몇 번의 단계를 거쳐야 했는데 이것이 쌓이면서 피로감이 점점 커져갔습니다. 1. 문제 발생 2. ec2 연결 3. 로그 파일 출력 경로 이동 4. 레벨 별 로그 파일 확인 터미널을 통해 로그를 확인하는 것도 쉬운 일이 아니었습니다. 적어도 지금보다 더 쉽게 로그를 확인 할 수 있는 방법이 필요했습니다. Loki Loki는 Grafana에서 만들어진 로그 수집 시스템입니다. Prometheus.. 2023. 12. 2. 존재하지 않는 객체와 협력하기 로버트 C. 마틴의 저서인 클린 코드 8장 경계와 클린 아키텍처의 17장 경계: 선긋기에서는 코드와 코드 사이의 경계를 나누는 것의 중요성에 대해서 다루고 있습니다. 인상 깊었던 내용으로는 외부 API와 우리 코드 사이에 선을 긋고 인터페이스와 협력하며 코드를 우리 통제 하에 둬라, 아직 존재하지 않는 코드를 사용하기 위해 경계를 파악하라가 있습니다. 이번 애니프렌즈 프로젝트를 진행하며 아직 존재하지 않는 객체와 협력해야 하는 상황이 있었습니다. 마치 책에서 설명하던 것과 유사하였습니다. 그리고 해당 문제를 해결하기 위한 방법을 생각하며 책에서 설명한 내용에 대해서 약간은 더 이해할 수 있는 기회였기에 이에 대해서 정리하고자 합니다. 구현되지 않은 기능 사용하기 저희 팀은 이번 프로젝트를 기획하면서 이미.. 2023. 11. 20. 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. Parameter와 Argument 0. 기본적인 개념에 확신이 없어서는 안 된다. 제대로 정리하지 않아 애매하게 알고 있었던 Parameter와 Argument에 대해 제대로 정리하고 넘어가도록 한다. 1. Parameter 파라미터는 함수에 입력으로 제공되는 데이터 중 하나를 참조하기 위하여 함수에서 사용되는 특수한 종류의 변수입니다. 일반적으로 메서드의 시그니처(메서드 선언)에 파라미터의 목록이 포함됩니다. add라는 메서드를 정의해보겠습니다.public int add(int x, int y) { return x + y; } 이 때 x와 y가 파라미터, 즉 매개변수가 됩니다. 2. Argument 아규먼트, 즉 인수는 메서드 호출시 실제 입력으로 제공되는 값 입니다. 매번 메서드가 호출될 때마다 연관된 매개변수에 인수가 할당됩니다. .. 2023. 6. 20. [디자인 패턴] 옵저버 패턴 옵저버 패턴은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one to many) 의존성을 정의합니다. 옵저버 패턴은 주제(Subject)와 옵저버(Observer) 간의 일대다 관계로 구성됩니다. 주제의 상태가 바뀌면 옵저버에게 정보가 제공됩니다. public interface Subject { void registerObserver(Observer o); void removeObserver(Observer o); void notifyObserver(); } public interface Observer { void update(); } Subject 인터페이스 옵저버를 등록하고, 삭제하고, 상태가 변화했음을 알립니다. Observer.. 2023. 6. 19. 이전 1 2 3 다음