IT/JAVA 35

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

Java 함수형 인터페이스 Supplier, Runnable

Java 8 이후 큰 변화 중 하나가 함수형 인터페이스(Functional Interface) 기반의 람다 표현식 도입이다.그중에서도 실무에서 자주 등장하는 인터페이스가 Supplier 와 Runnable이다. 1. 함수형 인터페이스함수형 인터페이스는 추상 메서드를 단 하나만 갖는 인터페이스이다.예:RunnableSupplierConsumerFunctionPredicate모두 람다식으로 표현할 수 있다. 2. Supplier — “값을 만들어서 공급하는 인터페이스”@FunctionalInterfacepublic interface Supplier { T get();}✔ 주요 특징입력 인자가 없다.무언가를 생성하거나 반환하는 역할을 한다.표현식 형태: () -> T“값을 필요할 때 지연 생성(lazy..

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

동기화 vs 원자적 연산

멀티스레드 환경에서 데이터 일관성과 충돌 방지는 반드시 고려해야 할 중요한 주제이다.동기화(synchronization)와 원자적 연산(atomic operation)은 모두 이를 다루는 방법이지만, 그 목적과 동작 방식이 다르다. 동기화 (Synchronization)공유 자원(변수, 객체, 컬렉션 등)에 여러 스레드가 동시 접근할 때 충돌을 막기 위한 보장 수단Java에서는 synchronized 키워드 또는 Lock 인터페이스를 통해 구현✅ 예시class Counter { private int count = 0; public synchronized void increment() { count++; }}이 코드에서는 increment() 메서드 전체가 임계 구역(critical sectio..

IT/JAVA 2025.07.24

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

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

IT/JAVA 2025.07.24

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

Pattern, Matcher Class

Java에는 정규식을 활용해 문자열을 검증, 탐색을 돕는 Pattern, Matcher 클래스가 있다Java API  java.util.regex 패키지에 포함되어 있다.  Pattern 클래스  (java.util.regex.Pattern)- 정규 표현식을 정의하는 클래스- 정규 표현식을 컴파일하여 Pattern 객체를 생성한다 📝 matches() 메서드  :  검증 후 대상문자열이 정규표현식과 일치하면 true, 그렇지 않다면 false값을 리턴import java.util.regex.Pattern;public class RegexExample { public static void main(String[] args) { String pattern = "^[0-9]*$"..

IT/JAVA 2025.02.25

StringBuilder

String 객체끼리 더하는 방법은 메모리 할당과 해제를 발생시키는데 덧셈 연산 많아진다면 성능적으로 좋지 않다많은 문자열을 연결하면 중간 문자열 객체가 생성되어 비효율적인 코드가 생성된다 Java에서 String  객체는 변경이 불가능하다. (불변 객체 (immutable) )한 번 생성되면 내용을 바꿀 수 없다.따라서 하나의 문자열을 다른 문자열과 연결하면 새 문자열이 생성되고, 이전 문자열은 가비지 컬렉터로 들어간다. (JVM의 GC가 처리)StringBuilder 는 변경 가능한 문자열을 만들어 주기 때문에, String 을 합치는 작업 시 하나의 대안이 될 수 있다. StringBuilder        ( java.lang.StringBuilder )mutable한 성질.  값이 변할 수 있다..

IT/JAVA 2025.01.19

IntStream

IntStreamJava8의 Stream API에서 기본 타입 int를 처리하기 위해 제공되는 Stream 클래스박싱(Integer)없이 숫자 데이터를 효율적으로 처리할 수 있다int에 대한 순차 및 병렬 집계 연산 수행하는데 사용반복문 없이도 배열이나 컬렉션의 데이터를 처리할 수 있다불필요한 박싱/언박싱 작업을 줄여 성능을 향상시킨다숫자와 관련된 연산을 쉽게 처리할 수 있다import java.util.stream.IntStream;생성방법IntStream.of(values): 개별 값을 사용하여 스트림 생성.Arrays.stream(int[]): 배열을 기반으로 스트림 생성.IntStream.range(start, end): 시작값부터 끝값 전까지 연속된 숫자 생성.IntStream.rangeClos..

IT/JAVA 2025.01.04

Stream

Stream스트림(Stream)은 Java 8에서 도입된 기능으로, 컬렉션(예: 리스트, 배열) 등의 데이터 소스를 처리하고 변환하는 데 사용된다.스트림은 데이터의 흐름을 추상화한 것으로, 데이터를 필터링, 매핑, 축소 등의 작업을 통해 처리할 수 있다.불변 데이터 흐름 : 데이터 소스를 변경하지 않고 처리한다.선언적: 스트림 API는 선언적 스타일을 사용하여 데이터 처리 작업을 표현한다. 이는 코드의 가독성을 높이고 유지보수를 쉽게 한다.더보기더보기명령형 스타일 명령형 스타일은 데이터 처리 작업을 수행하는 방법을 단계별로 명시적으로 작성하는 방식이다. 이는 반복문과 조건문을 사용하여 데이터를 처리하는 전통적인 방식이다.  int[] numbers = {1, 2, 3, 4, 5}; int sum = 0;..

IT/JAVA 2025.01.03

Java 란

- 객체 지향 프로그래밍 언어로, "한 번 작성하면, 어디서나 실행된다 (Write Once, Run Anywhere)"라는 특징을 가지고 있다.- 자바로 작성된 프로그램이 JVM을 통해 운영체제와 관계없이 동일한 자바 어플리케이션을 실행할 수 있어 다양한 환경에서 일관된 동작을 보장한다.- 객체 지향 언어로, 코드의 재사용성, 유지보수성, 확장성을 높이기 위해 클래스와 객체, 상속, 다형성, 캡슐화와 같은 원칙을 따른다. 이러한 객체 지향 특성 덕분에 복잡한 시스템을 모듈화하고 관리하기 용이하다.- 강력한 메모리 관리와 가비지 컬렉션이다. 자동으로 메모리를 관리하며, 더 이상 사용되지 않는 객체를 가비지 컬렉터가 자동으로 제거해 주어 메모리 누수를 방지한다.- 멀티스레딩을 기본적으로 지원하여, 병렬 처..

IT/JAVA 2024.12.27

MyBatis Log4j Error

### Error updating database.  Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for ProfessorMapper.insert = 매핑된 컬렉션에 ProfessorMapper.insert 값이 포함되어 있지 않다= ProfessorMapper 인터페이스에서 insert 메서드에 대한 매핑이 정의되어 있지 않다 원인 )- MyBatis 설정에서 매핑 파일의 경로가 잘못되었거나, 매핑 파일이 로드되지 않았을 수 있다- 매핑 파일에 정의된 ID와 인터페이스 메서드의 이름이 일치하지 않는 경우에 이 오류가 발생할 수 있다    => Mapper의 기능명(id)와 Jav..

IT/JAVA 2024.10.10
반응형