전체 글270 동시성 문제 해결 1. 문제리뷰삭제 요청에서 단일결과를 예상했지만, 9개의 결과를 리턴한다고 합니다. 예상대로라면 리뷰좋아요는 member당 하나씩 밖에 갖지 못합니다.1-1. 문제 원인리뷰를 저장할 때 동시성 이슈가 발생해서 그렇습니다.Transaction1과 Transaction2가 거의 동시에 시작되어 각각 BEGIN을 합니다.두 트랜잭션 모두 memberId=1, reviewId=1인 데이터를 찾기 위해 findByMemberIdAndReviewId를 호출합니다.빨간색 박스로 표시된 Race Condition 구간에서:Transaction1이 조회했을 때 "결과 없음"을 받습니다 (아직 좋아요가 없으므로)Transaction2도 조회했을 때 "결과 없음"을 받습니다 (Transaction1이 아직 커밋하지 않았으므.. 2024. 12. 22. 올바른 Optional 사용법 🤔 Optional 사용목적Optional은 메서드의 리턴 타입으로 Null일 수도 있음을 명확히 표현하는 용도Optional 사용하기 전 주의반환 값에서 Null을 반환할 수 있다고 알릴 때 Optional을 사용한다고 했습니다. 그러나 애초에 Null을 반환하는 행위 자체가 안티 패턴입니다. Optional을 사용하기 전에 Null을 반환하는 메소드를 수정하는 것이 좋습니다. ex) 빈 값 반환, -1 반환😲 Optional 올바른 사용법1. Optional 객체에 null를 할당하지마라반환 값을'null'로 반환할 경우 서비스 로직에서NullPointerException이 발생할 수 있기 때문에 Optional을 사용합니다. 즉, 서비스 로직에서 Optional을 반환받으면 Optional이 감.. 2024. 12. 21. 🙊 Fixture Monkey 도입 🙊 Fixture Monkey 도입 이유객체 생성객체가 가지고 있는 데이터 항목이 많아 객체 생성 비용이 크다.비즈니스 요구사항이 변경될 때 객체를 변경하고 테스트를 수정해야 할 수 있다.엣지 케이스 발견엣지 케이스를 직접 찾아야 하고 동일한 테스트를 여러번 작성해야한다🤔 Fixture Monkey가 뭔디https://naver.github.io/fixture-monkey/v1-0-0/Fixture Monkey는 테스트를 위한 객체 생성을 자동화해주는 Jqwik 기반 PBT 라이브러리입니다.🤔 Property-based Testing (PBT)는 뭘까?Property-based Testing은 테스트 케이스를 일일이 작성하는 대신, 프로그램이 랜덤 속성(property)을 만들어주고 테스트하는 방식.. 2024. 12. 19. Gighub Action , Docker Compose, Nginx, code deploy 무중단 배포 무중단 배포1. rolling update 배포새로 배포되어야 하는 버전을 하나씩 순차적으로 적용시키면서 배포하는 방식입니다. 한 번에 모두 배포되는 게 아니기 때문에 배포가 되는 과정에서 옛날 버전과 새로운 버전이 공존합니다. 그렇기 때문에 잘못하면 배포하는 과정 중에 호환성 문제가 생길 수 있습니다2. Blue,Green 배포예시를 들자면 이전의 8080포트를 쓰고 있는 컨테이너가 있습니다. 새로운 컨테이너를 새로운 포트(8081)로 올립니다. 다 올려졌다면 nginx는 새로운 컨테이너 포트로 연결하고 이전 컨테이너는 내립니다.3. 카나리 배포적은 사용자에게 먼저 배포 후 A/B 테스트. 현재 단계에서는 고려하지 않겠습니다.rolling update는 인스턴스를 두 대 이상 사용하여 비용 문제가 발생.. 2024. 12. 18. Gighub Actions,docker 배포(Linux Ec2) GitHub ActionsGitHub Actions는 일반적으로 CI(Continuous Integration, 지속 통합) 또는 CD(Continuous Deployment, 지속 배포)와 같은 자동화를 위해서 사용됩니다. 운영환경에 소스코드를 머지하기 위해 반복적으로 처리되야 할 일들들을 처리해줍니다. 즉, CI/CD를 위한 파이프라인입니다. CD ( Code Deploy)Source Code를 운영환경에 자동 배포하는 역할을 수행하는 행위(지속적 자동 배포) 전체적인 플로우1. Github Action에서 소스코드를 빌드한다.2. Github Action에서 빌드한 소스코드를 이미지로 빌드한다.3. Github Action에서 빌드한 이미지를 Docker 레퍼지토리에 넣는다.4. Github Act.. 2024. 12. 18. 데이터베이스 시스템에서 동시성을 제어하는 방법? 대표적인 동시성 제어 방식으로 MVCC(Multi-Version Concurrency Control) 와 Lock-Based Concurrency Control이 있습니다.1. MVCC(Multi-Version Concurrency Control/ 잠금 없는 읽기)MVCC는 데이터의 여러 버전을 유지하여 트랜잭션이 동시에 데이터를 읽고 쓸 수 있도록 하는 방식입니다. 각 트랜잭션은 자신만의 일관된 스냅샷(MySQL::언두 로그)을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항에 영향을 받지 않습니다.데이터의 각 버전을 유지하여 읽기 작업이 쓰기 작업과 독립적으로 이루어질 수 있습니다. 트랜잭션은 시작 시점의 스냅샷을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항을 보지 못합니다.또한 읽기 작업.. 2024. 12. 18. [쿼리문 개선] 댓글/대댓글 조회 dto로 받기 && 반복 루프로 인한 추가 쿼리 호출 문제 해결 기존코드PostCommentGetService@Service@RequiredArgsConstructorpublic class PostCommentGetService { private final PostCommentRepositoryCustom postCommentRepositoryCustom; @Transactional public List getPostComment(long postId) { List postCommentList = postCommentRepositoryCustom.findByPostId(postId); List responseList = new ArrayList(); Map responseHashMap = new HashMap();.. 2024. 12. 18. DB ↔ ENUM 컨버터, 상하위 ENUM으로 명함 도메인 최적화 1. 기존 설계의 한계관심사는 별도의 테이블에서 관리되고 있었습니다. 이를 명함 데이터와 연결하기 위해 관심사 테이블과 명함-관심사 매핑 테이블이 필요했습니다interest 테이블: 관심사 데이터를 저장.id_card_interest_mapping 테이블: 명함(id_card)과 관심사(interest)를 연결.데이터 예시:interest 테이블:idname1GAME2MOVIE3DRAMAid_card_interest 테이블:id_card_idinterest_id101110121021문제점id_card테이블에 관심사를 담지 않고 id_card_interest 테이블에 별도로 저장함에 따라 한 개의 idCard가 여러 행을 차지하기 때문에 데이터 공간 낭비라고 생각하였습니다명함 조회 시, 관심사 테이블과 매.. 2024. 12. 18. 사용자가 웹사이트에 처음 접근했을 때 발생하는 일련의 과정 예를들어 사용자가 www.google.com을 입력하면, 브라우저는 HTTP 프로토콜을 사용해 구글 웹 서버와 통신하려고 합니다. HTTP는 OSI 7계층 중 애플리케이션 계층에서 동작하는 프로토콜입니다.이때 브라우저는 요청한 도메인 이름(www.google.com)에 대한 IP 주소를 알아야 하기 때문에 DNS(Domain Name System) 서버에 질의합니다. 이 질의 과정 또한 애플리케이션 계층에서 이루어지며, DNS 서버는 해당 도메인에 대한 IP 주소(예를 들어, 142.250.190.78)를 응답합니다.IP 주소를 얻은 후, 브라우저는 구글 서버와 통신을 시작합니다. HTTP는 TCP/IP를 기반으로 작동하므로, 데이터를 주고받기 전에 TCP 3-Way Handshake 과정이 필요합니다... 2024. 12. 16. 이전 1 2 3 4 5 6 ··· 30 다음