본문 바로가기

전체 글362

[MSA 1편] MSA 기본 개념 정리 목차는 MSA 에 있습니다. MSA(Microservice Architecture) 도메인을 중심으로 서비스를 모델링하고 구현하는 아키텍처 입니다. 도메인 별로 서비스, DB 등이 물리적, 논리적으로 분리돼있으며, 이렇게 분리된 도메인 서비스들은 HTTP API 또는 비동기 메시징 방식으로 통신합니다. 하나로 묶은 애플리케이션을 여러 어플리케이션 (보통 도메인) 으로 나누어서 각 서버에 배포해서 서로 간에 통신을 통해 서비스를 제공하는 방식입니다. 예를 들면, 상품도메인은 상품 로직 + 상품 DB 로 묶어서 특정 서버에 배포. 주문 도메인은 주문 로직 + 주문 DB 로 묶어서 특정 서버에 배포합니다. 이렇게 따로 배포해서 서로의 데이터가 필요할 땐 보통 API 를 통해서 접근합니다. 장점은 서버 확장성이.. 2022. 6. 11.
[Codility] CountSemiPrime 풀이 정리 (Java) source 는 Github 에 있습니다. 문제 문제 풀이 첫번째 풀이 전체적인 concept 은 P 의 최소 값을 구한 후, P~N 까지 SemiPrime 을 구해서 cache 에 저장합니다. cache[P+2] 라는 것은 P+2 까지 위치에서 SemiPrime 이 몇 개인지를 나타내는 것입니다. 예를 들면, P가 4 이고 N 이 10이면, cache[4] = 1 이고, cache[10] = 4 입니다. P, Q 를 순회하면서 cache[Q[i]] - cache[P[i]] 를 구합니다. 이 수식이 의미하는 바는 Q[i] 에서의 SemiPrime 의 개수에서 P[i] SemiPrime 수를 빼서 구하겠다는 것입니다. 주의할 것은 cache[Q[i]] - cache[P[i]] 를 구할 때, P[i] 가 S.. 2022. 6. 9.
[Codility] CountNonDivisible 풀이 정리 (Java) source 는 Github 에 있습니다. 문제 문제 풀이 첫번째 풀이 문제 풀이의 concept 을 array element 끼리 나눌 수 없는지 확인하도록 했습니다. int[] A = new int[] {3,1,2,3,6}; 라면 3/1, 3/2, ... 이런식으로 concept 을 잡았습니다. array element 끼리 나누면서 발생하는 중복 계산은 cache 로 저장해서 중복 계산을 피했습니다. 시간복잡도는 O(n제곱) 이였고, 실행해본 결과 정확도 100%, performance 0% 두번째 풀이 문제 풀이의 concept 은 다음과 같습니다. array 에서 발생하는 숫자 빈도수를 계산해서 메모리에 저장합니다. array 를 순회하면서 1부터 element 까지 약분하도록 했습니다. 이 때.. 2022. 6. 9.
[DB 4편] SQL Select 튜닝 정리 목차는 DB 목차 에 있습니다. [DB 4편] SQL Select 튜닝 정리 Select 쿼리 튜닝 Block I/O 최소화 하나의 테이블을 조회하는 것은 인덱스를 적절하게 잘 사용만 해도 큰 효과를 봅니다. 테이블 2개일 때 조인은 선행테이블 (기준 테이블) 이 몇 건을 읽어들였는지가 중요합니다. 왜냐하면 대부분의 조인은 Nested Loop (선행 테이블을 기준으로 한건씩 다른 테이블이랑 비교) 로 이루어지며, 앞의 선행테이블을 적게 읽을수록 후행테이블을 조인하는 횟수가 줄어들기 때문입니다. 선행 테이블을 읽어들인 횟수는 실행계획을 통해 알 수 있습니다. 선행테이블, 후행 테이블 모두 적절한 인덱스를 선택해야하며, 인덱스가 없을 때는 생성하는 것이 좋습니다. 단, 해당 인덱스를 생성 함으로써 미치는 .. 2022. 4. 28.
[DB 3편] 페이징 개선(querydsl, 커버링인덱스, count 쿼리) 목차는 DB 목차 에 있습니다. [DB 3편] 페이징 개선(querydsl, 커버링인덱스, count 쿼리) 커버링 인덱스 찾고자 하는 데이터가 전부 인덱스 안에 들어있는 경우 데이터 블록을 조회하지 않고 인덱스에서만 조회합니다. (=성능이 빠릅니다.) 사용 예시 order by, limit offset 사용할 때, 데이터 블록에 접근해서 데이터를 접근합니다. 커버링 인덱스를 이용해서 인덱스에만 접근해서 데이터를 가져와서 성능 개선을 할 수 있습니다. source Querydsl 의 경우 서브 쿼리를 지원하지 않기 때문에 쿼리를 두번 사용해야 합니다. public xxx testPagaConveringIndex(xxx) { List seqs = queryFactory .select(test.seq) .f.. 2022. 4. 28.
[DB 2편] 페이징 개선(NoOffset) 목차는 DB 목차 에 있습니다. [DB 2편] 페이징 개선(NoOffset) 기존 페이지 방식 기본적으로 offset 과 limit 을 기반으로 페이징 쿼리를 조회합니다. 아래 예시와 같은 페이징이 느린 이유는 offset 부분을 계산하는 부분이 들어가기 때문입니다. offset 을 구하기 위해서는 앞에서부터 읽어나가야하는데 마지막으로 갈수록 앞에 읽어야하는부분이 많기에 읽는 속도가 점점 느려집니다. select * from test where xxx order by seq offset 0 limit 10 페이지 방식 개선 (No Offset) 조회 시작부분을 인덱스로 빠르게 찾아 offset 계산을 생략하는 것입니다. 이렇게 하기 위해서는 페이지 번호가 없고, 더보기, 더 찾아보기와 같은 방식을 이용하.. 2022. 4. 28.