본문 바로가기

분류 전체보기48

[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.
[AWS] 푸시 알림 기능 개발 (1) - AWS SNS와 SQS 생성 및 연동 소프트웨어 마에스트로 14기 때 "마이브러리"를 기획/개발하면서, 개발 능력 향상 뿐만 아니라 우리 팀의 목표는 직접 사용자에 대한 피드백으로 앱을 디벨롭하고 실사용자로부터 생기는 이슈를 해결하고자 했다. 그러한 과정에서 사용자가 자주 접속하는 앱을 만드는 것이 중요하다고 생각하고 푸시 알림 기능을 추가하기로 했다. AWS SNS와 SQS를 사용하게 된 이유 (기술 선택 이유) 푸시 알림 기능을 개발할 때, 가장 중요하게 생각했던 부분은 알림 서비스와 다른 서비스 간의 느슨한 결합과 비동기 처리였다. 알림 서비스는 기존에 존재하는 서비스에 부가적으로 더해지는 기능이기 때문에 알림 서비스로 인해 기존 핵심 기능의 성능이 떨어지면 안된다고 판단하여 비동기 처리가 중요하다고 생각했다. 알림 서비스가 구축됨으로.. 2024. 1. 24.
[MSA] 서킷브레이커 적용 (Resilience4j) 작년 소프트웨어 마에스트로 14기에서 개발을 할 때, 내가 가장 많이 성장했던 시기라고 생각한다. 열정적인 동료(세무무 & 동구)와 쏘마의 지원 덕분이라고 생각이 든다. 그 중 클라우드 비용이 지원되었기 때문에 AWS의 여러 리소스를 학습하며 사용해보고, 기술적으로 MSA를 적용해면서 많이 배웠다. 현재는 그 전과 다른 기술을 바탕으로 일을 하고 있어, 이대로면 예전에 공부했던 내용을 다 잊어버릴까 시간이 날 때, 이전에 개발하고 공부했던 내용들을 기록하려고 한다. 먼저 MSA 환경에서 개발하면서, CircuitBreaker가 많이 신기하고 재밌게 개발한 기억이 있어, CircuitBreaker를 적용한 예시와 개념을 정리하려고 한다! 서킷브레이커 개념 여러 서비스로 구성된 MSA 환경에서는 한 서비스에.. 2024. 1. 23.