자바를 이용해서 데이터베이스를 연동하는 프로그램을 작성하기 위해서는 먼저 몇 가지 필수적인 API와 용여들에 익숙해 질 필요가 있다.
java.sqlConnection
Connection 인터페이스는 데이터베이스와 네트워크상의 연결을 의미한다. 데이트베이스에 sql을 실행하기 위해서는 반드시 정상적인 connection타입의 객체를 생성해야 한다. 개발자들은 connection이라는 인터페이스를 활용하고 실제 구현 클래스는 jdbc 드라이버 파일 내부의 클래스를 이용한다.
jdbc프로그래밍에서 가장 중요한 사실은 'connection은 반드시 close()해야한다'.
데이터베이스는 많은 연결을 처리해야하는데 연결이 종료가 되지 않으면 새로운 연결을 받을 수 없는 상황이 발생한다. connection의 close()는 데이터베이스쪽에 연결을 끊어도 좋다는 신호를 주고 네트워크 연결을 종료하는 역할을 한다.
connection 종료를 위해서는 코드 내에서 try-catch-finally 를 이용해서 종료하거나 try-with-resources 방식을 이용한다.
(try-with-resources 를 이용하면 자동으로 close()가 호출되는것을 보장할 수 있다.)
Connection의 가장 중요한 기능은 statement 혹은 prepared-statment와 같이 sql을 실행할 수 있는 객체를 생성하는 기능이다.
java.sql.Statement/PreparedStatement
jdbc에서 sql을 데이터베이스로 보내기 위해서는 Statement/PreparedStatement 타입을 이용한다.
Statement/PreparedStatement 는 sql능 전달한다는 점에서 같지만 sql문을 미리 전달하고 나중에 데이터를 보내는 방식(PreparedStatement)과 sql문 내부에 모든 데이터를 같이 전송하는 방식(Statement)이라는 차이가 있다.
실제 개발에서는 PreparedeStatement만을 이용하는 것이 관례.
Satement/PreparedStatement에서 중요한 기능은 다음과 같다
-setXXX(): setint(),setString(), setDate()와 같이 다양한 타입에 맞게 데이터를 세팅할 수 있다.
-executeUpdate() :DML(insert/update/delete)을 실행하고 결과를 int타입으로 반환한다.결과는 '몇개의 행이 영향을 받았는가'이다.
예를 들어 1개의 데이터가 insert되었는지와 같은 결과를 알 수 있다.
-excuteQuery(): 쿼리를 실행할때 사용한다. excuteQuery()경우에는 ResultSet이라는 리턴 타입을 이용한다.
Statement 역시 마지막에는 Connection과 마찬가지로 close()를 통해서 종료해 주어야만 데이터베이스 내부에서도 메모리와 같이 사용했던 자원들이 즉각적으로 정리된다.
java.sql.ResultSet
PreparedStatement를 이용해서 insert/update/delete를 처리하는 DML의 경우에는 int로 반한되는 것과 달리 쿼리(select)를 실행했을때, 데이터베이스에서 반환하는 데이터를 읽어들이기 위해서는 특별하게 ResultSet이라는 인터페이스를 이용한다. ResultSet은 자바 코드에서 데이터를 읽어들이기 때문에 getInt(),getString()등의 메소드를 이용해서 필요한 타입으로 데이터를 읽어들인다.
ResultSet에는 next()라는 특별한 메소드가 존재한다. ResultSet은 데이터를 순차적으로 읽는 방식으로 구성되었다.
ResultSet 역시 네트워크를 통해서 데이터를 읽어들이기 때문에 작업이 끝난 후에는 반드시 close()를 해 주어야만 데이터베이스에서도 즉각적으로 자원을 회수시킨다.
Connection Pool과 DataSource
jdbc 프로그램은 기본적으로 필요한 순간에 잠깐 데이터베이스와 네트워크로 연결하고 데이터를 보내고 받는 방식으로 구성된다. 이 과정에서 데이터베이스와의 연결을 맺는 작업은 많은 시간과 자원을 쓰기 때문에 여러번 sql을 실행할수록 성능저하를 피할수 없다.
jdbc에서는 보통 connection pool이라는 것을 이용해서 이 문제를 해결한다.
connection pool은 미리 connection들을 생성해서 보관하고, 필요할 때마다 꺼내서 쓰는 방식이다. connection pool은 데이터베이스와 연결된 connection들을 보관하기 때문에 데이터베이스와 연결에 걸리는 시간과 자원을 절약할 수 있으므로 실제 운영되는 웹 서비스들은 connection pool을 기본적으로 사용한다.
DAO
DAO는 데이터를 전문적으로 처리하는 객체를 의미한다. 일반적으로 데이터베이스의 접근과 처리를 전담하는 객체를 의미하는데 DAO는 주로 VO단위로 처리한다. DAO를 호출하는 객체는 DAO가 내부에서 어떤식으로 데이터를 처리하는지 알 수 없도록 구성한다. 이떄문에 jdbc프로그램을 작성한다는 의미는 사실 DAO 를 작성한다는 의미이다.
VO(Value Object)혹은 Entity(엔티티)
객체지향 프로그램에서는 데이터를 객체라는 단위로 처리한다.
데이터베이스에서는 하나의 데이터를 엔티티라고 하는데 자바 프로그램에서는 이를 처리하기 위해서 테이블과 유사한 구조의 클래스를 만들어서 객체로 처리하는 방식을 사용한다. 이때 만든 객체는 '값을 보관하는 용도'라는 의미에서 VO(Value Object)라고 한다.
VO는 DTO와 유사한 모습이지만 DTO가 각 계층을 오고 가는데 사용되는 택배 상자와 비슷하다면 VO는 데이터베이스의 엔티티를 자바 객체로 표현한 것이라고 생각할 수 있다.
DTO는 getter/setter를 이용해서 자유롭게 데이터를 가공할 수 있는데 비해 VO는 주로 데이터 자체를 의미하기 때문에 getter만을 이용하는 경우가 대부분이다.
*DTO : 계층을 분리하는 경우에는 반드시 계층이나 객체들간에 데이터 교환이 이루어지게 된다. 이 경우 대부분은 한 개 이상의 데이터를 전달할 때가 많기 떄문에 여러 개의 데이터를 묶어서 하나의 객체로 전달하는것을 DTO(Data Transfer Object)라고한다
출저 : 자바 웹개발 워크북 P.114-117
'Study > 자바 웹 개발 워크북' 카테고리의 다른 글
| [웹 MVC와 JDBC의 결합] (0) | 2023.09.15 |
|---|---|
| [Your password does not satisfy the current policy requirements] (0) | 2023.09.03 |
| [데이터베이스 암호화 오류] (0) | 2023.09.03 |