본문 바로가기

전체 글

(9)
[Spring] @Transactional 내부호출 🚀  개요프로젝트에서 트랜잭션을 물리적으로 분리해야 했고, 이 과정에서 내부호출이라는 개념을 알게 되었다. 트랜잭션 내부 호출이란 무엇이고 왜 발생하는 것이며 어떻게 해결할 수 있는지 알아보자.트랜잭션이란?트랜잭션이란 더 이상 쪼갤 수 없는 작업의 단위이다. 여기서 작업은 데이터베이스의 상태를 변경하는 것을 의미한다. 트랜잭션의 특징은 다음과 같다.원자성(Atomicity): 트랜잭션 내의 작업은 모두 성공(Commit)하거나 모두 실패(Rollback)되어야 한다.일관성(Consistency): 트랜잭션은 데이터베이스의 상태를 일관성 있게 유지해야 한다. ex) 제약 조건격리성(Isolation): 여러 트랜잭션은 서로 영향을 미치지 않고 독립적으로 수행되어야 한다.지속성(Durability): 트랜..
[NaBMart] 주문 결제 시스템 개선기 🚀 개요 데브코스 4기에서 배달의 민족의 B마트 클론 코딩 프로젝트인 NaBMart 를 개발하였다. 프로젝트는 작년 9월에 끝났지만, 주문과 결제 부분에서 개선할 부분들이 보여 개인적으로 리팩토링을 진행하였다. 리팩토링한 내용은 다음과 같다. 주문 스케줄러 개선 주문 결제 동시성 이슈 해결 주문 스케줄러 개선 우선 NaBMart 의 주문 결제 flow 는 다음과 같다. (결제 PG는 토스페이먼츠를 사용하였다.) 클라이언트가 서버에 주문 요청을 하고, 서버는 주문을 처리하고 재고를 감소한다. 클라이언트가 서버에 결제 요청을 하고, 서버는 주문의 유효성을 검사한 후 PG사와 통신할 때 필요한 데이터를 응답한다. 클라이언트는 PG사에 결제 요청을 하고, 사용자는 결제 방법을 선택하여 결제를 진행한다. 결제가 ..
[Anifriends] Redis 캐시에서 발생한 동시성 이슈 해결기 🚀  개요데브코스 4기에서 봉사 플랫폼인 Anifriends 에서 보호 동물 조회 성능을 높이기 위해 첫 페이지와 총 데이터 개수를 캐시하였다. 개발한 지 3개월 지났지만, Redis와 동시성에 대해 공부를 더 하고 다시 코드를 보니 동시성 문제가 있을 만한 코드가 보여서 수정을 하려고 한다.캐시 자료 구조보호 동물 첫 페이지: 보호 동물 목록은 생성 시간 기준 내림 차순이고, Redis 의 ZSet(Sorted Sets)을 사용하였다. ZSet 은 score 기준 오름차순으로 정렬하므로, score 을 -created_at 로 설정하여 생성 시간 기준으로 내림 차순으로 정렬된 데이터를 캐시하였다.보호 동물 총 수: Redis 의 Strings를 사용하였다.캐시 전략읽기 전략: Look-Aside캐시에..
[MySQL] InnoDB 의 잠금 방식: 레코드락, 갭락, 넥스트키락 🚀  개요RealMySQL 책을 읽다가 InnoDB 스토리 엔진이 제공하는 락인 레코드락, 갭락, 넥스트키락에 대해 알게 되었다. 이 잠금들이 무엇이고 어떤 잠금 효과가 있는지 알아보자.회원 테이블백날 개념만 읽어봤자 잘 이해가 되지 않는다. 간단한 회원 테이블을 생성하여 실제 쿼리를 날려보며 락을 이해해보자. 회원 테이블은 다음과 같이 회원 아이디(member_id), 회원 이름(name), 회원 닉네임(nickname), 회원 나이(age)로 구성된다.10개의 회원 데이터를 생성하였다. 이제 이 데이터에 락을 걸어보며 실험해보자.📖 InnoDB 의 레코드락InnoDB 는 테이블의 레코드가 아닌 인덱스의 레코드를 잠근다. InnoDB 의 레코드락의 특징은 다음과 같다.인덱스를 통해 검색되는 모든 레..
[Anifriends] JPA N+1 문제 개선기 🚀 개요 데브코스 4기에서 봉사 플랫폼인 Anifriends 을 개발하면서 조회 서비스에서 N+1 문제가 발생하였다. N+1 문제란 무엇이고 해결 방안은 어떤 것들이 있는지 학습해 보며 적용해 보자. 📖 N+1 문제란? JPA 의 연관 관계가 설정된 엔티티를 조회할 경우 해당 엔티티와 연관 관계를 갖는 엔티티를 조회하기 위해 N 개의 추가적인 쿼리가 발생하는 문제이다. 즉, 1번의 쿼리를 날렸을 때 N 개의 추가 쿼리가 발생하는 문제이다. 이는 의도치 않은 쿼리를 발생시켜 어플리케이션의 성능 저하로 이어질 수 있다. ✅ N+1 문제 개선하기 내가 맡은 부분은 보호 동물 조회이다. 보호 동물 관련 ERD 는 다음과 같다. 보호 동물 & 보호 동물 이미지 : oneToMany 보호동물 & 보호소 : many..
[Indp] 이벤트와 비동기를 활용한 푸쉬 알림 구현하기 🚀 개요 Indp 프로젝트에서는 메일 푸쉬 알림이 존재한다. 사용자가 음악을 추천하거나 문의 사항을 등록할 경우 관리자의 이메일로 알림을 전송한다. 간단하게 구현한 알림 로직에는 여러 가지 문제를 내재하고 있다. 발생할 수 있는 문제점들을 정의하고 이를 점차 해결해 보자. 🚨 기존 코드 음악 추천 글이 등록되었을 때 실행되는 로직은 다음과 같다. @Service public class RecommendationService { @Transactional public long registerRecommendation(RegisterRecommendationRequest request) { Store store = getStore(request); Recommendation recommendation = n..
[Indp] CORS 에러 해결하기 🚀 개요 Indp 프로젝트에서 서버와 클라이언트를 연동하면서 CORS 에러가 발생하였다. 클라이언트는 AWS CloudFront, 서버는 AWS EC2 로 배포해 놓은 상태였다. CORS 에러란 왜 발생하고 어떻게 해결하는지 학습해보고 적용해보자. 📖 CORS Cross-Origin Resource Sharing 를 의미하며 요청 브라우저에서 다른 출처를 갖는 서버로 요청이 갈 때 브라우저에서 발생하는 보안 정책이다. 여기서 포인트는 다른 출처, 브라우저에서 발생, 보안 정책이다. 각각이 의미하는 것이 무엇인지 알아보자. 다른 출처 URL 에서 출처란 프로토콜, 호스트, 포트 번호를 의미하고 이 중 동일하지 않은 것이 있다면 출처가 다른 것이다. 다른 출처의 예시는 다음과 같다. 프로토콜 http ≠ h..
[Anifriends] 봉사 신청에서 발생한 동시성 이슈 해결기 🚀 개요 데브코스 4기에서 봉사 플랫폼인 Anifriends 를 개발하면서 겪은 동시성 이슈 해결기이다. 보호소가 게시한 봉사 모집에는 정원이 존재하며 봉사자들이 동시에 동일한 봉사 모집에 봉사 신청을 하는 경우 동시성 문제가 발생했다. 동시성 문제를 해결할 수 있는 방법에는 여러가지가 있다. 비관적락, 낙관적락, Atomic Query, MySQL Named lock, Redis (Lettuce, Redisson)을 사용하여 성능을 비교해보고자한다. 🚨 동시성 문제 발생 봉사를 신청했을 때 처리되는 로직은 다음과 같다. @Transactional public void registerApplicant(Long recruitmentId, Long volunteerId) { Recruitment recrui..