본문 바로가기

KOSTA : 클라우드 네이티브 애플리케이션 개발 전문가 양성과정

05/17 24일차 PreparedStatment, DBCPool

728x90

전날 Summurize

- JDBC 정리

 

-코드 잘 만들었나 확인하는 방법 : 

메소드를 만들고, 추가 코드가 필요하다면?? 잘못만든 코드입니다. 

새로운 기능이 들어왔을때 유연해야합니다.

 

- Statement 인터페이스인 이유

- 모든 드라이버들은 java랑 연결하려면 전부다 java 인터페이스들을 부모로 두고 있습니다.

- 오버라이딩하라는 이유는 각 DB 함수는 똑같고 세부사항들만 달라지기 때문입니다.

- 우린 사용할때 connection에 드라이버만 바꿔서 사용하면 됩니다.

 

oracle.jdbc.OracleConnection

- 인터페이스 Connection을 상속하였습니다.

- 오라클만의 Connection을 오버라이딩하여 만들었습니다.

 

PreparedStatment vs Statement

public interface Connection{

  public abstract PreparedStatment prepareStatement(String sql);

  public abstract Statement createStatement();

}

 

 - Statement는 executeUpdate()에 sql이 들어갑니다.

- 바인딩이 안됩니다. 하드코딩을 해아합니다.

- PreparedStatment는 동적으로 바인딩이 됩니다.

- pre 미리 sql을 준비합니다.

- prepareStatemnet 사전에 컴파일됩니다.

- DB는 컴파일없이 바로 실행합니다

- Statement 실행시점에 컴파일 합니다.

- 캐싱 기능(재사용이 가능합니다)

- Statement는 DDL에 이용되고, prestateMent DML에 이용됩니다.

- 둘이 헷갈리면 걍 prepareStatement를 쓰자

- ORM이 바인딩방식으로 쓰입니다.

 

 

DBCpool

 

 

- 쿼리 처리할때마다 준비 작업들이 많습니다.

- 커넥션을 빌려주고, 없으면 대기 시간을 줍니다. 데이터베이스 사양에 맞게 pool의 갯수를 조절해야 합니다.

- application과 DB를 위한 인터페이스(접점) 입니다.

- data Source를 통해서야만 pool에 들어갈 수 있습니다.

- 떼거리로 만들어놓고, DB로 들어가지 않고 pool에서 해결합니다.

- 데이터소스가 드라이버와 연결해서 DB로 들어간다.

- WAS에서 커넥션풀을 크게 설정하면 메모리 소모가 큰 대신 많은 사용자가 대기 시간이 줄어들고, 반대로 적게 설정하면 대기 시간이 길어지게 됩니다. 사용량에 따라서 적당한 커넥션 객체를 생성해두어야 합니다.

 

DBCPool이 필요한 이유

- JDBC API를 이용하여 DB에 연결하기 위해 (a)Connection 객체를 생성하는 작업은 비용이 굉장히 많이 듭니다.

 

(a) Connecion 객체 생성 작업

- 어플리케이션에서 DB드리이버를 통해 커넥션을 조회합니다.

- DB 드라이버는 DB와 TCP/IP 커넥션을 연결합니다. (3-way handshake 같은 네트워크 연결 동작 발생)

- DB 드라이버는 TCP/IP 컨넥션이 연결되면 아이디,패스워드,기타정보를 DB에 전달합니다.

- DB는 아이디, 패스워드 인증을 거친 후 내부에 DB를 생성합니다.

- DB는 커넥션 생성이 완료되었다는 응답을 보냅니다.

- DB 드라이버는 커넥션 객체를 생성하여 클라이언트에 반환합니다.

 

- 이러한 문제를 해결하기 위해 애플리케이션 로딩에 Connection 객체를 미리 생성하고, 애플리케이션에서 DB 연결이 필요한 경우 미리 준비된 Connection 객체를 사용하여 애플리케이션의 성능을 향상시킵니다.

 

 

 

 

 

DAO

-DB에 드나드는 객체이고, DTO에 값을 담습니다.

- DAO에서 데이터소스를 거쳐서 드라이버로 갑니다. pool을 거치게 됩니다.

- Interface ConnectionPoolDataSource를 구현해서 다양한 DB 연결 메서드를 만들었습니다.