외부 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, 메모리와 같은 자원 말이다. 따라서, “프로세스는 실행 중인 프로그램을 의미한다.”라는 문장에서, “실행 중인 프로그램”을 더 자세히 풀어 말해보자면 “실행되는데에 필요한 컴퓨터 자원을 할당받은 프로그램“과 같다. ➕ 프로세스..
변수
·
JAVA
변수?내가 기존에 알고있는 변수는, 변할 수 있는 수를 의미했다. 그런데 과연, 프로그래밍에서도 이 뜻은 동일할까? 변수!많은 문서들은, 컴퓨터 프로그래밍에서의 변수를 다음과 같이 설명하고 있다.변수란, 이름을 가지고 있는 메모리 공간이다. 우리는 변수의 이름을 통하여 해당 메모리 공간에 저장되어 있는 값에 접근할 수 있다. 다만, 값을 저장할 메모리 공간을 할당받기 위해서는 변수가 저장할 값의 크기를 알아야 할 것이다. int age = 23;따라서 변수의 선언과 할당은 위와 같은 방식으로 이루어진다. 4바이트의 메모리 공간에 23에 해당하는 이진수가 저장될 것이고, 해당 메모리 공간은 age라는 이름을 통해서 접근할 수 있게 될 것이다. 변수를 생성하는 것은 추상화의 한 사례이다. 23이라는 데이터에..