본문 바로가기

전체 글105

API 성능개선 : 페이징 cursor 방식으로 개선하기 이 글은 당근마켓을 모티브로 한 프로젝트 Secondhand 구현시 이슈 사항을 정리한 글입니다. API 기본 기능을 모두 구현하고 본격적으로 쿼리 튜닝과 성능 개선을 하기 위해 쿼리를 분석하고 개선해보도록 하겠습니다. M1 16GB 메모리 환경에서 테스트되었습니다. 200만건의 데이터를 넣어보자 Dummy data를 넣는 다양한 방식이 있습니다. 하지만 저는 item 테이블을 vertical partitioning 한 상태여서 테이블 3개에 동시에 데이터를 넣어야 했기 때문에 프로시저를 통해 랜덤한 데이터를 넣어주고자 했습니다. 더미 데이터를 넣는 가장 빠른 방법은 csv로 데이터를 만든 후 dump insert하는 것이 가장 빠르겠지만, 랜덤하게 변수를 설정하는 부분이 다른 문서 편집기를 사용하는 것.. 2023. 9. 17.
LeetCode : 133. Clone Graph 문제 링크 문제 먼저 읽기 연결된 방향이 없는 그래프에서 노드의 참조가 주어집니다. 깊은 복사를 한 그래프를 반환하세요. 어떻게 풀까? 생각 이웃을 순회하면서 재귀로 해결하는 것을 시도해보았습니다. 수도코드 class Solution { public Node cloneGraph(Node node) { ArrayList neighbors = new ArrayList(); boolean[] visit = new boolean[101]; for (int i=0; i 2023. 9. 15.
MySQL 검색 기능 개선하기 : Full-text search 이 글은 당근마켓을 모티브로 한 프로젝트 Secondhand 구현시 이슈 사항을 정리한 글입니다. mysql 8.0 InnoDB 환경에서 테스트 되었습니다. 발단 : 왜 검색 기능 개선이 필요했나? Secondhand는 동네를 검색할 수 있는 기능이 있습니다. 예를 들어 이런거요. [이미지 출처 : https://kikimong.com/7179] 먼저 데이터는 이런식으로 들어가 있습니다. 법정동 코드를 pk 로 하였습니다. 행정동 코드보다 법정동 코드를 선택한 이유는 변동이 더 적기 때문입니다. [참고링크 : 법정동과 행정동의 차이는?] 그리고 검색을 용이하게 하기 위해 일부러 비정규화하였습니다. 그래서 지역 검색을 어떻게 구현하면 좋을까요? 전개 초기 구현 방법 Where ~ like 사실 이 프로젝트.. 2023. 9. 13.
Spring Event를 사용하여 도메인간 의존성 낮추기 이 글은 당근마켓을 모티브로 한 프로젝트 Secondhand 구현시 이슈 사항을 정리한 글입니다. 상황 Secondhand에는 실시간 채팅 어플리케이션이 있습니다. 웹소켓 통신을 기반으로 하며 STOMP와 Redis pub/sub 으로 구현하였는데요. 이 채팅에 대한 요구사항 중에 다른 도메인의 서비스를 참조하는 경우가 많아져 Facade가 비대해지고 각 도메인의 서비스 로직이 복잡하게 구성이 되며 의존성이 높아지는 우려가 생겼습니다. @Component @RequiredArgsConstructor public class ChatroomFacade { private final ChatroomService chatRoomService; private final ItemService itemService; .. 2023. 9. 13.
MySQL 에서 외래키가 있으면 어떤 것들을 검증할까? 외래키 제약 조건은 관련 데이터의 일관성을 유지하는 데 사용합니다. 💡 다른 종류의 제약 조건과 마찬가지로 데이터가 일치하지 않을 경우 데이터가 삽입되거나 업데이트되는 것을 방지할 수 있습니다. …… 또는 DML 작업이 수행될 때 제약 조건으로 인해 하위 행 의 데이터가 삭제되거나, 다른 값으로 변경되거나, 외래 키를 생성할 때 지정된 옵션 에 따라 null 로 설정될 수 있습니다. 참고링크 외래키 먼저 공식 문서를 읽어보면… 외래 키는 관련 정보의 빠른 조회를 가능하게 하는 것 외에도 데이터가 삽입, 업데이트 및 삭제될 때 이러한 포인터가 무효화되는 것을 방지하여 참조 무결성을 강화하는 데 도움이 됩니다. 이 강제 메커니즘은 제약 조건 의 한 유형입니다. 연결된 외래 키 값이 다른 테이블에 없으면 다른.. 2023. 9. 12.
LeetCode : 211. Design Add and Search Words Data Structure 문제 링크 문제 먼저 읽기 새 단어를 추가하거나 추가한 단어와 일치하는 문자열을 찾을 수 있는 데이터 구조를 구현해봅시다. WordDictionary() 객체를 초기화합니다. void addWord(word) 데이터 구조에 단어를 추가하며, 나중에 일치시킬 수 있습니다. void search(word) 데이터 구조에 단어와 일치하는 문자열이 있으면 참을 반환하고 그렇지 않으면 거짓을 반환합니다. 단어는 점 '.'을 포함할 수 있으며, 여기서 점은 어떤 문자와도 일치할 수 있습니다. 어떻게 풀까? 생각 Trie 를 다시한번 구현해봅시다. 어제 풀었던 문제라 생각보다 바로 수도코드를 작성할 수 있었습니다. . 이 나오는 경우에는 모든 문자를 검색할 수 있도록 합니다. 수도코드 class WordDiction.. 2023. 9. 12.
LeetCode : 208. Implement Trie (Prefix Tree) 문제 링크 문제 먼저 읽기 Trie 를 구현하세요 Trie() trie를 초기화합니다. void insert(String word) 를 insert 합니다. boolean search(String word) word가 있으면 true, 없으면 false를 반환합니다. boolean startsWith(String prefix) 이미 존재하는 단어중에 prefix로 시작하는 단어가 있으면 true, 아니면 false를 반환합니다. Input ["Trie", "insert", "search", "search", "startsWith", "insert", "search"] [[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]] Output [null, .. 2023. 9. 11.
Spring data JPA: Hibernate가 Sequence를 못찾아요 문제상황 및 파악 처음으로 프로젝트에 Postgresql 을 사용해보고 있습니다. MySQL과 가장 체감되는 달라지는 점이 기본키 매핑 전략 중 Sequence 를 지원한다는 점입니다. 이번에 신나서 `Sequence` 전략을 사용해 봤는데, 왠걸 이렇게 에러가 납니다. 2023-09-11T14:39:29.956+09:00 ERROR 45454 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: relation "member_seq" does not exist Position: 16 2023-09-11T14:39:29.967+09:00 ERROR 45454 --- [nio-8080-exec-1] p.l.b.g.e.GlobalExce.. 2023. 9. 11.