PostgreSQL을 이용한 주소 검색 쿼리 성능 개선
·
프로젝트/펫동네
해당 포스트에서는 PostgreSQL의 GIN 인덱스와 pg_trgm 모듈을 이용하여 주소 검색 쿼리 성능을 개선하는 과정을 담아보고자 한다. 주소 데이터는 3만건이기에 단일 쿼리 응답 속도가 개선된다고 하더라도 소소한 정도에 그칠 것이다. 하지만 검색 쿼리 속도는 빠를 수록 좋고, 인덱스를 통한 성능 개선이라는 새로운 학습을 해볼 수 있는 좋은 기회였기 때문에 성능 최적화를 진행해보았다. 기존 주소 검색 쿼리 select *from addresswhere full_address like '%서울특별시%' order by similarity(full_address, '서울특별시') DESC, id ASClimit 20; '서울특별시'를 포함하고 있는 row를 찾기 위해 풀테이블 스캔이 발생하고 있다. 이..
외부 API 비동기 호출로 성능 개선하기
·
Spring
외부 API를 비동기로 호출해볼까여행 코스 설계 API는 두 종류(구글, 오디세이)의 외부 API를 호출하고 있다. 이때 구글 API는 최대 5번, 오디세이 API는 최대 4번 호출된다. 성능 개선의 목적을 가지고, 기존 동기 방식으로 호출하고 있던 외부 API를 비동기로 호출해보았다. 속도 제한 필요병렬 호출구글 APIx→ 가능오디세이 APIo(대략 200ms)→ 불가능호출 속도 제한 이슈로 인해 오디세이 API는 기존의 동기 호출 방식을 유지했다. 동기 호출 vs 비동기 호출newCachedThreadPool 을 이용하여 구글 API를 비동기로 호출하도록 했다.var futures = IntStream.range(0, n) .mapToObj(index -> executor.su..
pinned virtual thread 확인하기
·
여러가지 모르는 지식들
기록 용도로 작성한 포스트로, 올바르지 않은 내용이 포함되어 있을 수 있습니다.  tracePinnedThreads자바는 pinned virtual thread를 모니터할 수 있는 시스템 프로퍼티인 tracePinnedThreads를 제공한다. tracePinnedThreads=full 옵션을 주면, pinned 가상 스레드를 볼 수 있다. 아래 코드를 가상 스레드로 실행시켜보자.  private synchronized void call() throws InterruptedException { Thread.sleep(100); log.info("{}", Thread.currentThread()); } 2025-03-01T00:11:24.407+09:00 INFO 75..
webFlux 의존성 추가
·
Spring/webflux
implementation 'org.springframework.boot:spring-boot-starter-webflux'를 추가하면 된다.  나의 경우 해당 의존성을 추가 해주지 않았는데도,  Mono와 Flux import가 가능했다. 다음 명령어로 어찌된 영문인지 확인해보았다../gradlew dependencies --configuration runtimeClasspath org.springframework.boot:spring-boot-starter-data-redis -> 3.3.4| +--- org.springframework.boot:spring-boot-starter:3.3.4 (*)| +--- io.lettuce:lettuce-core:6.3.2.RELEASE| | ..
REQUIRES_NEW로 인한 DB 커넥션 리소스 고갈
·
트러블슈팅
현재 getOrCreateUser(소셜 로그인) 메서드는 DB 커넥션 두 개가 필요하다.@TransactionalgetOrCreateUser ( ) { 1. id token 검증 - 공개키 생성 및 조회 2. user 조회 가입된 유저 -> 조회 결과 반환 미가입 유저 -> createUser 메서드 호출 ( REQUIRES_NEW ) 3. access token 발급} max-thread-pool = 10인 상태에서, getOrCreateUser 메서드를 실행하면 10개의 스레드가 커넥션을 하나씩 점유하게 된다. 이때 모든 요청이 미가입된 유저였다면, 모든 스레드가 REQUIRES_NEW 메서드들 실행해야한다. 이렇게 되면, 모두가 서로가 가진 DB 커넥션을 기다리지만..
testImplementation 'org.testcontainers:rabbitmq:1.20.4' 2 vulnerabilities found in dependency
·
트러블슈팅
"2 vulnerabilities found in dependency:GHSA-4g9r-vxhx-9pgx8.1Transitive Apache Commons Compress: Denial of service caused by an infinite loop for a corrupted DUMP fileGHSA-4265-ccf5-phj55.5Transitive Apache Commons Compress: OutOfMemoryError unpacking broken Pack200 file"org.testcontainers:rabbitmq:1.20.4 의존성 추가해줬더니 이와 같은 경고 메시지가 발생했습니다.  testImplementation 'org.testcontainers:rabbitmq:1.20.4' t..
call by value와 call by reference
·
여러가지 모르는 지식들
두 개념은 함수 호출 시 어떻게 인자를 전달할 것인가에 따라 나뉜다.함수 호출 시 인자의 값을 복사해서 매개변수에게 전달하면 call by value이다.인자의 참조나 주소를 매개변수에게 전달하면 call by reference이다. ➕ 인자와 매개변수함수를 정의할 때, 함수명과 반환타입, 그리고 매개변수를 작성한다.void function(int num){};이와 같이 정의된 함수는 다음과 같이 호출할 수 있다.function(10);10이라는 값을 함수의 매개변수에게 전달하고 있다. 이렇게 10이라는 값과 같이, 함수 호출 시 실제로 넘겨주는 값을 인자라고 부른다.즉, 함수를 정의할 때 선언하는 변수를 매개변수(formal parameter), 함수를 호출할 때 실제로 넘겨주는 값을 인자(actual..
프로세스와 스레드
·
운영체제
프로세스프로세스는 실행 중인 프로그램을 의미한다.  프로그램위키백과- 컴퓨터 프로그램프로그램이란, 컴퓨터에서 실행될 때 특정 작업을 수행하는 일련의 명령어들의 모음(집합)이다 따라서, 단순히 말하면 프로그램이란 명령어 모음 파일이다. 이는 텍스트로 이루어져 있을 수도 있고, 바이너리로 이루어져 있을 수도 있다. 지금은 프로그램이 소스코드 형태의 텍스트 파일이라고 생각해보자. 이렇게 텍스트 파일에 불과한 프로그램을 실행하기 위해서는 컴퓨터 자원을 할당받아야 한다.예를 들자면 cpu, 메모리와 같은 자원 말이다. 따라서, “프로세스는 실행 중인 프로그램을 의미한다.”라는 문장에서, “실행 중인 프로그램”을 더 자세히 풀어 말해보자면 “실행되는데에 필요한 컴퓨터 자원을 할당받은 프로그램“과 같다. ➕ 프로세스..