티스토리 뷰
JDBC란?
Java DataBase Connectivity의 약어로 다양한 종류의 관계형 데이터베이스에 접속하고 SQL문을 수행하여 처리하고자 할 때 사용되는 표준 SQL 인터페이스 API이다. 즉, 자바에서 데이터베이스를 사용하는 절차에 대한 규약이다.
DBMS에 따라 DB를 다루는 방식이 다르다면, 사용자는 각 DBMS의 방식을 모두 알아야하기 때문에 필요한 지식이 너무 많습니다. 그래서 JDBC를 통해 추상화된 인터페이스를 제공하기만 하고, 데이터베이스의 종류에 상관없이 각 JDBC 드라이버를 통해 특정 DBMS를 사용할 수 있습니다.
JDBC Driver
실제 DB 관련 기능이 동작하려면 위에서 말한 인터페이스만으로는 작업할 수 없습니다. 따라서 java.sql의 인터페이스들을 상속받은 클래스 파일들이 필요합니다. MySQL의 경우 com.mysql에 해당 파일들이 모여있습니다. 윗단에서 추상화가 매우 잘되어있기 때문에 Datebase마다 다른 실제 구현 클래스들을 바꿔껴주기만 하면 어떤 데이터베이스이든 다룰 수 있습니다.
JDBC 사용방법
1. JDBC Driver 로딩
준비된 JDBC 드라이버 파일을 사용할 수 있도록 메모리에 로딩해야합니다. JDBC Driver를 메모리에 동적으로 로딩하기 위해서는 Class.forName()을 이용합니다. 인자값으로는 java.sql.Driver 인터페이스를 상속받은 Driver 클래스의 이름을 패키지 이름과 함께 명시해줘야 합니다. 해당 클래스가 동적으로 로딩이 될 때, JVM 메모리에 올라갑니다. 즉, 인스턴스가 생성되어 사용할 준비가 됐습니다.
Class.forName("com.mysql.jdbc.Driver");
2. DBMS 서버 접속
우선 DB 서버와의 연결을 해야합니다. java.sql 패키지에 있는 DriverManager 클래스의 getConnection() 메소드를 이용합니다. 실제 자바 프로그램과 데이터베이스를 네트워크 상에서 연결해주는 메소드이며 연결에 성공하면 DB와 연결된 상태를 Connection 객체로 반환합니다.
String url = "jdbc:mysql://127.0.0.1:3306/was?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8";
String user = "root";
String password = "password";
DriverManager.getConnection(url, user, password);
3. SQL문 실행
DriverManager.getConnection()을 통해 받은 Connection 객체를 이용해 DB 서버로 SQL문을 전송하고 처리 결과를 받아옵니다. SQL문을 실행하기위해 Statement 객체가 사용되고, 실행한 결과를 받아오기 위해 ResultSet 객체가 사용됩니다.
// C U D의 경우
Statement statement = connection.createStatement("insert into board values('email','password')");
statement.executeUpdate();
// R의 경우
Statement statement = connection.createStatement("select * from board");
ResultSet resultSet = statement.executeQuery();
Statement보다는 PreparedStatement 사용을 권장하는데 자세한 내용은 다음 포스트에서 다루겠습니다.
4. 실행결과 활용하기
쿼리 실행결과가 ResultSet에 담겨서 반환됩니다. ResultSet 객체는 내부적으로 위치를 나타내는 커서가 있습니다. next() 메소드는 커서 다음에 레코드가 있는지 판단하여 boolean값을 return해주고 커서를 다음 레코드로 이동시킵니다.
이를 활용하여 ResultSet으로부터 아래와 같이 데이터를 꺼낼 수 있습니다.
while (resultSet.next()) {
String email = resultSet.getString("email");
String password = resultSet.getString("password");
users.add(User.of(email, password));
}
5. 메모리 해제
작업을 완료했으면, 앞서 사용한 객체들을 모두 정리해주어야합니다. 정리를 하지않아도 GC로 인해 알아서 정리되지만, GC가 빈번하게 일어나는 것은 성능면에서 매우 안좋습니다. (Full GC의 경우 모든 쓰레드가 잠시 멈추기 때문)
connection.close();
resultSet.close();
statement.close();
위와 같이 일일이 close하는 방법이 있지만 아래와 같이 try-with-resource를 사용해 자동으로 자원을 정리할 수 있습니다.
try(Connection connection = DriverManager.getConnection();
Statement statement = connection.create("select * from users");
ResultSet resultset = statement.executeQuery();
) {
...
}
ResultSet, Statement, Connection 모두 AutoCloseable 클래스를 상속받기 때문에 try문이 끝나고 자동으로 close() 메서드를 각각 호출해줍니다.
'Java' 카테고리의 다른 글
[Java] orElse와 orElseGet의 차이 (0) | 2023.11.21 |
---|---|
[Java] Socket 통신 개념과 활용 (0) | 2023.01.09 |