[Servlet/JSP] JDBC와 JDNI 사용방법

아는벌·2023년 3월 2일
1

web (2)

목록 보기
12/20

JDBC

JDBC(Java DataBase Connectivity)

  • 데이터베이스르 조작하는 표준 SQL 인터페이스 API
  • Database Pool 방식 사용 X
  • DB에서 데이터를 가져올 때마다 DB Connection을 열고 닫음
public class JdbcUtil_Jdbc {
    public static Connection getConnection() {
        // JDBC 연동 - 커넥션 드라이버 찾기
        String url = "jdbc:h2:~/test";	// DB Url
        String user = "sa";	// 사용자 id
        String password = "";	// 비밀번호
        Connection conn = null;
        try {
            Class.forName("org.h2.Driver"); // 드라이버 검색 => 인스턴스화
            System.out.println("드라이버 검색 성공");
            conn = DriverManager.getConnection(url,user,password);
            System.out.println(conn);
        } catch (ClassNotFoundException e) {
            System.out.println("드라이버 검색 실패");
            throw new RuntimeException(e);
        } catch (SQLException e) {
            System.out.println("SQL 오류");
            throw new RuntimeException(e);
        }

        return conn;
    }
    public static void close(Connection obj) {
        try {
            if(obj != null) obj.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

url, userId, password close()를 통해 사용 후 conn의 통로를 닫아준다.

public class SaramDAO {
    // Database에 CRUD를 전담하는 클래스
    Connection conn = null; // 디비 연결 용도
    PreparedStatement stmt = null; // 디비에 SQL 전달
    ResultSet rs = null; // 결과를 받아 올때 사용.

    // 검색
    public List<SaramDTO> findAll() {
        List<SaramDTO> list = new ArrayList<SaramDTO>();
        try {
            conn = JdbcUtil_Jdbc.getConnection();
            stmt = conn.prepareStatement("SELECT * FROM SARAM");
            rs = stmt.executeQuery();
            while(rs.next()) {
                Long seq = rs.getLong("seq");
                String id = rs.getString("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                list.add(new SaramDTO(Math.toIntExact(seq), id, name, age));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtil_Jdbc.close(conn, stmt, rs);
        }
        return list;
    }
  • Connection - 애플리케이션과 디비를 연결 용도의 객체
  • PreparedStatement - SQL 쿼리를 실행할 때 사용하는 클래스
  • ResultSet - 결과를 받아 올때 사용
  • .executeQuery() - 쿼리문 실행

JNDI

JDNI(Java Naming and Directory Interface)

  • 디렉토리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup)하기 위한 자바 API
  • DB에 직접 Connection 요청하는 것이 아닌 JNDI Lookup을 통해 DB와 연관된 데이터 소스를 얻고 Connection을 요청
  • Connection 요청을 받은 데이터소슷는 자신의 커넥션 풀에서 커넥션을 꺼내어 애플리케이션에 전달
  • DB 커넥션 정보를 WAS단에서 관리

https://tomcat.apache.org/tomcat-9.0-doc/jndi-resources-howto.html

설정

    <resource-ref>
        <res-ref-name>jdbc/H2DB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

web.xml에 다음과 같이 설정한다.

<Context >
    <Resource name="jdbc/H2DB"
              auth="Container"
              type="javax.sql.DataSource"
              username="sa"
              password=""
              driverClassName="org.h2.Driver"
              url="jdbc:h2:~/test"
              maxTotal="8"
              maxIdle="4"/>
</Context>

META-INFO/context.xml에 다음과 같이 설정한다. 인텔리제이를 사용중이라 META-INFO조차 없었는데 Project Structure -> Modules -> Add Application Server specific dexriptor...에서 추가해서 만들어졌다! 여기서 name="jdbc/H2DB"과 web.xml의 <res-ref-name>jdbc/H2DB</res-ref-name>의 name은 동일해야한다.

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/H2DB");

DB Connection 부분 설정 코드이다.

참고

https://heekng.tistory.com/32
https://go-coding.tistory.com/76
https://2-juhyun-2.tistory.com/638

0개의 댓글