-
[JSP] JNDI & JSP에서 리소스 호출Server 2024. 11. 8. 12:56
JDBC를 이용하여 코드와 데이터베이스를 연결할 때, 연결을 할 때마다 코드에 연결 정보를 계속해서 작성해주어야 하는 불편함이 있었다.
String url = "jdbc:mariadb://localhost:3306/sample"; String user = "root"; String password = "1234"; Class.forName("org.mariadb.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, user, password);이런 코드를 매번 매 파일마다 작성해주었다.
JNDI API를 사용하면 이걸 매번 작성하지 않고도 연결 정보를 xml파일에 적어두고 필요할 때 마다 편리하게 꺼내서 사용하는 방법이 있다.
JNDI(Java Naming and Directory Interface)란?
JNDI(Java Naming and Directory Interface)는 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견하고 참고하기 위한 자바 API로, 주로 자원의 위치나 설정 정보를 중앙화하고 접근하기 위해 사용되며, 서버 환경에서 데이터베이스 연결 정보 등 공통 리소스를 쉽게 관리할 수 있게 한다.
JNDI를 사용하면 WAS단에 DB Connection 자체를 미리 네이밍하여 편리하게 가져다 쓸 수 있다.
그러면 본격적으로 InteliJ 내 자바코드에서 JSP에서 리소스를 호출해보자
1. 설정 xml 파일 작성하기
2. 코드에서 불러오기
1. 설정 xml 파일 작성하기
먼저 META-INF라는 폴더를 만들어준다. 이 폴더는 애플리케이션의 설정 파일을 저장하는 용도로 쓰인다.
그리고 이 폴더 아래에 설정 정보를 작성할 context.xml라는 명으로 파일을 하나 만들어준다.

webapp > META-INF > context.xml context.xml 예시 (DataSource 설정)
<?xml version="1.0" encoding="utf-8" ?> <Context> <Resource name="jdbc/mariadb1" auth="Container" type="javax.sql.DataSource" driverClassName="org.mariadb.jdbc.Driver" url="jdbc:mariadb://localhost:3306/sample" username="root" password="!123456" /> </Context>- name: JNDI 이름으로, 자원을 찾을 때 사용하는 경로, JSP나 Servlet 코드에서 jdbc/mariadb1 라는 경로를 이용해 데이터베이스 자원을 조회할 수 있다.
- auth: Container로 설정하면 Tomcat이 자원을 관리한다.
- type: 자원의 타입으로, 데이터베이스 연결 풀을 설정할 때는 javax.sql.DataSource를 사용한다.
- driverClassName: 데이터베이스 드라이버 클래스로, MariaDB 드라이버(org.mariadb.jdbc.Driver)를 사용한다는 의미이다.
- url: 데이터베이스 URL, MariaDB에 연결하는 경로이다.
- username, password: 데이터베이스 접속을 위한 계정 정보이다.
이렇게 context.xml파일 내에 정보를 작성해 놓으면 데이터베이스 연결 풀(DataSource)을 정의하여 웹 애플리케이션에서 손쉽게 접근할 수 있도록 설정할 수 있고, Tomcat이 애플리케이션을 배포할 때 context.xml 파일을 읽어 필요한 자원을 설정할 수 있다.
2. 호출하기
이제 JDBC를 연결해서 사용할 java 파일에 위에서 작성한 context.xml를 불러와서 커넥션을 연결해 줄 차례이다.
나는 JSP에서 호출해주었다.
먼저 필요한 JNDI 라이브러리를 호출해준다.
<%@ page import="javax.naming.Context" %> <%@ page import="javax.naming.InitialContext" %> <%@ page import="javax.naming.NamingException" %>위의 JSP의 import 문은 JNDI(Java Naming and Directory Interface)를 사용해 Tomcat에서 제공하는 context.xml의 자원을 조회할 때 필요한 클래스를 불러와주는 역할을 한다.
- javax.naming.Context
- Context는 JNDI API의 핵심 인터페이스로, 디렉토리 서비스의 루트 역할을 한다.
- context.xml에 정의된 자원을 조회하고 검색할 수 있는 방법을 제공해준다.
- javax.naming.InitialContext
- InitialContext는 JNDI의 기본 구현체로, 애플리케이션의 초기 네이밍 컨텍스트를 제공해준다.
- context.xml에서 설정된 자원을 JNDI 이름으로 조회할 때 초기 진입점 역할을 한다.
- 예를 들어, 데이터베이스 연결을 jdbc/MyDB라는 이름으로 조회할 수 있게 해준다.
- javax.naming.NamingException
- NamingException은 JNDI 작업 중 발생하는 예외를 처리한다.
- context.xml에서 설정된 자원을 찾지 못하거나 연결에 문제가 발생했을 때 이 예외가 발생하는데, 예외 처리를 통해 안전하게 리소스를 사용할 수 있다.
위처럼 필요한 라이브러리를 호출해주었다면, 이제 JNDI를 통해 연결해주면 된다.
Context initCtx = new InitialContext(); Context envCtx = (Context)initCtx.lookup("java:comp/env"); DataSource dataSource = (DataSource) envCtx.lookup("jdbc/mariadb1"); conn = dataSource.getConnection();- InitialContext initCtx = new InitialContext();
- JNDI의 초기 컨텍스트를 생성한다. 이제 initCtx를 사용하면 context.xml에 정의된 자원에 접근이 가능해진다.
- Context envCtx = (Context)initCtx.lookup("java:comp/env");
- java:comp/env는 애플리케이션 환경 컨텍스트를 나타내는 경로로, 서버 환경에서 자원을 조회할 때 이 경로를 사용한다.
- 환경 컨텍스트 안에서 context.xml에 설정된 자원들을 찾아볼 수 있다.
- DataSource dataSource = (DataSource) envCtx.lookup("jdbc/mariadb1");
- jdbc/mariadb1라는 이름의 자원을 조회하여 DataSource 객체로 가져온다. DataSource를 통해 데이터베이스 연결을 관리하고 데이터베이스와 통신할 수 있다.
- dataSource.getConnection()을 사용하면 데이터베이스와 연결된 Connection 객체를 가져올 수 있다.
'Server' 카테고리의 다른 글
JSP와 Servlet을 사용하여 MVC 모델 설계 (0) 2024.11.13 DTO와 DAO (0) 2024.11.12 [AJAX와 JSP] AJAX 대신 JSP를 사용하는 이유 & JSP 대신 AJAX를 사용하는 이유 (1) 2024.11.07 JSP 내장 객체 (0) 2024.11.07 [Server] InteliJ에서 JSP 프로젝트 생성 (0) 2024.11.07