ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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의 자원을 조회할 때 필요한 클래스를 불러와주는 역할을 한다.

     

    1. javax.naming.Context
      • Context는 JNDI API의 핵심 인터페이스로, 디렉토리 서비스의 루트 역할을 한다.
      • context.xml에 정의된 자원을 조회하고 검색할 수 있는 방법을 제공해준다.
    2. javax.naming.InitialContext
      • InitialContext는 JNDI의 기본 구현체로, 애플리케이션의 초기 네이밍 컨텍스트를 제공해준다.
      • context.xml에서 설정된 자원을 JNDI 이름으로 조회할 때 초기 진입점 역할을 한다.
      • 예를 들어, 데이터베이스 연결을 jdbc/MyDB라는 이름으로 조회할 수 있게 해준다.
    3. 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 객체를 가져올 수 있다.

     

     

     

Designed by Tistory.