분류 전체보기 127

JDBC 이해: 등장 배경 및 동작원리

자바 개발자로서 데이터베이스를 다룰 때 가장 먼저 만나게 되는 기술인 JDBC(Java DataBase Connectivity) 이다.JDBC 는 1997년에 등장한 오래된 기술이지만, 여전히 SQL 기반 데이터베이스와 자바를 연결하는 핵심 기반 기술로 자리잡고 있다. 이 글에서 JDBC 의 등장배경, 동작원리, 코드 작성방식, 그리고 실무에서의 어떤 한계와 대안이 있는지를 정리해보겠다,JDBC 등장 이유애플리케이션을 개발할 때 중요한 데이터는 대부분 데이터베이스에 보관한다. 애플리케이션 서버와 DB - 일반적인 사용법 이떄 일반적인 프름은 다음과 같다.커넥션 연결 : 주로 TCP/IP를 사용해서 커넥션을 연결한다.SQL 전달 : 애플리케이션 서버는 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

지연 평가는 언제 사용할까?Optional 케이스에서  orElseGet() 인 경우에는 Optinal.empty() 일때만 평가를 하지때문에 평가하는데 비용이 크거나,empty 가 아닐때 평가를 안해도 되는 비용들을 좀 줄여야하는 필요가 있을때  orElseGet을 써서 지연평가로 해당 부분을 해결한다. 핵심: orElseGet을 통해 평가 비용이 큰 연산을 지연시키고, 필요할 때만 실행하는 방식이 지연 평가의 본질이다. 이를 통해 성능을 최적화할 수 있다. 지연 초기화는 객체나 리소스의 초기화 시점을 지연시키는 것이고지연 평가는 연산 시점을 지연시킨다. 둘다 성능 최적화라는 공통점이 있다. Supplier 의 내부 람다식이 언제 평가(실행)될까?import java.util.function.Suppl..

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

생산자 소비자 문제1

생산자 소비자 문제 - 소개 생산자 소비자 문제는 멀티스레드 프로그래밍에서 자주 등장하는 동시성 문제 중  하나로, 여러  스레드가 동시에 데이터를 생성하고 소비하는 상황을 다룬다. 멀티스레드의 핵심을 제대로 이해하려면 반드시 생산자 소비자 문제를 이해하고, 올바른 해결방안도 함께 알아두어야 한다.생산자 소비자 문제를 제대로 이해하면 멀티스레드를 제대로 이해했다고 볼 수 있다. 그만큼 중요한  내용이다. 프린터 예제 그림  기본 개념 생산자(Producer) 데이터를 생성하거나 작업을 요청하는 역할. 예를 들어, 파일에서 데이터를 읽어 오거나 네트워크에서 데이터를 받아오는 스레드가 생산자 역할을 할 수 있다프린터 예제에서 사용자의 입력을 프린터 큐에 전달하는 스레드가 생산자의 역할이다.소비자(Consum..

JAVA 2024.12.31

멀티스레드 환경에서 volatile 의 중요성: 메모리 가시성 문제 해결

1. 멀티스레드 환경에서의 문제멀티스레드 프로그래밍에서 여러 스레드가 같은 데이터를 공유할 때 중요한 문제는 바로 메모리 가시성 (Memory Visibility 이다.메모리 가시성이란, 한 스레드가 변경한 값이 다른 스레드에서 언제 보이는지에 대한 문제이다.즉 이름 그대도 변경한 값이 보이는가, 보이지 않는가의 문제이다.  volatile, 메모리 가시성 1 volatile 로 변수 상태에 대해 스레드 간 가시성을 확보할 수 있다.volatile 이 붙은 변수는 각 스레드의 로컬 캐시를 사용하지 않고, 항상 메인 메모리에서 값을 읽고 쓰게 만든다. 이를 통해 한 스레드에서 값을 변경하면 다른 스레드에서 즉시 그 변경사항을 볼수 있다.  volatile과 메모리 가시성을 이해하기 위해, 간단한 예제를 ..

JAVA 2024.12.29

익명 클래스

익명 클래스 - 시작익명 클래스(anonymous class)는 지역 클래스의 특별한 종류의 하나이다.익명 클래스는 지역 클래스인데,  클래스의 이름이 없다는 특징이 있다. 앞서 만들었던 지역 클래스 예제 코드인 코드를  ` LocalOuterV2 `  다시 한번 살펴보자. package nested.local;public class LocalOuterV2 { private int outInstanceVar = 3; public void process(int paramVar) { int localVar = 1; class LocalPrinter implements Printer { int value = 0; @Override ..

JAVA 2024.12.24

중첩 클래스, 내부 클래스 2

지역 클래스 - 시작 지역 클래스 (Local class)는 내부 클래스의 특별한 종류의 하나이다. 따라서 내부 클래스의 특징을 그대로 가진다. 예를 들어서 지역 클래스도 내부 클래스이므로 바깥 클래스의 인스턴스 멤버에 접근할 수 있다. 지역 클래스 예class Outer { public void process() { //지역 변수 int localVar = 0; //지역 클래스 class Local {...} Local local = new Local(); } } 지역 클래스의 특징지역 클래스는 지역 변수처럼 코드 블록 안에 클래스를 선언한다.지역 클래스는 지역 변수에 접근할 수 있다.package nested.local;publ..

JAVA 2024.12.24

중첩 클래스, 내부 클래스 1

중첩 클래스, 내부 클래스란? for (...) { //중첩 for문for (...) { } }다음과 같이 for 문 안에 for 문을 중첩하는 것을 중첩 (Nested) for 문이라 한다.  class Outer { ... //중첩 클래스 class Nested { ... } }다음과 같이 클래스 안에 클래스를 중첩해서 정의할 수 있는데, 이것을 중첩 클래스라 한다.중첩 클래스는 클래스를 정의하는 위치에 따라 다음과 같이 분류한다. 중첩 클래스의 분류     중첩 클래스는 총 4가지가 있고, 크게 2가지로 분류할 수 있다.정적 중첩 클래스내부 클래스내부 클래스지역 클래스익명 클래스 중첩 클래스를 정의하는 위치는 변수의 선언 위치와 같다. 변수의 선언 위치정적 변수 (클..

JAVA 2024.12.23