Java & Kotlin 11

Socket 통신

1. Socket 통신이란 무엇인가?Socket은 네트워크 프로그래밍에서 가장 기본적이고 중요한 개념 중 하나입니다. 다양한 네트워크 애플리케이션(채팅, 실시간 게임, 파일 전송 등)을 개발하려면 클라이언트-서버 간 통신이 필수적입니다. 이때 Socket은 데이터를 주고받는 양 끝단의 연결점을 의미합니다. 2. Socket 통신의 기본 개념2.1. Socket이란?Socket은 네트워크 상의 두 호스트 간 통신을 위한 인터페이스입니다.주로 TCP/IP 또는 UDP 프로토콜 위에서 데이터를 주고받을 때 사용됩니다. 2.2. TCP와 UDP의 차이구분TCPUDP프로토콜 타입연결형(Connection-oriented)비연결형(Connectionless)신뢰성데이터 무결성 및 순서 보장신뢰성 보장 안 함속도느림..

Java & Kotlin 2024.12.15

Java Thread로 직접 구현하는 커스텀 쓰레드 풀: 기본 원리부터 동작까지

오늘은 Java의 Thread 객체만을 이용해 직접 Executors 클래스의 쓰레드 풀을 구현하는 방법에 대해 소개하겠습니다. Java에서는 Executors 클래스를 사용해 쉽게 쓰레드 풀을 만들 수 있지만, 내부적으로 어떻게 작동하는지 이해하면 더 유연하고 자신만의 커스텀 쓰레드 풀을 설계할 수 있습니다. 이번 글에서는 Thread와 BlockingQueue를 이용해 최소한의 쓰레드 풀을 구현하고, 이를 통해 기본적인 원리를 설명해보겠습니다. 코드는 GitHub에서 확인하실 수 있습니다: https://github.com/youseonghyeon/threadpool 요구 사항구현하려는 Thread Pool의 주요 기능은 다음과 같습니다: 최소 쓰레드 개수 설정: 항상 일정한 최소 개수의 쓰레드가 살..

Java & Kotlin 2024.10.06

Kotlin으로 TTL 기반 Map 구현하기: Java 21 가상 쓰레드와 ConcurrentHashMap 최적화

Redis를 사용할 때 유용한 기능인 시간이 지나면 데이터가 지워지는 기능이 있습니다. 이것을 Kotlin에서 사용해보면 좋을 것 같아 구현해보겠습니다. Redis의 TTL(Time To Live) 기능은 데이터가 일정 시간이 지나면 자동으로 삭제되는 매우 유용한 기능입니다. 이 기능을 활용하면 일정 시간 동안만 유효한 데이터를 관리할 수 있어 리소스 효율성을 극대화할 수 있습니다. Redis 대신 Kotlin에서 직접 이러한 TTL 기능을 구현해보면, 기존 Map처럼 동작하면서도 시간 기반 데이터 관리가 필요한 상황에서 유용하게 사용할 수 있습니다. 요구사항기능은 기존 Map과 동일하게 동작해야 합니다.TTL 시간을 생성자로 주입합니다.시간이 지나면 key, Value가 제거됩니다. 구글이 제작한 라이..

Java & Kotlin 2024.10.04

Java Checked vs Unchecked Exception: 예외 처리의 원칙과 트랜잭션 롤백

Checked Exception과 Unchecked Exception에 대한 이해Java에서 예외 처리(Exception Handling)는 매우 중요한 요소입니다.저는 아키텍처 설계에서 가장 중요하다고 생각되는게 Exception 처리라고 생각합니다. 예외는 프로그램 실행 중에 발생할 수 있는 비정상적인 상황을 나타내며, 이 예외를 적절히 처리하지 않으면 프로그램이 예기치 않게 종료될 수 있습니다.Java에서는 예외를 두 가지 유형으로 나눌 수 있는데, 바로 Checked Exception과 Unchecked Exception입니다. 이번 글에서는 두 가지 예외의 차이점과 사용 사례, 그리고 언제 어떤 예외를 사용하는 것이 적절한지에 대해 알아보겠습니다. Checked Exception이란Checked..

Java & Kotlin 2024.03.03

Java 불변 객체(Immutable Object) 와 장단점

불변 객체(Immutable Object)는 한 번 생성되면 그 상태가 변하지 않는 객체를 의미합니다. 자바에서 가장 흔히 사용되는 불변 객체의 예로는 String 클래스가 있습니다. 이 글에서는 String 클래스를 통해 불변 객체의 개념을 살펴보고, 불변성의 장점과 단점에 대해 논의해 보겠습니다. String 클래스: 불변 객체의 대표적인 예 String 클래스의 인스턴스는 불변 객체입니다. 즉, 한 번 생성된 String 객체의 내부 상태(저장된 문자열)는 변경할 수 없습니다. 예제를 통해 이를 확인해 보겠습니다.String text = "abc";text = text + "def";System.out.println(text); // 출력 결과: "abcdef"  이 코드에서 text 변수는 처음에..

Java & Kotlin 2024.02.04

자바의 Garbage Collection 이해와 성능 최적화 방법

1. Garbage Collection이란?Garbage Collection(GC)는 동적으로 할당된 메모리 중 필요하지 않은 부분을 해제하는 JVM의 기능입니다.더 이상 사용하지 않는 객체의 메모리 자원을 해제하여 메모리의 여유 공간을 만들게 됩니다.객체는 메모리 중 힙 영역에 할당되고, 할당된 객체 즉, 인스턴스가 더 이상 참조되지 않는다면 garbage로 간주되며, 이를 수집하여 메모리를 해제하는 역할이 바로 GC의 역할입니다.이와 같은 자동 메모리 관리는 프로그래머의 부담을 줄이고, 메모리 누수나 불필요한 메모리 사용 등의 문제를 방지하는데 큰 도움이 됩니다.2. GC의 동작 원리GC의 기본적인 동작 원리는 'Mark and Sweep' 알고리즘에 기반합니다. Mark 단계에서는 Root로부터 시..

Java & Kotlin 2023.07.30

Lock과 Double Check Lock: 동시성 문제 해결을 위한 효율적 패턴

Lock을 사용하는 이유는 여러 Thread가 하나의 메서드에 동시 접근했을 때 발생할 수 있는 동시성 문제를 해결하기 위해 사용합니다. 예를 들어 private int count = 0; public void addCount() { count = count + 1; }이러한 로직이 있으며 아래 순서대로 쓰레드 2개가 해당 메서드를 호출합니다.[Thread-1] A 쓰레드가 addCount()에 접근하여 count:0 에 1을 더합니다.[Thread-2] B 쓰레드가 addCount()에 접근하여 count:0 에 1을 더합니다.[Thread-1] A 쓰레드가 0+1 의 결과값인 1을 count에 입력합니다.[Thread-2] B 쓰레드가 0+1 의 결과값인 1을 count에..

Java & Kotlin 2023.07.11

Java Functional Interface로 API 테스트 모듈 간결하게 만들기: 적용 사례와 코드 개선

회사 API 테스트 모듈을 개발하다가 Functional Interface의 좋은 예가 있어서, 이를 통해 개발된 모듈이 어떻게 더욱 간결하고 효과적이게 작성될 수 있었는지를 공유하고자 합니다. 먼저, Functional Interface는 Java8에 도입된 인터페이스로 단 하나의 메서드만을 가지는 인터페이스를 의미합니다.쉽게말해 인터페이스에 메서드가 하나만 있으면 Functional Interface 이죠. test() 메서드를 만들어서 점진적으로 기능을 추가해보겠습니다. 우선 응답 결과가 성공인지 실패인지 확인하는 모듈을 보시죠.protected static boolean test(Call call) { try (Response response = call.execute()) { ..

Java & Kotlin 2023.07.11

Stack Overflow Error 발생 원인과 해결 방법: 재귀 호출 피하기

Stack overflow error는 함수를 재귀 호출하거나 순환 참조하거나, 너무 많은 메소드가 실행되어 제한된 스택 메모리 용량을 초과할 경우 발생합니다. 아래는 에러 발생 예시입니다.public class StackOverflowDemo { public static void recursiveMethod() { recursiveMethod(); } public static void main(String[] args) { recursiveMethod(); }}하나의 메서드를 호출하면 하나의 스택이 쌓입니다.이게 반복되어 쌓이면 StackOverflowError가 발생합니다. 에러를 해결하기 위해 '재귀', '순환 참조'로직은 가급적 피하고, 불가피하게 사..

Java & Kotlin 2023.05.15

Java에서 제공해주는 Functional Interface

목차FunctionSupplierConsumerPredicateCustom Functional Interface자바에서 제공해주는 Functional 인터페이스중 가장 많이 사용되는 4가지 인터페이스를 알아보겠습니다.1. FunctionI : input typeO : output typeI 라는 입력을 받아서 O라는 출력을 낸다. 라는 인터페이스입니다.사용법은 아래와 같습니다. Function function = (i) -> "[" + i + "]"; String result = function.apply(3); System.out.println("result = " + result);결과 : result = [3] 2. SupplierO : output typeFunction과는 다르게..

Java & Kotlin 2023.04.30