java log4j 취약점 분석을 하던 중에 jndi에 대해 궁금해졌다.
jndi를 이해하려면 여러가지 바탕지식이 필요하다.
네트워크 상의 연결을 의미
자바에서는 다음과 같은 코드로 커넥션을 만들 수 있다.
DriverManager.getConnection()
이렇게 connection이 만들어지면 connection pool이라는 개념이 등장한다.
connection pool : 클라이언트 요청 시점에 Connection을 연결하는 것이 아니라 미리 일정 수 의 Connection을 만들어 놓고 필요한 어플리케이션에 전달하여 이용하는 방법
예를 들어, JDBC Framework에서 close가 이루어지면 Connection을 Connection Pool에 반납한다.
Connection Pool을 관리하는 목적으로 사용되는 객체
자바에서는 다음과 같은 코드로 DataSource를 얻어온다.
javax.sql.DataSource
application에서는 이 datasource인터 페이스를 통해 Connection을 얻어오고 반납하는 등의 작업을 구현한다.
즉, datasource는 어플리케이션이 connection들을 어떻게 관리할지를 구현하는 인터페이스이다.
데이터 베이스를 조작하는 표준 SQL 인터페이스 API
JDBC는 지난달 공부한 자바 crud 프로젝트에서 h2-console 실행할때 보았던 api이다.

다음과 같은 특징을 가지고 있다.
하지만 다음과 같은 단점을 가지고 있다.
application을 시작할 때 원하는 만큼 Connection 객체를 만들어 Pool에 넣어놓은 채 필요할 때마다 가져다 쓰고 다시 반납하는 방식
다음과 같은 특징을 가지고 있다.
WAS 단에 DB Connection 자체를 미리 네이밍해두는 방식
application은 API를 호출하여 자원과 다른 프로그램 객체를 찾는다.
여기서 말하는 자원은 데이터 베이스 서버나 메시징 시스템 같은 시스템과의 연결을 제공하는 프로그램 객체이다.
(JDBC 자원을 데이터 소스라고 함)
자원 객체와 JNDI 이름은 application 서버에 포함된 이름 지정 및 디렉토리 서비스에 의해 함께 바인딩 된다.
즉, 저장해 놓은 WAS의 데이터 베이스 정보에 JNDI를 설정해 놓으면 웹 애플리케이션은 JNDI만 호출하면 간단해진다.
JNDI는 다음과 같은 장점을 가지고 있다.
> WAS단에 설정정보를 통해 DB가 몇개 붙어있는지 파악하기 수월하다. > WAS 단에서 DB Pool을 하나로 관리하면 static 객체를 생성 후에 쉽게 가져다 쓸 수 있기 때문에 효율이 좋아진다.정말 자바는 파면 팔수록 알아야하는 용어도 많고, 추상화도 많아서 양파 같은 언어인 것 같다.
하지만, 추상화된 의미 그것을 사용해야하는 이유를 알 수록 (함부로 판단하긴 어렵지만) 개인적으로 정말 잘 짜여진 언어인것같다는 생각이 든다.