모르지 않다는 것은 아는것과 다르다.

전체 글 224

HikariCP 코드 분석하기 4편 (Connection 점유, Connection 반납)

개요 이번 편에서는 커넥션을 점유하고 반납하는 과정을 알아보자. 먼저, 개념을 설명한 뒤, 예시를 들어 디버깅을 해보기로 하자. 커넥션 점유(개념) connection.getConnection() -> HikariDataSource.getConnection() -> HikariPool.getConnection() -> ConcurrentBag.borrow() 1편에서 설명한 것처럼 커넥션을 점유하는 과정은 borrow() 메소드를 통해서 이루어지며, 크게 3가지 과정으로 구성된다. 먼저 threadList를 검사해서 해당 Thread가 커넥션 풀에 방문한 이력이 있는지 검사하고 이력이 있다면 SharedList 까지 보지 않고 빠르게 커넥션을 반환해 준다. (마치 캐시처럼) 물론 해당 커넥션이 NOT_I..

Jdbc 2023.01.22

HikariCP 코드 분석하기 3편(HikariCP 커넥션 풀 초기화 과정 디버깅)

HikariDataSource초기화 먼저 아래와 같은 옵션으로 DataSource를 빈으로 등록했다. 생성자에 HikariConfig를 인자로 넘긴다. maximumPoolSize: 3 maxLifetime: 10분 HikariConfig를 인자로 넘겼기 때문에 fastPathPool도 같이 초기화 하는것을 확인할 수 있다. 이제 HikariPool을 초기화하는 과정을 알아보자. HikriPool 초기화 2편에서와 마찬가지고 아래의 과정으로 나눠보았다. HikariPool을 초기화하는 과정을 아래와 같은 단계로 나눠보았다. DataSource 생성 connectionBag 생성 houseKeepingExecutorService 생성 커넥션 연결 확인 커넥션 유지 커넥션 추가 DataSource 생성..

Jdbc 2023.01.21

HikariCP 코드 분석하기 2편 (HikariCP 커넥션 풀 초기화 과정)

HikariCP 에서 제공하는 클래스 API Layer HikariDataSource: target DataSource를 나타낸다. HikariConfig: DataSource를 만드는 configuration으로 사용된다. 보통 HikariDataSource나 HikariConfig의 설정값만 바꿔가며 Connection Pool을 관리하지만, 정확한 동작과정을 파악하기 위해서는 아래의 Pool Layer까지 분석할 필요가 있다. Pool Layer HikariPool: 기본 풀링 동작을 제공한다. 여기서 풀링 동작이란 설정한 Connection 수를 유지시키며, Connection만료 시간이 지나면 Connection을 Close시키는 것을 말한다. PoolEntry: Connection의 Wrapp..

Jdbc 2023.01.21

HikariCP 코드 분석하기 1편 (HikariCP란?)

개요 지금까지 Hikari DataSource를 사용하면서, HikariCP에서 제공하는 maximumPoolSize, connectionTimeout, maxLifetime, idleTimeout 과 같은 설정값 정도만 알고 있었지 내부적으로 HikariCP가 어떤식으로 Connection Pool을 관리하는지 알지 못했다. 또한, 언젠가 Connection Pool에서 장애가 발생할 수 있을 것을 대비해서 이번 기회에 HikariCP 코드를 분석해 보려고 한다. Connection Pool이란? 커넥션 풀이란 데이터베이스와 연결된 커넥션을 미리 만들어 놓은 Pool을 의미한다. 만약 커넥션 풀이 없다면? 위와 같이 WAS 내부에 DB 드라이버와 DB가 직접 통신하며 Connection을 가져 와야 된..

Jdbc 2023.01.21

JDK 동적 프록시

개요 프록시를 사용해서 기존의 코드를 건드리지 않고, 새로운 기능을 추가할 수 있다. 하지만 프록시를 적용하고 싶은 대상의 숫자 만큼 프록시 클래스를 만들어야 한다는 단점이 있다. 이러한 문제를 해결하는 방법이 바로 동적 프록시이다. 그리고 동적프록시를 만드는 방법중 하나인 JDK 동적 프록시를 구현하는 방법을 알아보려고 한다. 코드 예시 먼저 아래와 같이 2개의 인터페이스와 구현체를 구현한다. 프록시를 적용하고 싶은 대상이 된다. public interface AInterface { String call(); } @Slf4j public class AImpl implements AInterface { @Override public String call() { log.info("A 호출"); return..

Spring 2022.08.06

프록시 적용하기

인터페이스 기반 프록시 적용 인터페이스를 기반으로 프록시를 적용한다면 아래와 같은 구조가 된다. 위의 그림처럼 Controller와 Service를 인터페이스로 구현하고, 실제 구현체와 같은 인터페이스를 구현하도록 프록시를 만든다. 이렇게 되면 런타임 시점에는 아래와 같이 의존 관계가 설정된다/ 구현 Repository, RepositoryProxy public class OrderRepositoryV1Impl implements OrderRepositoryV1 { @Override public void save(String itemId) { //... 생략 } } @RequiredArgsConstructor public class OrderRepositoryInterfaceProxy implements..

객체지향 2022.08.06

프록시 패턴과 데코레이터 패턴

개요 프록시를 이용하면 기존로직에 변화를 주지 않고도 새로운 기능을 추가할 수 있다. 스프링은 이러한 방법을 이용해서 유연하게 기능을 확장했다. 그래서 기존코드를 건드리지 않고 새로운 기능을 추가할 수 있는 프록시 패턴과 데코레이터 패턴을 학습하려고 한다. 클라이언트, 서버, 프록시 보통 Client와 Server를 생각하면 컴퓨터 네트워크의 Client, Server 를 많이 떠올리지만, 이 개념을 객체에 도입하면 요청하는 객체는 클라이언트가 되고, 요청을 처리하는 객체는 서버가 된다. 하지만 여기서 Client가 요청한 결과를 서버에 직접 요청하는 것이 아니라 어떤 대리자를 통해서 간접적으로 서버에 요청할 수 있다. 여기서 그 대리자가 바로 프록시다. 프록시는 객체안에서의 개념도 있고, 웹 서버에서의..

객체지향 2022.08.06

ApplicationEventPublisher

ApplicationEventPublisher 란? ApplicationEventPublisher는 ApplicationContext가 상속하는 인터페이스 중 하나이다. ApplicationContext에는 ApplicationEventPublisher 인터페이스가 이미 구현되어있다. 그렇기 때문에 ApplicationEventPublisher를 이용해서 쉽게 이벤트를 발생시키고 처리할 수 있다. Design Pattern 중 하나인 옵저버 패턴의 구현체이다. 또한, Event를 발행해서 중첩되는 Transactional 내부에서 Commit 시점을 핸들링 할 수도 있다. 이벤트 처리 구조 먼저 이벤트를 정의한다. Publisher 를 통해서 이벤트를 발생시킨다. Listener 를 통해서 이벤트를 이벤..

Spring 2022.06.11

gradle 파일 이해하기

개요 지금까지 build.gradle 파일을 사용해서 java와 spring 파일들을 빌드했지만, 구조를 정확히 알지 못하는 느낌을 받았다. 그래서 gradle 파일이 어떤식으로 구성되는지 공부해 보려고 한다. settings.gradle rootProject.name = 'gradle-study' setting.gradle에는 루트 프로젝트의 이름이 설정되어 있다. setting.gradle에 서브 프로젝트를 추가하고, build.gradle에 각각에 맞는 스코프를 만들어 의존성을 주입하면 멀티 프로젝트를 구성할 수 있다. SourceSet gradle을 이용해서 프로젝트를 생성하면 아래와 같이 SourceSet을 구성해 준다. 그렇기 때문에 gradle로 프로젝트를 생성하지 않는다면 SourceSet..

Other 2022.06.11

직렬화

개요 자바에서 직렬화란 개념을 아주 가볍게 알고 있었다. 또한 종종 캐시를 사용할 때 Serializable 인터페이스를 구현해 본 경험이 있다. 하지만 어떤 경우에 써야하는지 명확히 알지 못해 이번 기회에 개념을 잡아 보려고 한다. 직렬화란? 자바에서 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술을 말한다. 또한, 역직렬화란 바이트로 변환된 데이터를 다시 객체로 변환하는 기술을 말한다. 정리하면, JVM의 메모리에 상주되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환하여 JVM으로 상주시키는 형태를 직렬화, 역직렬화라고 한다. 직렬화가 필요한 경우 JV..

Java 2022.05.30