본문 바로가기

전체 글42

[Spring] 선착순 쿠폰 발급 요구사항 개발 (Redis, Kafka) 이번 포스팅에서는[Inflearn] 실습으로 배우는 선착순 이벤트 시스템 에서 실습한 내용을 기록하고자 하며, 아래 2가지 요구 사항을 만족하고 있다. 1. 쿠폰의 한정된 수량을 초과해서는 안된다.2. 쿠폰은 중복 지급이 불가하여, 1인당 1장만 지급되어야 한다. 위의 요구사항을 만족시키고, 아래 문제를 해결하기 위해 아래 기술을 사용하였다. 선착순이라는 특성으로, 동시성 문제가 반드시 발생할 것이라 예상하고 이를 해결하기 위해 Redis를 활용한다.INCR 커맨드 사용 : 쿠폰의 한정된 수량을 초과하지 못하도록 한다.SET 자료구조 사용 : 쿠폰을 1인당 1장만 지급되어야 하기 때문에 SET 자료구조를 사용하여 중복 지급을 막는다.Redis를 활용하여 동시성 문제를 해결할 수 있었으나, 동시에 많은 요.. 2024. 5. 16.
[Spring] AOP 기반 Redis 분산락 적용 분산 시스템은 인터넷을 통해 연결된 컴퓨터가 하나의 시스템처럼 동작하는 환경을 말한다.따라서, 높은 처리량과 확장성, 고가용성을 보장해 준다. 하지만 분산 시스템은 데이터의 일관성 유지와 트랜잭션 관리 등 여러 복잡한 문제를 해결해야 하는 경우가 존재한다. 특히, 여러 노드가 동시에 공유 데이터를 변경하려고 할 때, 동시성 문제가 발생하여 데이터의 일관성이 무너지게 된다. 이를 방지하기 위해서는 분산락을 사용할 수 있고, 분산 락은 여러 노드가 동시에 접근 가능한 자원에 대한 접근을 하나의 노드만 접근할 수 있도록 제한한다. 이번 포스팅에서는[Inflearn] 재고시스템으로 알아보는 동시성이슈 해결방법 에서 배운 Redis를 활용하여 분산락을 구현하는 2가지 방법과유익한 블로그 글이었던 Kurly Tec.. 2024. 5. 11.
[Spring] JPA 낙관적 락 & 비관적 락 인프런에서 재고시스템으로 알아보는 동시성이슈 해결방법 강의를 들으면서 배운 내용과 추가로 공부한 내용을 기록하려고 한다. 강의를 들으면서, 코드는 아래 링크에 기록해 두었다.https://github.com/minnseong/study-labs/tree/main/stock-system-concurrency-issue  Lock에 대해서 정리하기 전에 강의를 다 듣고 나서, 락을 사용하지 않고 트랜잭션 격리 수준을 통해 동시성 문제를 해결할 수 있지 않을까 라는 고민을 하게 되었다. 격리 수준을 SERIALIZABLE로 설정한 후 강의에서 제공한 테스트 코드를 돌려본 결과, 무수히 데드락이 발생하는 것을 확인할 수 있었다. 당연히 동시성은 잡지 못했다.@Service@RequiredArgsConstruct.. 2024. 5. 8.
[친절한 SQL 튜닝] 인덱스 튜닝 (1) 테이블 액세스 최소화, 부분범위 처리 활용 작년에 면접 준비를 하면서 DB 인덱스에 대해서 정리한 내용이 있다. https://minnseong.tistory.com/19아래 내용보다는 "친절한 SQL 튜닝"을 읽으면서 실무적인 내용과 새로운 개념을 배울 수 있어 책을 읽어보는 것도 추천한다! [DB] Index 정리Index 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스의 검색 속도를 향상하기 위한 자료구조 Index를 통해 검색 속도 향상과 조회 성능을 높일 수 있다. Index를 사용하지 않는minnseong.tistory.com 제 3장. 인덱스 튜닝은 내용이 많아 두 파트로 나눠 정리를 했다.인덱스 튜닝 (1) : 테이블 액세스 최소화, 부분범위 처리 활용인덱스 튜닝 (2) : 인덱스 스캔 효율화, 인덱스 설계 01. SQL 튜.. 2024. 5. 5.
[친절한 SQL 튜닝] 인덱스 기본 작년에 면접 준비를 하면서 DB 인덱스에 대해서 정리한 내용이 있다. https://minnseong.tistory.com/19 아래 내용보다는 "친절한 SQL 튜닝"을 읽으면서 실무적인 내용과 새로운 개념을 배울 수 있어 책을 읽어보는 것도 추천한다! [DB] Index 정리 Index 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스의 검색 속도를 향상하기 위한 자료구조 Index를 통해 검색 속도 향상과 조회 성능을 높일 수 있다. Index를 사용하지 않는 칼럼을 조 minnseong.tistory.com 01. 인덱스 대용량 테이블에서 필요한 데이터만 빠르게 효율적으로 액세스 하기 위해 사용하는 오브젝트 인덱스가 정렬되어 있기 때문에 범위 스캔이 가능하다. 일반적으로 B+ 트리 인덱스를 사.. 2024. 4. 21.
[Spring] 커스텀 Annotation 대상 AOP 적용하기 공부하게 된 계기 최근 업무를 하면서 선임 개발자분께서 AOP를 적용한 코드를 보고, 테스트를 해야 할 일이 있었다. 작년에 강의를 들으면서 Spring AOP에 대해 공부한 적이 있어 어느 정도 코드 이해했지만, 선임과 대화하는 과정에서 헷갈리는 용어가 많아 원할한 커뮤니케이션이 힘들었고, 다음에 AOP를 적용할 부분이 있을 때, 막상 적용하기는 많이 헤맬 것 같다는 생각이 들었다. 그래서 오늘은 김영한님의 스프링 핵심원리 고급 편 PDF를 다시 복기하면서 개념을 복습하고, Annotation를 대상으로 AOP를 적용하는 예시를 통해서 실무적으로도 학습하려고 한다. AOP 탄생 배경 핵심 기능과 부가 기능 핵심 기능 해당 객체가 제공하는 고유의 기능 부가 기능 핵심 기능을 보조하기 위해 제공되는 기능 .. 2024. 4. 13.
[Spring] MDC, 로그 트레이싱하기 오늘은 MDC(Mapped Diagnostic Context)에 대해서 공부한 내용을 기록하려고 한다. 공부하게 된 계기 갑자기 MDC에 대해서 공부하게 된 계기는요, 회사에서 업무를 하다 보니, 실제 개발하는 시간만큼 민원을 처리하는 날들이 많았다. 기존 코드를 이해하는 것보다는 민원을 처리해야 하는 일이 그 업무 프로세스를 완전히 이해해야 하고 있어야 하며 로그를 확인하고 원인을 파악하는 일이라 신입인 나에게 아직 낯선 작업들이었다. 민원을 처리하기 위해 로그 혹은 와탭(Whatap)을 확인 하는 경우가 있는데, 대부분 전문 기록을 확인해야 하는 경우가 많아 로그를 확인한다. 로그를 확인하는 과정을 간단하게 나열하면 다음과 같다. 민원이 발생한 부분의 소스 코드를 찾아 어떤 전문을 사용하는지 찾기 메.. 2024. 4. 2.
[Spring] @OneToOne 에서 N+1 문제 해결하기 직장을 다니면서 기존에 개발했던 프로젝트를 리펙토링 하고 디벨롭하기는 체력도 시간도 되지 않아 입사 초 때는 해야 할 일을 밀어두다가 요즘 다시 예전 기억을 떠올리며, 시간이 될 때 마이브러리 옛날 코드를 보면서 조금씩 천천히 디벨롭해야겠다는 생각이 들었다. 가장 마지막에 개발했던 추천 피드를 개발할 때, @OneToOne에서의 N+1에 대해서 기록하고자 한다. (현 직장에서는 JPA를 사용하지 않고 Mabatis를 사용하기 때문에 JPA에 대해서 많이 까먹은 부분이 많았다.. ) 먼저 @OneToOne 에서의 N+1 가 발생했던 스토리에 대해서 소개하자면.. 현재는 마이브러리에서 "추천 피드"를 조회하는 QueryDsl는 아래와 같다. 조금 복잡하고 보완해야 할 점이 많지만, 이 QueryDsl를 작성.. 2024. 3. 18.
ERD 설계 이후 개발하면서 반정규화 하기 ERD 설계 시, 최대한 정규화를 지키려고 노력하고 함께 많이 조회될 데이터라면 반정규화를 하는 편인 것 같다. 대부분 조인을 통해 계산을 해야 하는 경우, 칼럼을 하나 추가하여 미리 계산하고 데이터를 저장하고, 이후 해당 계산된 값을 조인 없이 조회하여 사용했다. 따라서 마이브러리 프로젝트 ERD를 설계 할때 아래 데이터는 반정규화 하여 ERD를 설계하고 코드를 작성하였다. holder_count : 해당 도서를 소장한 사람의 수 read_count : 해당 도서를 완독한 사람의 수 review_count : 해당 도서의 리뷰 수 등등 따라서, 조회를 할 때는 조인 없이 데이터를 조회할 수 있었지만 리뷰를 쓰거나, 소장/완독 처리 시에는 추가 로직을 작성했었다. 예를 들어, 아래 코드와 같이 하나의 도.. 2024. 3. 17.
[친절한 SQL 튜닝] 데이터 저장 구조 및 I/O 메커니즘 01. SQL이 느린 이유? 디스크 I/O, 디스크(ex 하드디스크)에서 읽기 또는 쓰기 요청 처리하는 시간의 백분율 디스크에서 데이터를 읽어야 할 땐 CPU를 OS에 반환하고 잠시 waiting 상태에서 I/O가 완료되기를 대기 I/O 작업이 많으면, 성능이 많은 영향을 준다. 02. 기본 단위, 블록 데이터 베이스에서 데이터를 읽고 쓰는 단위 = 블록(Block) (오라클 8KB) 데이터 I/O 단위가 블록이므로 특정 레코드 하나를 읽고 싶어도 해당 블록을 통째로 읽는다. 인덱스도 블록 단위로 데이터를 읽고 쓴다. 03. 테이블 블록을 액세스 하는 방식 시퀀스 엑세스 논리적 또는 물리적으로 연결된 순서에 따라 차례대로 블록을 읽는 방식 ex) 인덱스 리프 블록은 앞뒤를 가리키는 주소값을 통해 논리적으.. 2024. 2. 3.