5. JNDI : DB Connect

배고픈 징징이 ㅣ 2023. 2. 8. 10:24

0. JINDI란?

  • 네이밍 서비스로 부터 제공하는 데이터 및 객체를 발견하고 참고(Lookup) 하기 위한 자바 API
    작성된 응용프로그램에 이름 지정 및 디렉토리 기능을 제공
  • WAS단에서 DB Connection 객체를 미리 네이밍 해두는 방식
  • DB Conncetion Pool을 효율적으로 사용 가능
  • DB Connection을 WAS단에서 제어하면서 서버에서 하나의 Connection Pool을 가진다.

 

1. 설명

이 프로젝트에서는 MyBatis를 사용하지 않기때문에 JNDI를 이용하여 직접 DB와 연결한다.

Servlet에서 DB연결을 테스트할 수 있는 TestConnection 메소드를 만든다.

 

2. 초기 세팅

먼저 의존성을 추가해주고, DB를 미리 생성해 둔다.

그 다음 DB연결 정보를 context.xml, web.xml에서 설정한다.

 

 

pom.xml

...

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.39</version>
</dependency>

...

 

context.xml

...

<Resource name="jdbc/mysql"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="100"
    maxIdle="30"
    maxWait="10000"
    username = [Id]
    password = [Password]
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://127.0.0.1:3306/[Database]?useSSL=false&amp;characterEncoding=UTF-8&amp;autoReconnect=true"
/>
              
...

 

web.xml

<resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/mysql</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

 

3. Connection 관리

Connection을 관리해주는 Sqls 클래스를 생성한다.

이후 모든 DB연결은 Sqls의 getConnection을 사용한다.

 

Sqls.java

public class Sqls {
    public static Connection getConnection(){
        try {
            Context context = new InitialContext();
            DataSource dataSource = (DataSource)context.lookup("java:comp/env/jdbc/mysql");

            return dataSource.getConnection();
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
}

 

4. TestConnection 메소드

Sqls.getConnection을 이용하여 DB와 연결이 정상적으로 되었는지 테스트 해준다.

Connection의 생성은 Try-With-Resouces로 Try문이 끝남과 동시에 닫아지게 처리했다.

 

ApplicationLoader.java

public class ApplicationLoader implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ...
        
        testConnection();
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    }

    private void testConnection(){
        try(Connection connection = Sqls.getConnection()){
            DatabaseMetaData metaData = connection.getMetaData();
            System.out.println(metaData.getDatabaseProductName() + " " + metaData.getDatabaseProductVersion());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
반응형

'Java > - Pure Java Project' 카테고리의 다른 글

7. LocalThread & Transaction ( Runnable )  (0) 2023.02.13
6. Annotation  (0) 2023.02.09
4. Router (Dynamic Import & Create Class)  (0) 2023.02.07
3. Filter > Controller, Css  (0) 2023.02.06
2. Filter > Js  (0) 2023.02.06