1. JDBC
- JDBC 란?
JDBC 는 Java Database Connectivity 의 줄임말로, DB 에 접근할 수 있도록 자바에서 제공하는 자바 표준 SQL 인터페이스 API 이다. 다양한 종류의 RDBMS 에 접속하고 SQL 문을 수행하여 처리하는 작업을 할 때 사용된다.
JDBC 를 통한 자바 애플리케이션과 DB 의 구조는 다음과 같다.
자바 애플리케이션 - JDBC API - JDBC Driver - Database
JDBC 는 인터페이스 API 이기 때문에, 각 DBMS 에 맞는 JDBC 드라이버를 설정해주어야 한다. JDBC 드라이버는 실제 DBMS 와 통신을 수행하는 자바 클래스로 jar 파일로 제공됩니다. JDBC 드라이버는 DBMS url 과 계정 정보 등을 입력받아서 DB 연결 객체를 생성하고 이를 통해서 DB 와 연결을 수행합니다.
Spring 을 사용하지 않는 경우에는 DriverManager 를 통해서 직접 DB 정보와 계정 정보 등을 설정해주고 연결을 맺어야 하지만 Spring 에서는 application.properties 에서 DataSource 의 설정을 통해서 DB 연결 정보를 설정할 수 있다.
- JDBC 설정 및 사용
Build.gradle 에 jdbc 라이브러리 의존성 추가와 application.properties 에 사용할 database 정보를 datasource 에 설정해준다.
자세한 내용은 1편에 추가되어 있으니 생략한다.
- 1편 링크: https://jammdev.tistory.com/194
- JDBC 구현
JDBC 를 사용하여 DB 와 연결하고 User 라는 객체를 다루는 예제 코드이다.
appcation.properties 에 설정한 값으로 설정된 DataSource 에서 Connection 을 얻고, PreparedStatement 를 통해 쿼리문을 작성한다. 작성한 쿼리문을 실행하여서 Database 작업을 수행한다.
@Repository("JdbcUserRepository")
public class JdbcUserRepository implements UserRepository {
@Autowired
private DataSource dataSource;
private Connection getConnection() {
return DataSourceUtils.getConnection(dataSource);
}
private void close(AutoCloseable ... objs) {
try {
for(AutoCloseable obj : objs) {
obj.close();
}
} catch(Exception e)
e.printStackTrace();
}
}
@Override
public void saveUser(User user) {
String sql = String.format("INSERT INTO %s VALUES (?, ?)", TABLE);
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user.getId());
pstmt.setString(2, user.getName());
pstmt.executeUpdate();
} catch (Exception e) {
throw new IllegalStateException(e);
} finally {
close(conn, pstmt);
}
}
@Override
public List<User> findAllUsers() {
String sql = String.format("SELECT * FROM %s", TABLE);
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
List<User> users = new ArrayList<>();
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
User user = new User(rs.getString("id"), rs.getString("name"));
users.add(user);
}
} catch (Exception e) {
throw new IllegalStateException(e);
} finally {
close(conn, pstmt, rs);
}
return users;
}
@Override
public User findById(String id) {
String sql = String.format("SELECT * FROM %s WHERE ID=?", TABLE);
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
User user = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if(rs.next()) user = new User(rs.getString("id"), rs.getString("name"));
else throw new SQLException(String.format("No matching id. id=%s", id));
} catch (Exception e) {
throw new IllegalStateException(e);
} finally {
close(conn, pstmt, rs);
}
return user;
}
@Override
public void updateUser(User user) {
String sql = String.format("UPDATE %s SET NAME=? WHERE ID=?", TABLE);
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user.getName());
pstmt.setString(2, user.getId());
pstmt.executeUpdate();
} catch (Exception e) {
throw new IllegalStateException(e);
} finally {
close(conn, pstmt);
}
}
@Override
public void removeUser(String id) {
String sql = String.format("DELETE FROM %s WHERE ID=?", TABLE);
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.executeUpdate();
} catch (Exception e) {
throw new IllegalStateException(e);
} finally {
close(conn, pstmt);
}
}
}
위의 예제는 User 라는 객체를 읽고, 쓰고, 수정하고, 삭제하는 기본 DML 작업을 수행하는 메서드들을 구현한 예제이다.
connection 과 preparedStatement 와 같은 자원들은 사용이 끝나면 close 해준다.
[Reference]
'Tech > Spring | SpringBoot' 카테고리의 다른 글
[SpringBoot] Logging - 1 (JCL, Slf4j, logback, log4j, log4j2) (0) | 2022.10.01 |
---|---|
[SpringBoot] Database 연동 - 3 (JdbcTemplate) (1) | 2022.09.21 |
[SpringBoot] Database 연동 - 1 (DataSource, h2 database) (0) | 2022.09.13 |
[Spring] Spring MVC (0) | 2022.09.05 |
[Spring] @Controller vs @RestController (0) | 2022.08.30 |