Java 56

CompletableFuture + Spring @Async

Spring에서 비동기 처리를 가장 실무적으로 사용하는 방법Spring에서 비동기 처리를 가장 간단하게 도입하는 방법은@Async + CompletableFuture 조합이다. 1. @Async란 무엇인가@Async는 Spring이 제공하는 비동기 실행 애너테이션이다.메서드를 별도 스레드에서 실행하도록 만들어준다.@Asyncpublic CompletableFuture asyncMethod() { return CompletableFuture.completedFuture("result");} 2. 기본 동작 구조@Async가 붙은 메서드는Spring이 내부적으로 TaskExecutor(ThreadPool) 에 작업을 위임호출자는 즉시 반환결과는 CompletableFuture로 받는다Spring이 스..

IT/Spring 2026.01.02

CompletableFuture vs WebFlux

Java 비동기 처리, 무엇을 선택해야 하지?Java에서 비동기 처리를 고민하다 보면 마주치는 두 가지 선택지가 있다.바로 CompletableFuture와 Spring WebFlux이다.두 기술 모두 “비동기 처리”를 지원하지만, 문제 해결 방식과 철학은 다르다. 1. CompletableFuture란 무엇인가CompletableFuture는 미래에 완료될 결과를 표현하는 비동기 추상화이다.기존의 동기 코드 스타일을 최대한 유지하면서, 비동기 처리를 “추가”하는 방식이다.기존 Servlet / MVC 구조 그대로 사용 가능Thread 기반 비동기 처리명시적인 스레드 풀(ExecutorService) 사용imperative(명령형) 코드 스타일 유지현재 구조를 유지하면서 비동기를 도입하고 싶을 때 적합하..

IT/JAVA 2026.01.02

CompletableFuture 비동기 처리

Java에서 비동기 처리를 구현하는 방식은 여러 가지가 있지만,Java 8 이후 가장 널리 사용되는 방식은 CompletableFuture이다. 과거에는 Future + ExecutorService 조합으로 비동기 처리를 구현했지만,이 방식은 결과 조합, 예외 처리, 체이닝이 불편했다.CompletableFuture는 이러한 한계를 해결하기 위해 등장했다. 1. 비동기 처리?비동기 처리는 작업을 요청한 후, 결과를 기다리지 않고 다음 코드를 실행하는 방식이다.즉, 흐름을 멈추지 않는다.동기 처리: 작업 요청 → 결과 대기 → 다음 코드 실행비동기 처리: 작업 요청 → 다음 코드 실행 → 결과는 나중에 처리네트워크 호출, DB 조회, 파일 I/O 같은 작업은 대기 시간이 길기 때문에비동기로 처리하지 않으..

IT/JAVA 2026.01.02

Java 멀티스레드와 병렬 실행

Java에서 고성능 애플리케이션을 개발하려면 멀티스레드(Multi-thread) 개념을 이해해야 한다.스레드를 직접 생성하고 관리하는 일은 복잡하고 비용이 크기 때문에,ExecutorService, ThreadPool, CountDownLatch 등 다양한 API를 함께 사용한다. 1. 멀티스레드스레드(Thread)는 프로그램의 실행 흐름 단위이다.멀티스레드란 이 실행 흐름을 여러 개 만들어 여러 작업을 동시에 실행하는 구조를 의미한다.예:웹 서버: 사용자 요청마다 새로운 스레드 처리게임 서버: 몬스터 AI 스레드 + 네트워크 IO 스레드병렬 계산: 여러 CPU 코어에서 계산 작업을 나눠 처리단순 Thread 생성 방식Thread thread = new Thread(() -> { System.out..

IT/JAVA 2025.12.07

getOrDefault() vs computeIfAbsent()

Java 컬렉션을 사용하다 보면 한 번쯤 마주치는 두 메서드가 있다.getOrDefault(key, defaultValue)computeIfAbsent(key, mappingFunction)둘 다 “key가 없을 때 기본 값을 어떻게 처리할 것인가”라는 공통 목적을 가진 것처럼 보이지만,작동 방식도 완전히 다르고, 쓰이는 상황도 전혀 다르다. 1. getOrDefault() — “단순 조회 + 기본 반환” 역할V value = map.getOrDefault(key, defaultValue);✔ 동작 방식key가 존재하면 해당 value를 그대로 반환한다.key가 존재하지 않으면 defaultValue를 반환만 한다.Map 자체에는 아무 것도 추가되지 않는다.✔ 특징Map 수정 없음읽기(Read) 연산d..

IT/JAVA 2025.12.06

ReentrantLock 락 제어

Java에서 멀티스레드 환경을 다루다 보면, 가장 먼저 떠올리는 동기화 방식은 synchronized이다.하지만 실무에서는 synchronized만으로 해결할 수 없는 더 세밀한 락 제어가 필요한 경우가 많고,이때 선택하게 되는 도구가 바로 ReentrantLock이다. 단순한 전역 락이 아니라 자원별 락이 필요하다.이때 사용할 수 있는 패턴 중 하나가 ConcurrentMap + ReentrantLock 기반의 동적 락 관리 기법이다. 1. ReentrantLock이란ReentrantLock은 Java의 java.util.concurrent.locks 패키지에서 제공하는 명시적 락(Explicit Lock)이다.synchronized가 자동으로 락을 걸고 해제하는 구조라면, ReentrantLock은 ..

IT/JAVA 2025.12.06

Java 예외: RuntimeException

RuntimeExceptionJava에서는 프로그램 실행 중 나타나는 오류(exception or error)를 처리하기 위해 예외(Exception) 클래스를 제공한다.그중 RuntimeException은 “런타임 예외(Runtime Exception)”로 불리며,보통 예측 불가능한 프로그래밍 오류를 나타낼 때 사용된다. RuntimeException을 직접 사용하거나, 그 하위 클래스를 사용하는 것 => 이게 바로 흔히 말하는 “Unchecked Exception”이다. 반대로 RuntimeException을 상속하지 않는 예외들은 Checked Exception으로 분류된다. Checked Exception vs Unchecked Exception 차이 검사 시점컴파일 시점 — 예외 처리를 강제..

IT/JAVA 2025.12.06

ConcurrentHashMap – 멀티스레드 환경에서 안전하게 Map 사용하기

Java에서 HashMap은 단일 스레드에서는 빠르게 작동하지만, 멀티스레드 환경에서는 안전하지 않다.여러 스레드가 동시에 put()이나 get()을 호출하면 데이터 손상, ConcurrentModificationException, 무한 루프 같은 심각한 문제가 발생할 수 있다. HashMap의 멀티스레드 한계Map map = new HashMap();스레드 간 동기화가 없기 때문에 동시 접근 시 데이터 충돌 가능성이 있다최악의 경우 Iterator 사용 중 ConcurrentModificationException이나 무한 루프도 일어난다. ConcurrentHashMap – 안전하고 빠른 멀티스레드 Map스레드 안전(Thread-safe): 여러 스레드가 동시에 접근해도 안전높은 병렬성: 내부적으로 버..

IT/JAVA 2025.07.24

[프로그래머스 64065] [Java] 튜플

1. 문자열 파싱: {{2},{2,1},{2,1,3},{2,1,3,4}} → [[2], [2,1], [2,1,3], [2,1,3,4]] 형태로 바꾸기2. 튜플 길이 순 정렬: 가장 짧은 배열부터 순서대로 3. LinkedHHashSet을 이용해 이미 포함된 원소는 제외하면서 추출📝 Solutionimport java.util.ArrayList;import java.util.Arrays;import java.util.Comparator;import java.util.LinkedHashSet;import java.util.List;import java.util.Set;public class 카카오_튜플 { public int[] solution(String s) { /* {{}} 제거, ..

Java String 클래스

String 클래스의 메서드들을 계속 잊어버려 복습겸 다시 정리해보았다. 🔖String 클래스- Java에서 문자열을 다룰 때 가장 기본이 되는 클래스- String 클래스는 문자열 데이터를 다루기 위한 불변(Immutable) 객체이다 - 한 번 생성된 문자열은 변경할 수 없으며, 문자열을 수정하는 것처럼 보이는 작업은 모두 새로운 문자열 객체를 생성하는 방식으로 처리된다 👉🏼 실제로는 새로운 문자열 객체가 생성된다 String str = "hello";str = str + " world"; 불변성 (Immutable)문자열을 수정할 수 없으며, 수정 시 새로운 객체가 생성된다객체 생성 방식문자열 리터럴로 생성하거나, new String()으로 생성할 수 있다 문자열 상수 풀 (String Po..

IT/JAVA 2025.04.15

JMH (JMH 라이브러리를 활용한 Java 코드 성능테스트)

JMH 란?- Java Microbenchmark Harness- Java 공식 성능 측정 도구- OpenJDK 팀에서 만든 라이브러리로, 마이크로 벤치마크를 정밀하게 측정할 수 있게 도와준다.특징- JIT(Just-In-Time) 최적화 고려- 워밍업 시간, 반복 횟수 조정 가능- 평균/최댓값/표준편차 등 정밀 통계 제공- GC와 캐시 등 JVM 영향 최소화 ( 실행 환경 )Gradle 8.10.2Java 17VS CodeWindows 11 ✅ Gradle 프로젝트 생성 더보기VS Code 에서  단축키  Ctrl+Shift+PCreate Java Project 선택 Gradle 선택 Groovy 선택프로젝트명 입력   ✅ build.gradle 설정/* * This file was generated ..

IT/JAVA 2025.04.11

ArrayList vs LinkedList

|  컬렉션 프레임워크- 자바에서 데이터를 구조적으로 저장하고 관리학 위한 인터페이스 + 클래스 모음- 인터페이스로 기능을 정의하고  =>  클래스에서 구체적으로 구현한다  |  핵심 인터페이스 구조Map은 Collection을 상속하지 않는다 ※|  주요 인터페이스 + 대표 구현 클래스 ✅ List (순서 O, 중복 O)구현체특징ArrayList배열 기반, 인덱스 접근 빠름LinkedList노드 기반, 삽입/삭제 빠름VectorArrayList와 유사하지만 동기화됨StackVector 상속, LIFO 구조 ✅ Set (순서 X, 중복 X)구현체특징HashSet순서 없음, 빠름LinkedHashSet입력 순서 유지TreeSet자동 정렬 (Comparable or Comparator) ✅ Queue / D..

IT/JAVA 2025.04.08

코드 실행시간 비교

프로그래머스 문제를 풀다가 코드 실행 시간을 비교해 보고 싶었다.  📝  Java에서 성능 측정을 위한 헬퍼 클래스작업을 여러 번 실행하여 평균 실행 시간을 측정하고 결과를 출력제네릭을 사용하여 다양한 타입의 작업을 처리 package Java.helpers;public class BenchmarkHelper { /** * 작업을 여러 번 실행하여 평균 실행 시간 측정하고 결과를 출력한다. * @param name : 벤치마크 테스트 이름 * @param iteration : 작업 반복 횟수 * @param task : 벤치마크 테스트에서 실행할 작업 */ public static void runBenchmark (String name, int it..

IT/JAVA 2025.03.26

HashSet

HashSet 은 Set 인터페이스에서 지원하는 구현 클래스이다. => Set의 특징을 그대로 상속받는다. ✏️ Set- Java에서 중복을 허용하지 않는 컬렉션을 나타내는 인터페이스 - Key의 중복을 허용하지 않는다- Key로 null을 허용하지 않는다. - 중복을 자동으로 제거해준다.- 비선형 구조로 순서 없이 Key로만 데이터를 저장한다. => 인덱스X- 요소의 저장 순서를 유지해야 한다면 JDK1.4부터 제공하는 LinkedHashSet 클래스를 사용하면 된다.- 성능이 빠르고 검색 속도가 우수하다- 추가나 삭제시 Set 내부에 있는지 검색한 뒤 해야하므로 List구조에 비해 속도가 느리다  주요 구현 클래스HashSet :  가장 많이 사용되는 Set 구현체 (빠른 검색 속도, 순서X) Tre..

IT/JAVA 2025.03.20

[프로그래머스 12914] [Java] 멀리뛰기

짝수 홀수일는 나누고, 이진법 관련해서 푸는 문제인 줄 알았는데동적 계획법을 이용하는 문제였다...생각도 못했다.... 이전에 풀었던 피보나치 수 문제와 같은 것이었다... 2025.03.11 - [IT/JAVA] - [프로그래머스 12945] [Java] 피보나치 수>> 동적 프로그래밍 이용 ✏️ DP (Dynamic Programming) 동적 계획법- 복잡한 문제를 더 작은 하위 문" data-og-host="iamsh.tistory.com" data-og-source-url="https://iamsh.tistory.com/401" data-og-url="https://iamsh.tistory.com/401" data-og-image="https://scrap.kakaocdn.net/dn/k0PHP..

HashMap

HashMap- 자바의 컬렉션 프레임워크 중 하나로, 키와 값의 쌍으로 데이터를 저장하는 자료구조- 해시 테이블을 기반으로 하며, 키를 해시 함수로 해시 코드로 변환하여 값을 저장하고 검색한다- 키와 값의 쌍을 저장하며, 키는 중복될 수 없고, 값은 중복될 수 있다- 동일한 키로 값을 저장하면 기존 값이 덮어쓰여진다- 빠른 검색: 평균적으로 O(1)의 시간 복잡도로 데이터를 검색할 수 있다- 키(Key)값을 통해서만 검색 가능  주요 메서드put(K key, V value)키와 값을 HashMap에 저장한다get(Object key)키에 해당하는 값을 반환한다. 키가 존재하지 않으면 null을 반환한다.remove(Object key)키에 해당하는 키-값 쌍을 제거한다containsKey(Object k..

[프로그래머스 138476] [Java] 귤 고르기

1. 같은 종류의 원소 갯수 구하기   =>  HashMap 이용2. 1번을 내림차순 정렬3. 갯수가 많은 것부터 k개 고르기✏️ Solution 1 import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;public class 귤고르기 { public static int solution(int k, int[] tangerine) { int sum = 0; // 고를 귤의 개수 int cnt = 0; // 최솟값 카운트 HashMap map = new HashMap(); for(int num : tangerine) { map.put(n..

[프로그래머스 12945] [Java] 피보나치 수

public class 피보나치수 { public static int solution(int n) { int[] f = new int[n+1]; f[0] = 0; f[1] = 1; for (int i=2; i >>> 동적 프로그래밍 이용 ✏️ DP (Dynamic Programming) 동적 계획법- 복잡한 문제를 더 작은 하위 문제로 나누어 해결하는 알고리즘 설계 기법- 하위 문제의 결과를 저장하여 중복 계산을 피하고, 전체 문제를 효율적으로 해결한다.  DP와 재귀적 호출의 차이점 하향식(Top-down) 접근, 상향식(Bottom-up) 접근- 재귀적 호출은 주로 하향식 접근 방식을 사용한다.- 큰 문제를 작은 하위 문제로 나누어 해결하는 방식..

반응형