2025/01 7

Runnable과 Callable

Runnable과 Callable의 차이점은 무엇이고 왜 쓰일까?둘 다 스레드를 만들 때 사용된다. 즉 스레드를 만들어 실행시킨다는 의미는 비동기적으로 실행시킨다는 의미이다. 비동기적으로 실행해야 하는 작업에 대해서 반환값을 받아야 할 때는 Callable 를 쓰고 그 결과를 무시해도 될 때는 Runnable를 사용한다. Thread는 비동기적으로 실행해야 하는 작업이 있을 때 쓰인다.기존 Runnable 은 반환값이 없고 체크 예외를 던질 수 없다는 불편함이 있었다.public interface Runnable { void run();}Runnable  의 run()  은 반환 타입이 void이다. 따라서 값을 반환할 수 없다.예외가 선업되어 있지 않다.  따라서 해당 인터페이스를 구현하는 모든 메서..

JAVA 15:37:35

트랜잭션 - 이해

데이터를 저장할 때 단순히 파일에 저장해도 되는데, 데이터베이스에 저장하는 이유는 무엇일까?여러 가지 이유가 있지만 , 가장 대표적인 이유는 바로 데이터베이스는 트랜잭션이라는 개념을 지원하기 때문이다. 트랜잭션의 정의트랜잭션이란? 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 연산들을 의미합니다. 이러한 관점에서 데이터베이스 응용프로그램은 트랜잭션의 집합으로 정의할 수 있습니다. 트랜잭션의 필요성트랜잭션은 작업의 완정성을 보장해주는 것입니다.논리적인 작업들을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우 이전 상태로 복구하여 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능입니다.  트랜잭션 ACID트랜잭션은 ACID 라 ..

DB 00:30:51

커넥션풀과 데이터소스 이해

커넥션 풀 이해데이터베이스 커넥션을 매번 획득 데이터베이스 커넥션을 획득할 때는 다음과 같은 복잡한 과정을 거친다.1. 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다.2. DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 물론 이 과정에서 3 way handshake 같은 TCP /IP 연결을 위한 네트워크 동작이 발생한다.3. DB 드라이버는 TCP / IP 커넥션이 연결되면 ID, PW와 기타 부가 정보를 DB에 전달한다.4. DB 는 ID, PW를 통해 내부 인증을 완료하고 , 내부에 DB 세션을 생성한다.5. DB 는 커넥션 생성이 완료되었다는 응답을 보낸다.6. DB 드라이버는 커넥션 생성이 완료되었다는 응답을 보낸다. 이렇게 커넥션을 새로 만드는 것은 과정도 복잡하고 시..

DB 2025.01.11

JDBC 이해

JDBC 등장 이유애플리케이션을 개발할 때 중요한 데이터는 대부분 데이터베이스에 보관한다.    클라이언트가 애플리케이션 서버를 통해 데이터를 저장하거나 조회하면, 애플리케이션 서버는 다음 과정을 통해서 데이터 베이스를 사용한다. 애플리케이션 서버와 DB -  일반적인 사용법  1. 커넥션 연결 : 주로  TCP/IP를 사용해서 커넥션을 연결한다.2. SQL 전달 : 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다.3. 결과 응답 : DB 는 전달된 SQL을 수행하고  그 결과를 응답한다. 애플리케이션 서버는 응답 결과를 활용한다.  애플리케이션 서버와 DB -  DB 변경  문제는 각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 그리고 ..

DB 2025.01.10

ReentrantLock

ReentrantLock - 이론 자바는 1.0부터 존재한 synchronized와 BLOCKED 상태를 통한 임계 영역 관리의 한계를 극복하기 위해 자바 1.5부터 Lock 인터페이스와 ReentrantLock 구현체를 제공한다. synchronized 단점 무한 대기 : BLOCKED 상태의 스레드는 락이 풀릴 때까지 무한 대기한다.특정 시간까지만 대기하는 타임아웃 X 중간에 인터럽트 X공정성 : 락이 돌아왔을 때 ` BLOCKED ` 상태의 여러 스레드 중에 어떤 스레드가 락을 획득할지 알 수 없다. 최악의 경우 특정 스레드가 너무 오랜 기간 락을 획득하지 못할 수 있다.  package java.util.concurrent.locks; public interface Lock { void l..

JAVA 2025.01.07

Java에서의 지연 초기화와 Optional 활용: orElse vs orElseGet

Supplier 의 내부 람다식이 언제 평가(실행)될까?import java.util.function.Supplier;public class Main { public static void main(String[] args) { Supplier supplier = () -> { System.out.println("Lambda is being executed"); return "Hello, World!"; }; // 람다식이 실행되기 전에는 아무런 출력도 없음 System.out.println("Before calling get()"); // get() 메서드가 호출되면 람다식이 평가되고 실행됨 ..

JAVA 2025.01.06

고급 동기화 - concurrent.Lock

LockSupport1` synchronized` 는 자바 1.0부터 제공되는 매우 편리한 기능이지만, 다음과 같은 한계가 있다. synchronized의 단점 무한 대기 : BLOCKED 상태의 스레드는 락을 풀릴 때까지 무한 대기한다.특정 시간까지만 대기하는 타임 아웃 X중간에 인터럽트 X공정성 : 락이 돌아왔을 때 BLOCKED 상태의 여러 스레드 중에 어떤 스레드가 락을 획득할지 알 수 없다. 최악의 경우 특정 스레드가 너무 오랜 기간 락을 획득하지 못할 수 있다.  자바 1.5부터 ` java.util.concurrent` 라는 동시성 문제 해결을 위한 라이브러리 패키지가 추가된다.이 라이브러리에는 수 많은 클래스가 있지만, 가장 기본이 되는 ` LockSupport` 에 대해서 먼저 알아보자...

JAVA 2025.01.05