전체 글 115

이펙티브 자바 - 직렬화

"이펙티브 자바"의 마지막 챕터는 직렬화이다.  요즘은 대부분 JSON이나 Protobuf 같은 언어에 독립적인 데이터 교환 형식을 사용하는데, 왜 책에서는 여전히 직렬화를 중요한 주제로 다룰까? 자바에서 기본적으로 제공하는 직렬화(Serialization)와 역직렬화(Deserialization)는 JVM 위에서 동작하며, 데이터를 파일이나 네트워크로 전달할 수 있는 형식으로 변환하는 강력한 기능입니다. 하지만 이 메커니즘은 클래스 설계이 유연성 저하, 보안 취약점, 이식성 부족등의 큰 한계가 존재한다. 그렇다면 책에서는 왜 직렬화 파트를 크게 다룰까?여기서는 크게 직렬화를 하게 되면 유의할 점 등 직렬화시 매커니즘과 유의 사항을 알아보자는 취지로 책을 읽어보자! 직렬화의 목적현재 JVM 메모리 상태를..

지연 연산 vs 즉시 연산: Kotlin과 Java Stream을 통한 최적화 전략 이해하기

지연 연산 (Lazy Evaluation) vs 즉시 연산 (Eager Evaluation) 스트림을 배우다 보면 지연연산이라는 특징을 접하게 된다. 지연연산을 종단연산을 실행하기 전까지 연산을 미루기 때문에 해당 연산을 즉시 실행되지 않는다. 그렇다면 지연 연산이란 무엇일까? Lazy  vs Eager 지연 연산이란 간단히 말해 결괏값이 필요할 때까지 계산을 늦추는 기법이다. 즉, 눈앞에 코드가 주어졌을 때 곧바로 해당 코드를 실행하는 것이 아니라 실행결과가  필요해지는 시점에 실행을 하도록 하는 것이다. 다만, 이러한 방식으로 코드가 동작하기 위해 내부적으로 준비해 주는 작업이 필요하므로  무조건 효율적인 방식이라고 보기 어렵다. 이에 반해 어떠한 작업이 즉시 수행되다면 말 그대로 실행할 코드가 보이..

JAVA 2025.01.17

이펙티브 자바 - 제네릭

아이템26 . 로 타입을 사용하지 말라!로 타입이란?  제네릭 타입에서 타입 매개변수가 정의되지 않을 때를 말한다. 예를 들어 List 의 로 타입은 List 이다.로(raw) 타입을 사용하지 말아야하는 이유는 무엇일까? 즉 매개변수화 타입을 사용하라는 말이다.매개변수화 타입을 사용하면 런타임이 아닌 컴파일 타입에 문제를 찾을 수 있고(안정성 -> 로타임 컬렉션에는 아무원소나 넣은 수 있어 타입 불변식 훼손이 쉽다.)제네릭을 활용하면 이 정보가 주석이 아닌 타입 선언 자체에 녹아든다. (표현력 : ex ) List -> Integer 라는 타입을 넣는다는 사실을 알수 있음)로 타입을 사용하면 안정성과 표현력을 잃게된다.아이템27. 비검사 경고를 제거하라 "비검사(unchecked) 경고 란? "컴파일러가..

HTTP 특징 (Stateless, connectionless)

HTTP 특징http 는 클라이언트 서버 구조로 되어있다. (Request Response 구조)클라이언트가 http 메시지로 서버에 요청을 보내고 서버의 응답이 올때까지 기다린다.서버는 요청에 대한 결과를 만들어서 클라이언트에게 응답한다. 클라이언트 서버 구조는 클라이언트는 UI , 사용성에 집중할 수 있고 서버는 비즈니스 로직에 집중할 수 있는 이점이 있다.양쪽이 독립적으로 진화할수 있다는것이 가장 큰 이점이다.  Stateless vs Stateful 정리 stateless 특성은 응답에 필요한 정보를 모두 실어보내기때문에 중간에 서버가 바뀌어도 올바른 응답을 할 수 있다. 따라서 스케일 아웃이 가능하다. 애플리케이션 설계시 최대한 무상태성으로 설계를 하고 필요한 경우에만 stateful 방식을 취..

Network 2025.01.13

DB와 WAS 간 TCP 통신: 효율적인 커넥션 관리와 흐름, 혼잡 제어

DB와 WAS 서버 간의 통신을 위한 TCP 통신 과정DB 드라이버를 통해 TCP/IP  커넥션을 연결 후 ID ,PW 등을 DB 서버로 보내 내부 인증을 완료하면 생성된 커넥션 객체를 응답받을 수 있다.  초기 TCP/IP 연결 과정(DB 커넥션 풀이 필요한 이유) 초기에 TCP/IP 로 연결하는 과정에서 3 way handshake 로 초기 연결을 하는 과정에서 시간이 많이 걸린다.때문에 DB 호출시 커넥션을 맺게되면 쿼리하는 비용보다 커넥션을 맺는 비용이 더 클수 있다.때문에 TCP/IP 로 DB 와 WAS 서버가 연결된 커넥션들을 커넥션 풀에 미리 생성을 해놓고 애플리케이션 로직은 언제든지 커넥션 풀에 이미 생성되어있는 커넥션 객체 참조를 가져다 쓴다. TCP 커넥션을 맺는 비용은 왜 비쌀까?연결..

Network 2025.01.12

Runnable과 Callable

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

JAVA 2025.01.12

트랜잭션 - 이해

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

DB 2025.01.12

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

커넥션 풀(Connection Pool) – 왜 필요할까?  프로젝트를 진행하다 보면 거의 필수적으로 커넥션 풀을 사용하게 된다.그렇다면 커넥션 풀(Connection Pool)이란 무엇이며, 왜 필요한 걸까?1. 커넥션 풀(Connection Pool)이란?커넥션 풀이란 미리 일정 개수의 DB 커넥션을 생성해두고, 애플리케이션이 필요할 때 즉시 사용할 수 있도록 관리하는 기법이다.일반적으로 DB 커넥션을 매번 새로 생성하는 방식은 비효율적이며 성능 저하를 초래할 수 있다. 2. 왜 커넥션 풀이 필요할까?데이터베이스에 쿼리를 실행할 때, 애플리케이션과 DB 간의 네트워크 연결(TCP 커넥션)을 맺어야 한다.하지만 이 과정에서 3-way Handshake 및 TLS 핸드셰이크 같은 오버헤드가 발생한다. 즉..

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