2024. 8. 24. 22:08ㆍ자바 웹 개발/웹 데이터베이스
JDBC 드라이버를 입력하기 위해 gradle 설정에 추가해준다. JDBC 프로그램은 네트워크를 통해서 데이터베이스와 연결을 맺고, SQL을 전달해서 이를 실행하도록 한다.
dependencies {
compileOnly('jakarta.servlet:jakarta.servlet-api:6.0.0')
testImplementation("org.junit.jupiter:junit-jupiter-api:${junitVersion}")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junitVersion}")
// https://mvnrepository.com/artifact/com.mysql/mysql-connector-j
implementation group: 'com.mysql', name: 'mysql-connector-j', version: '9.0.0'
// https://mvnrepository.com/artifact/org.projectlombok/lombok
compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.34'
//HikariCP
compileOnly('javax.servlet:javax.servlet-api:4.0.1')
implementation group: 'com.zaxxer', name: 'HikariCP', version:'5.0.0'
}
작성 순서는 다음과 같다.
1. 데이터베이스와 연결
2. SQL을 작성하고 전송
3. 필요하다면 데이터베이스가 보낸 결과를 받아 처리
4. 연결 종료
인텔리제이 DB 연결
인텔리제이 얼티메이트는 Database 메뉴를 이용해서 프로젝트에서 사용할 데이터베이스를 설정해서 사용할 수 있다. 자신에게 맞는 데이터베이스를 선택하면 된다.
테스트 프로그램 작성하기
실행 가능 여부를 확인하기 위해 ConnectTests를 만든다.
MySQL이라면 연결 코드는 다음과 같다.
public class ConnectTests {
@Test
public void testConnection() throws SQLException {
// MySQL JDBC 드라이버 이름
String jdbcDriver = "com.mysql.cj.jdbc.Driver";
// MySQL 데이터베이스 URL
String dbUrl = "jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC";
// 데이터베이스 사용자 이름과 비밀번호
String username = "your_username";
String password = "your_password";
Connection connection = null;
try {
// JDBC 드라이버 로드
Class.forName(jdbcDriver);
// 데이터베이스 연결 생성
connection = DriverManager.getConnection(dbUrl, username, password);
System.out.println("Database connected successfully!");
// 여기에서 데이터베이스 작업을 수행할 수 있습니다.
} catch (ClassNotFoundException e) {
System.out.println("JDBC Driver not found: " + e.getMessage());
} catch (SQLException e) {
System.out.println("Database connection failed: " + e.getMessage());
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
@Test 어노테이션은 반드시 public으로 선언하고 파라미터나 리턴타입이 없이 작성해야한다. 이를 통해 테스트가 가능하다. 실행하여 다음과 같이 나오면 성공이다.
테이블 생성
데이터베이스에서 데이터를 저장하기 위해 테이블이 존재해야한다. 다음과 같이 작성한다.
create table tbl_todo(
tno int auto_increment primary key ,
title varchar(100) not null,
dueDate date not null,
finished tinyint default 0
);
테스트용으로 데이터를 입력해보면 입력된 내용을 확인할 수 있다.
insert into tbl_todo(title, dueDate, finished)
values('테스트', '2024-08-24', 1)
TodoVO 클래스 작성
tbl_todo 테이블 데이터를 자바 객체로 처리하기 위해서는 유사한 구조의 TodoVO 클래스와 객체를 이용한다. lombok으로 인해 간단하게 생성할 수 있다.
@Getter
@Builder
@ToString
public class TodoVO {
private Long tno;
private String title;
private LocalDate dueDate;
private boolean finished;
}
Connection Pool 이용하기
기존의 ConnectTests를 이용하여 테스트를 해보자. 기존과 크게 다르지 않아보이지만 콘솔에 HikariCP가 연결되었음을 확인할 수 있다.
public class ConnectTests {
@Test
public void testHikariCP() throws Exception {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/webdb");
config.setUsername("root");
config.setPassword("root");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
HikariDataSource ds = new HikariDataSource(config);
Connection conn = ds.getConnection();
System.out.println(conn);
conn.close();
}
}
TodoDAO로 HikariCP 이용
SQL 처리를 전담하는 TodoDAO를 구성하고 필요한 작업을 수행할 때 이용할 ConnectionUtil 클래스를 만든다.
public enum ConnectionUtil {
INSTANCE;
private HikariDataSource ds;
ConnectionUtil(){
HikariConfig config = new HikariConfig();
config.setDriverClassName("com.mysql.jdbc.Driver");
config.setJdbcUrl("jdbc:mysql://localhost:3306/webdb");
config.setUsername("root");
config.setPassword("root");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
ds = new HikariDataSource(config);
}
public Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
ConnectionUtil는 싱글톤으로 getConnection을 통해서만 접근이 가능하다.
public class TodoDAO {
public String getTime(){
String now = null;
try(Connection connection = ConnectionUtil.INSTANCE.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("select now()");
ResultSet resultSet = preparedStatement.executeQuery();
){
resultSet.next();
now = resultSet.getString(1);
} catch(Exception e){
e.printStackTrace();
}
return now;
}
}
ConnectionUtil을 이용하여 시간을 구하는 코드를 작성하였다. 이 코드를 테스트해보자. try-with-resources 기능을 이용하여 try 내의 선언된 변수가 자동으로 close할 수 있도록 작성되었다.
public class TodoDAOTests {
private TodoDAO todoDAO;
@BeforeEach
public void ready() {
todoDAO = new TodoDAO();
}
@Test
public void testTime() throws Exception {
System.out.println(todoDAO.getTime());
}
}
@BeforeEach를 통해 모든 테스트 전에 객체를 생성하도록 한다. 그리고 이 객체를 통해 getTime() 작동 여부를 확인한다.
try-with-resource는 가독성이 나빠질 수 있기 때문에 @Cleanup을 이용하는 것이 좋다. 메서드 선언부에 throws가 추가된 것만 다르다.
public String getTime2() throws Exception{
@Cleanup Connection connection = ConnectionUtil.INSTANCE.getConnection();
@Cleanup PreparedStatement preparedStatement = connection.prepareStatement("select now()");
@Cleanup ResultSet resultSet = preparedStatement.executeQuery();
resultSet.next();
String now = resultSet.getString(1);
return now;
}
}
'자바 웹 개발 > 웹 데이터베이스' 카테고리의 다른 글
[Web] DataSource를 이용해 데이터베이스 연동하기 (0) | 2024.08.20 |
---|---|
[Web] 데이터베이스 연동 (0) | 2024.08.19 |