build.gradle이나 build.gradle.kts의 dependencies를 정의하는 부분에 이런 식의 코드를 본 적 있을 것이다. dependencies { implementation("mysql:mysql-connector-java") api("org.springframework.boot:spring-boot-starter-data-jpa")} 이때 두 선언 모두 의존성 설정이 되는데, 어떤 차이가 있는지 알아보자. # 멀티모듈 의존성다음과 같은 멀티모듈 환경에서 api, core 모듈 모두 동일한 의존성이 필요하다고 해보자 api모듈의 dto에 bean validation을, core 모듈의 dto에도 bean validation을 걸고 싶은 상황이고, validation 의존..
DevFest 2023에서 Spring Weflux vs. Virtual Thread 세션을 듣고 정리한 내용과 내생각을 정리 및 공유하고자 한다. # Virtual Thread Project Loom이라는 프로젝트로, JDK 21버전 부터 공식으로 추가된 자바 전용 코루틴 느낌이다. 일반적으로 JVM의 스레드는 OS 스레드와 1:1로 매핑되어서 사용된다. OS 스레드 (커널 스레드)는 그 생성/유지 비용이 비싸 보통 풀링 (스레드 풀)을 통해 미리 만들어놓고 사용한다. 당연히 OS 자원이기 때문에 그 수는 제한이 있다. 그래서 JVM 레벨에서 이 OS 스레드를 좀 더 나뉘어서 사용하게끔 만든 스레드가 Virtual Thread이고 이는 생성 제한이 없다. 가상 스레드의 최고 장점은 기존 자바 스레드 코..
코루틴은 동시성 프로그래밍을 실현시키고자 할 때 주로 고려되는 요소이다. 자바에서는 스레드 풀을 이용해서 이를 구현하거나, RxJava 라이브러리를 활용하면 된다. 코틀린에서는 언어에서 지원하는 훨씬 쓰기 편한 코루틴을 활용할 수 있다. 보통 코틀린은 안드로이드에서 주로 사용되는 언어라 API call이나 뷰 렌더링을 코루틴으로 비동기적으로 수행하는데, 서버에서는 어떤 방식으로 활용하면 좋을지 알아보자 MySQL, Spring MVC를 사용하는 환경이라고 가정한다. # 수행 시간이 오래걸리는 조회 API 성능 개선하기 다음과 같은 유저 상세조회 API를 생각해보자. 1. 유저가 쓴 게시물 목록 디비 조회 (5초) 2. 유저가 쓴 댓글 목록 디비 조회 (5초) 3. 유저의 특정 기간동안 거래내역 목록 디비..
코루틴과 멀티스레딩 중 어떤게 더 속도 측면에서 빠를지 궁금해서 간단한 클래스와 이를 테스트 했던 것들을 공유하고자 한다. # 가상 요구사항 우선 여러개의 파일들을 비동기적으로 어딘가 보내야하는 상황을 가상 시나리오로 생각해보자. 이때, 다음과 같은 요구사항을 충족해야한다. 속도가 너무 느리면 안 된다. 여러개의 파일들을 보내다가 중간에 전송을 실패하더라도 전체 파일전송에는 영향을 미치지 않아야한다. 중간에 파일 전송에 실패하면 재전송 시도를 한다. 해당 요구사항을 충족하기 위해 코루틴을 활용한 구현체와, 스레드풀을 활용한 구현체 두 가지를 만들고 성능 테스트를 진행할 것이다. # 테스트 클래스 AsyncFileSender (Interface) interface AsyncFileSender { fun s..
코틀린에서는 함수에서 여러개의 가변인자를 받기 위해서는 vararg 키워드를 사용하면된다. vararg로 받은 인자는 마치 배열처럼 이터레이션이 가능하다. 만약 vararg로 받은 인자를 고대로 다른 함수로 똑같이 전달해야하는 경우가 있다고 해보자. 당연하게 이런식으로 작성할테지만, 오류가 나는 코드다. fun showAll(vararg strings: String) { showAll2(strings) } fun showAll2(vararg strings: String) { strings.forEach { println(it) } } 해결방법은 두 가지다. fun showAll(vararg strings: String) { showAll2(*strings) // 에스터리스크 추가 } fun showAll..
프로젝트를 진행하다 보면 Java 버전을 변경해야 하는 경우가 종종 생긴다. 우선 많이 사용하는 8(1.8과 동일), 11, 17 버전을 왔다 갔다 하는 방법에 대해 설명한다. # 버전별 다운로드 오라클 공식 홈페이지에서 다운 받을 수 있는데, 로그인을 해야 한다. Java 8(1.8) https://www.oracle.com/java/technologies/downloads/#java8-windows Download the Latest Java LTS Free Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts. www.oracle.com Java 1..
알고리즘을 풀다 보면 간혹 조합을 직접 만들어서 사용해야 할 때가 있었는데 그럴 때마다 새로 만들기 귀찮아서 범용 객체를 이번 기회에 만들어봤다. 제네릭을 사용해서 문자열, 숫자(Integer, Double)등 모두 포괄할 수 있도록 설계했다. 조합은 getCombination, 중복조합은 getRepeatableCombination 을 호출하면 되고 파라미터 arr은 후보군들을 제네릭 리스트로, r은 그중 몇 개를 뽑을지를 전달한다. 결괏값으로는 후보군 중 r개를 뽑아서 만들어진 리스트들을 리스트로 (2중 리스트)로 리턴한다. public class Combination { public static List getCombination(List arr, int r) { boolean[] visited =..
Java에는 이상하게도 순열 라이브러리가 없다. 그래서 순열이 필요할 경우 직접만들어서 사용해야한다. static List permResult = new ArrayList(); static int[] output; static int n, r; static boolean[] visited; public static void perm(int cnt) { if (cnt == r) { permResult.add(output.clone()); // 깊은 복사로 새롭게 넣어줘야함 return; } for (int i = 0; i < n; i++) { if (visited[i]) continue; output[cnt] = i; visited[i] = true; perm(cnt + 1); visited[i] = fa..