관련 프로젝트 Github GitHub - maru-KK/sparta-logistics: MSA 물류 유통・관리 서버MSA 물류 유통・관리 서버. Contribute to maru-KK/sparta-logistics development by creating an account on GitHub.github.com 개요OrderService와 DeliveryService 간의 통신을 Event 기반으로 전환하여 기존 동기 호출에서 발생하는 물리적 의존성을 제거하려고 한다. 현재 주문 생성은 사용자가 호출하는 API로, 응답 시간이 길어질 경우 사용자 편의성이 저하된다. 하지만 DeliveryService는 주문 생성 과정에서 동기 방식으로 호출되며, 여러 서비스와 추가로 동기 통신을 수행해 배송 데이터..
최신 글
문제RedisTemplate를 통해 데이터를 저장하기에는 성공했으나, 읽어오는 과정에서 역직렬화에 실패했다.Redis에 저장할dto에 존재하지 않는 필드가 함께 저장되어 역직렬화에 실패한 것인데 이유를 알아보자. Redis에 String 타입의 Json 데이터를 저장했고 직/역직렬화에는 Jackson 2.18.1 라이브러리를 사용했다. Redis에 StringType으로 저정할 Dto는 아래와 같다.@Getter@NoArgsConstructor@AllArgsConstructorpublic class ProductCache implements Serializable { @Serial private static final long serialVersionUID = 1L; private st..
API 명세서 API 명세서 | Notion기본 예외 응답 구조teamsparta.notion.site세부 내용은 위 노션페이지에서 확인바랍니다. 테이블 명세서 테이블 명세서 | Notion1. 사용자 테이블 (p_users)teamsparta.notion.site세부 내용은 위 노션페이지에서 확인바랍니다. 모든 테이블 공용 컬럼created_atTIMSTAMP생성 시각created_byvarchar(255)생성 유저 식별자updated_atTIMSTAMP수정 시각updated_byvarchar(255)수정 유저 식별자deleted_atTIMSTAMP삭제 시각deleted_byvarchar(255)삭제 유저 식별자 사용자 테이블 (p_users)user_idvarchar(255)사용자 ID, PK..
졸업 후 약 1년 반동안 백엔드 개발자로의 길을 끊임 없이 달려오다 본의 아니게 약 8주의 휴식 기간을 가졌다.취업 경쟁에서 잠시 벗어나고자 한 회피성 휴식 기간이었고, 이제 반성하며 다시 마음을 다잡으려 한다. 취업 준비를 마쳤다고 생각한 이후, 처음으로 네이버에 지원했고 아쉽게도 면접에서 탈락했다. 이후 10여곳의 기업 공채에 지원했고, 모두 불합격한 뒤 자신감이 떨어졌다. 성격상 어떤 일을 앞두고 완벽한 준비를 하기에 결과가 따라주지 않는다면 다소 큰 타격이 있는 건 당연했다. 8주라는 시간을 제대로 쉰 것도 아니다. 머리는 쉬어야 한다고 생각하지만, 마음은 취업 문제에 묶여있었다. 이도저도 아닌 허송세월을 보낸 것이 자신에게 미안하다. 브라우저 북마크에 있는 내 블로그와 깃허브 클릭을 하루에도 몇..
개요500만개의 레코드에서 키워드 기반 문자열 검색을 수행했을 때, 속도가 저하되는 문제를 MySQL의 Full-Text Search를 통해 해결해보려 한다. 개선 결과 기존 API 처리 시간 1185ms → 564ms로 약 52% 성능 개선이 이뤄졌다. 기존 쿼리의 문제점아래는 기존에 사용하던 쿼리이다. 키워드를 기반으로 post 테이블을 검색한다.explain select *from post pjoin category c on c.category_id = p.category_category_idwhere p.title like '%**:keyword**%' and p.region_region_id in (**:region_ids**) and p.status not in ('HIDE', ..
이슈 내용개발자가 제어할 수 없는 요소에 대한 테스트 용이성과 직접적으로 의존하면 안 되는 모듈의 클래스를 의존하고 있진 않은지 테스트하기 위해 인터페이스를 두고 테스트 더블을 직접 구현할 수 있도록 설계했다. 코드의 크기가 작을 때는 아무런 문제가 되지 않았지만, 기능과 의존성이 추가될 때마다 직접 구현할 테스트 더블이 증가했고 이는 생산성 저하와 더불어 테스트 전체의 크기가 커지는 영향을 미쳤다. 해당 문제가 발생한 이유와 해결방법에 대해 정리해보려 한다. 테스트 더블을 직접 구현한 이유Mockito 라이브러리를 사용하면 쉽게 테스트 더블을 생성할 수 있다. 하지만 이전 프로젝트에서 적용해본 결과 비즈니스 로직에서 bootstrap, framework 모듈의 클래스를 직접 의존하진 않는지 파악할 수..
https://github.com/f-lab-edu/used-trading-market GitHub - f-lab-edu/used-trading-market: [당근마켓 모티브] 개인 간 거래 플랫폼 API 서버[당근마켓 모티브] 개인 간 거래 플랫폼 API 서버. Contribute to f-lab-edu/used-trading-market development by creating an account on GitHub.github.com중고 거래 API 서버에 Kafka를 적용하고 이벤트를 통해 비동기적으로 로직을 처리하려고 한다. 아래의 사진은 프로젝트 RDB의 일부이다. Member 테이블은 Post, Region 테이블을 참조하고 있다. Post는 Member를 통해 작성자의 Region을 간접..
개요네트워크 시스템에서 처리율 제한 장치(rate limiter)는 클라이언트 또는 서비스가 보내는 트래픽의 처리율을 제어하기 위한 장치이다. 예를 들어 HTTP 통신을 수행하는 클라이언트와 서버가 존재한다고 가정해보자. 서버는 특정 기간 내에 전송되는 클라이언트의 요청 횟수를 제한하고 싶을 수 있을 것이다. API 요청 횟수가 제한 장치에 선언된 임계치를 넘어서면 해당 클라이언트의 다음 요청은 block 되며 버려지거나, 추후 처리를 위해 큐에 보관된다. 요청이 block된 경우 HTTP status code 429 - Too many requests 를 응답한다. 또한 아래의 HTTP 헤더 값을 사용하여 클라이언트에게 적절한 정보를 응답할 수 있다.X-Ratelimit-Remaining: 윈도 내 남..
⌜오브젝트⌟가 쓰여진 이유프로그래밍 패러다임은 개발자 공동체가 동일한 프로그래밍 스타일과 모델을 공유할 수 있게 함으로써 불필요한 부분에 대한 의견 충돌을 방지한다. 또한 프로그래밍 패러다임을 교육시킴으로써 동일한 규칙과 방법을 공유하는 개발자로 성장할 수 있도록 준비시킬 수 있다. 이 책은 객체지향 패러다임에 대한 책이다. 이 책의 목적은 객체지향 패러다임이 제시하는 프로그래밍 패러다임을 설명하는 것이다. 객체지향 패러다임이라는 용어를 사용할 때, 어느정도 유사한 그림을 머릿속에 그릴 수 있는 기반을 제공할 것이며, 객체지향에 대한 오해를 제거하고, 객체지향 프로그래밍을 하는 개발자들이 동일한 규칙과 표준에 따라 프로그램을 작성할 수 있게 할 것이다. 도서를 학습하며하루에 약 6~8시간 꼬박 일주..
⌜오브젝트⌟라는 도서를 읽기 전에 내가 자바를 공부하고 지금까지 약 1년 5개월, 자바 기본 서적 2권, ⌜객체지향의 사실과 오해⌟, ⌜스프링 입문을 위한 자바 객체지향의 원리와 이해⌟, ⌜클린 아키텍처⌟, ⌜마이크로서비스 패턴⌟ 및 다수의 도서들과 여러 자바 및 스프링 강의을 듣고, 설계해본 경험을 바탕으로 객체지향에 대해 간단하게 나의 생각을 정리해보려 한다. 객체 지향은 뭘까? 객체를 통한 프로그래밍을 지향한다는 의미이다. 객체란 뭘까? 상태와 행위를 가지고 자신의 상태를 자신이 관리하며, 행위를 통해 의사소통하는 데이터의 집합이다. 상태란 뭘까? 자신이 관리하는 데이터이다. 행위란 뭘까? 자신의 상태를 변경하거나, 외부에게 건네 줄 데이터를 메서드를 통해 제공하는 것이다. 왜 객체를 지향해야 하는..
일단 데이터베이스의 성능 튜닝의 관건은 어떻게 디스크 I/O를 줄일 것이냐 일 때가 상당히 많다. CPU나 메모리는 대부분 전자식 장치지만 하드 디스크 드라이브는 기계식 장치이다. 그래서 데이터베이스 서버에서는 항상 디스크 장치가 병목이 된다. 물론 플래시 메모리를 장착하여 디스크의 성능을 높인 SSD를 장착한다면 병목은 하드 디스크 보다는 줄어들겠지만, 디스크의 헤더를 움직이지 않은 순차 데이터 처리의 경우에는 두 디스크가 큰 성능 차이를 보이진 않는다. 인덱스란?인덱스는 디스크 혹은 메모리에 저장되어 있는 레코드에 빠르게 접근하기 위해 "정렬된" 데이터들이다. 인덱스는 정렬되어 있어야 한다 라는 중요한 특성을 가진다. 인덱스가 정렬되어 있지 않다면 인덱스의 데이터가 늘어남에 따라 탐색속도는 점점 저하..
단일 모델의 단점 주문 내역 조회 기능을 구현한다고 가정한다. 주문 내역은 여러 애그리거트의 정보를 가져와야 한다. Order에서 주문 정보, Product에서 상품 정보, Member에서 회원 정보, Payment에서 결제 정보 등 여러 애그리거트의 정보를 한 데 모아 응답해줘야 한다. 이렇게 조회를 위해 여러 애그리거트의 데이터가 필요한 경우 구현 방법을 고려해봐야 한다. 애그리거트를 사용하는 경우 각 애그리거트는 애그리거트ID 라는 식별자를 통해 참조하기에 Eager Loading 전략을 사용할 수 없다. 이는 한번의 SELECT를 통해 조회에 필요한 모든 데이터를 불러올 수 없다는 의미이므로, 무의미한 I/O를 발생시켜 성능 오버헤드가 발생할 수 있다. 그렇다고 애그리거트간 참조를 객체 레퍼런스를..
여러 서비스에서의 Message기반 비동기 호출 아키텍처를 구성할 때, Message Driven Architecture, Event Driven Architecture의 선택지가 존재한다. 여기서 Message와 Event의 차이를 정리해보려 한다. 메시징 메시징은 서비스가 메시지를 서로 비동기적(메시지 브로커를 사용하는 경우와 통상적인 경우)으로 주고받는 통신 방식이다. 보통 메시징 기반 애플리케이션은 서비스 사이에 Message Brocker(대표적으로 Kafka, RebbitMQ)를 두어 비동기 통신을 구현하지만, 서비스가 직접 서로 통신하는 BrockerLess 아키텍처도 존재한다. BrockerLess 아키텍처는 통신할 애플리케이션이 가용중이 아니라면 내부적으로 큐를 두는 방식 등을 통해 메시..
문제 JAVA 17, Spring Boot 3.2 멀티 모듈 구조에서 각 모듈간의 의존성을 제대로 선언해놓고 실행했음에도 모듈에서 다른 모듈의 소스 정보를 못 읽어오는 이슈가 발생했다. 해당 문제를 해결하기 위해 애플리케이션 실행 지점에 다른 모듈의 객체를 생성하는 간단한 코드를 넣어 확인해보았다. 소스코드와 IDE 상에는 분명히 domain 모듈의 Product 클래스가 import 되어 있는데, 컴파일러가 Product 클래스를 import 하는 시점에 오류가 발생한다. 해당 프로젝트는 내가 예전에 작성하고 테스트까지 끝마쳤던 소스코드를 그대로 가져와서 동일한 환경으로 재구성 한 것이라 완벽하게 동일한 소스코드와 의존성을 가지고 있다. 이전의 프로젝트는 오류없이 정상적으로 실행되니 참 답답한 상황이 ..
🥕 이번 당근 클론 프로젝트에서는 기존에 자주 사용하던 MVC 구조가 아닌 헥사고날 아키텍처를 적용해보려 한다. 따라서 먼저 배경 지식을 습득후 간단한 예제 코드를 통해 헥사고날 아키텍처에 대해 익숙해지려 한다. 이전 포스팅과 이어집니다. MVC 구조에서 헥사고날 아키텍처로 🥕 이번 당근 클론 프로젝트에서는 기존에 자주 사용하던 MVC 구조가 아닌 헥사고날 아키텍처를 적용해보려 한다. 따라서 먼저 배경 지식을 습득후 간단한 예제 코드를 통해 헥사고날 아키텍처 hyunsb.tistory.com 이번에는 이전 포스팅에서 설명한 MVC 구조에서 싱글 모듈 헥사고날 아키텍처를 적용한 API 서버를 멀티 모듈로 마이그레이션 해보려 한다. 싱글 모듈의 한계점은 명확하게 존재한다. 모든 로직이 하나의 dependen..