[Day 20 | JSP] JSP - 데이터 소스 설정(context.xml)

y♡ding·2024년 11월 8일
0

데브코스 TIL

목록 보기
131/163

META-INF 디렉토리

META-INF 디렉토리는 Java 애플리케이션의 구성 정보와 메타데이터를 관리하여, 런타임 환경이 해당 애플리케이션을 올바르게 실행하도록 돕습니다. Java 런타임은 META-INF 디렉토리의 정보를 참조하여 클래스 경로를 설정하거나, 애플리케이션의 엔트리 포인트를 파악하고, 특정 서비스의 구현체를 로드할 수 있습니다.


context.xml: Tomcat 리소스 설정

context.xmlApache Tomcat과 같은 애플리케이션 서버에서 개별 웹 애플리케이션의 환경 설정리소스(특히 데이터베이스 연결)를 정의하는 데 사용되는 구성 파일입니다. 이 파일은 주로 데이터베이스 연결 풀 설정, JNDI 리소스, 환경 변수 등을 지정하며, Tomcat이 애플리케이션을 실행할 때 이 설정을 읽어들여 애플리케이션에 필요한 리소스를 제공합니다.

위치

  • META-INF/context.xml: WAR 파일 내부의 META-INF 디렉토리에 위치할 수 있으며, 해당 애플리케이션에만 적용됩니다.
  • conf/context.xml: Tomcat의 conf 디렉토리 아래에 위치할 경우, 모든 웹 애플리케이션에 공통으로 적용됩니다.
    일반적으로 각 애플리케이션에 특화된 설정을 위해 WAR 파일의 META-INF/context.xml에 설정을 저장합니다.
<?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에서 이 리소스를 참조할 때 사용할 이름입니다.
    • java:comp/env/jdbc/mariadb1와 같은 형식으로 애플리케이션에서 참조하게 됩니다.
    • jdbc/는 데이터베이스 리소스를 나타내기 위해 사용되는 표준 접두사입니다.
  • auth: Tomcat의 Container에서 인증을 관리하도록 지정합니다.
    • Tomcat 컨테이너에 의해 인증되도록 설정하는 옵션입니다.
    • Container로 설정하면 Tomcat이 이 리소스를 관리하고 인증합니다.
  • type: 리소스 타입, javax.sql.DataSource는 데이터베이스 연결 풀을 의미합니다.
    • 리소스의 데이터 타입을 지정합니다.
    • javax.sql.DataSource는 데이터베이스 연결 풀을 정의하는 표준 인터페이스로, JDBC 드라이버를 통해 데이터베이스와의 연결을 관리합니다.
  • driverClassName: JDBC 드라이버 클래스 이름을 지정합니다.
    • MariaDB 데이터베이스 연결에 필요한 JDBC 드라이버 클래스입니다.
    • 이 드라이버가 Tomcat에 미리 설치되어 있어야 하며, 보통 프로젝트 의존성에 포함시켜서 사용합니다.
  • url: 데이터베이스 URL입니다.
  • username/password: 데이터베이스에 연결할 때 사용할 사용자명과 비밀번호입니다.
  • maxTotal: 연결 풀의 최대 연결 수를 설정합니다.
  • maxIdle: 유휴 상태로 유지할 최대 연결 수를 설정합니다.
  • maxWaitMillis: 연결을 얻기 위해 대기하는 최대 시간(밀리초)입니다.
<%
    Connection conn = null;

    try {
        Context initCtx = new InitialContext();
        Context envCtx = (Context) initCtx.lookup("java:/comp/env");
        DataSource dataSource = (DataSource) envCtx.lookup("jdbc/mariadb1");

        conn = dataSource.getConnection();
        out.println("데이터베이스 연결 성공");
    } catch (Exception e) {
        System.out.println("[에러] " + e.getMessage());
    } catch (SQLException e) {
        System.out.println("[에러] " + e.getMessage());
    } finally {
        if (conn != null) conn.close();
    }
%>
  • Context initCtx = new InitialContext();
    • JNDI의 초기 컨텍스트를 가져옵니다. InitialContext는 Java 애플리케이션이 네이밍 및 디렉토리 서비스에 접근할 수 있도록 해주는 기본 클래스입니다.
  • Context envCtx = (Context) initCtx.lookup("java:/comp/env");
    • 애플리케이션 환경에 대한 컨텍스트를 가져옵니다. Tomcat에서는 JNDI 리소스가 java:/comp/env라는 경로에 등록되므로 이를 참조합니다.
  • DataSource dataSource = (DataSource) envCtx.lookup("jdbc/mariadb1");
    • context.xml 파일에 정의된 데이터베이스 리소스 jdbc/mariadb1을 찾습니다. 이 예제에서는 context.xml에서 설정한 MariaDB 데이터베이스의 DataSource 객체를 가져옵니다.
  • conn = dataSource.getConnection();
    • DataSource 객체를 통해 데이터베이스 연결을 획득합니다. JNDI를 통해 DataSource 객체를 가져오면, 데이터베이스 연결 풀에서 연결을 관리할 수 있어 효율적입니다.

JNDI란?

JNDI(Java Naming and Directory Interface)는 Java에서 네이밍디렉토리 서비스를 제공하는 API입니다. 이를 통해 Java 애플리케이션은 데이터베이스, 파일 시스템, 메시지 큐 등 다양한 리소스에 접근할 수 있습니다. Tomcat과 같은 애플리케이션 서버는 JNDI를 사용하여 리소스를 관리하고, 이를 통해 코드에서 리소스의 위치를 추상화하여 환경에 독립적인 구성이 가능합니다.

특징

  • 추상화된 리소스 접근: 코드에서 리소스의 실제 위치나 상세 설정을 알 필요 없이, JNDI 이름으로 리소스를 참조할 수 있습니다.
  • 환경 독립성: 애플리케이션이 배포된 환경에 따라 설정을 조정할 수 있으며, 코드 수정 없이 환경에 맞는 설정을 적용할 수 있습니다.
  • 리소스 관리: 데이터베이스 연결 풀과 같은 공유 리소스를 서버가 관리하여, 리소스를 효율적으로 사용할 수 있습니다.

참고) JDBC, DBCP, JNDI 이해하기

0개의 댓글

관련 채용 정보