JDBC란?
Java DataBase Connectivity: 자바에서 DB 프로그래밍을 하기 위해 사용되는 API로 메소드 호출용 SQL 인터페이스를 지원한다.
서버와 DB 사이에 커넥션 연결 방법, SQL 전달 방법, 결과 응답을 받는 방법이 모두 다르기 때문에 데이터베이스 변경을 하는 경우 문제가 생길 수 있다. 이러한 방식을 해결할 수 있는 것이 자바 표준인 JDBC다. 데이터베이스에 맞는 JDBC 드라이버를 사용할 수 있다. (JDBC Driver <Oracle>, JDBC Driver <MySQL> 등)
표준 인터페이스
3가지 기능을 표준 인터페이스로 정의하여 제공한다. 이 인터페이스를 구현하여 제공하는 라이브러리가 JDBC Driver다.
- Connection (연결)
- Statement (SQL 전달)
- ResultSet (결과 응답)
// Post 테이블을 Entity 객체로 생성 (getter/setter 생략)
@Table(name = "post") // 매핑할 테이블 지정
public class Post {
@Id // 기본키 지정
@GeneratedValue(strategy = GenerationType.IDENTITY) // 기본키 값에 대한 생성 전략 지정
private Long id;
private String title;
private String content;
}
// JDBC API를 이용한 게시글 저장 구현
public Post save(Post post) {
String sql = "INSERT INTO post(title, content) values(?, ?)";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DataSourceUtils.getConnection(dataSource);
pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, post.getTitle());
pstmt.setString(2, post.getContent());
pstmt.executeUpdate();
rs = pstmt.getGeneratedKeys();
if (rs.next()) {
post.setId(rs.getLong(1));
} else {
throw new SQLException("get data by id is fail");
}
return post;
} catch (Exception e) {
throw new IllegalStateException(e);
} finally {
close(conn, pstmt, rs);
}
}
+ Entity: 테이블을 그대로 객체로 만든 것
JdbcTemplate
Spring에서 개발자가 JDBC를 쉽게 사용할 수 있도록 도와주는 클래스
JDBC API를 사용할 때 요청 시 다음 과정이 진행되는데, 실제 쿼리를 요청하는 부분 외에 구조적인 반복이 심하다는 문제점이 있다.
- try-catch 문 생성
- Connection 획득/종료
- Statement 준비/실행/종료
- 결과를 가져오기 위한 ResultSet 생성
- 예외처리
JdbcTemplate를 사용할 경우 위 반복을 내부적으로 처리해주고, 작업의 목적을 분명하게 만들 수 있다.
반복되는 코드를 대부분 제거 후 SQL만 작성해주면 된다.
JdbcTemplate 사용의 장점
#1 구조적인 반복 해결
1. JDBC API 사용
public void findData() throws SQLException {
Connection connection = null
PreparedStatement pstmt = null;
try {
connection = dataSource.getConnection();
pstmt = connection.prepareStatement("SELECT * FROM myTable");
pstmt.execute();
} catch (SQLException e) {
// 예외처리
} finally {
// 자원반납
if (pstmt != null) pstmt.close();
if (connection != null) connection.close();
}
}
2. JdbcTemplate 사용
public void create() {
jdbcTemplate.execute("SELECT * FROM myTable");
}
#2 Transaction 처리
1. JDBC API 사용
public Post save(Post post) throws SQLException {
String sql = "INSERT INTO post(title, content) values(?, ?)";
Connection conn = null;
conn.setAutoCommit(false);
...
conn.commit();
...
}
JDBC API에서 트랜잭션을 사용하기 위해서는 (1) Auto commit 설정 해제 (2) Commit을 위한 추가 코드가 필요하다.
2. JdbcTemplate 사용
@Transactional
public Post save(Post post) {
...
}
JdbcTemplate를 사용할 경우에는 @Transactional을 이용하여 처리할 수 있다.
Commit?
저장되지 않은 모든 데이터를 데이터베이스에 저장하고 현재의 트랜잭션을 종료하라는 명령이다.
Transaction?
하나의 그룹으로 처리되어야 하는 명령문들을 모아놓은 논리적인 작업 단위.
데이터베이스를 수정하는 도중에 예외가 발생되었을 경우 이전 상태로 롤백하기 위해 사용되는 것으로, 더 이상 쪼갤 수 없는 최소 작업 단위를 의미한다.
#2 자바 객체로 매핑
1. JDBC API 사용
pstmt = connection.prepareStatement("SELECT * FROM post");
rs = pstmt.executeQuery();
if (rs.next()) {
Post post = new Post(
rs.getInt("id"),
rs.getString("title")
...
);
}
JDBC API의 경우 ResultSet에서 컬럼을 꺼내고 직접 매핑하는 작업이 필요하다.
2. JdbcTemplate 사용
List<Post> posts = jdbcTemplate.query("SELECT * FROM post",
(resultSet, i) -> new Post(
resultSet.getInt("id"),
resultSet.getString("title")
));
맵퍼를 이용해 객체 생성이 가능하다.
JdbcTemplate를 이용한 데이터 다루기
// 게시글 저장
public int save(Post post) {
String sql = "INSERT INTO post(title, content) values(?, ?)";
int result = jdbcTemplate.update(sql, post.getTitle(), post.getContent());
return result;
}
// 게시글 조회
public List<Post> get() {
String sql = "SELECT * FROM post";
return jdbcTemplate.query(sql, (rs, rowNum) -> {
Post post = new Post();
post.setId(rs.getLong("id"));
post.setTitle(rs.getString("title"));
post.setContent(rs.getString("content"));
return post;
})
}
JdbcTemplate CRUD에 사용되는 메서드
CREATE | update SimpleJdbcInsert |
READ | query : 결과 다수 queryForObject : 결과 0개 or 1개 |
UPDATE | update |
DELETE | update |
'Backend > Spring' 카테고리의 다른 글
[Spring] IoC 컨테이너와 의존성 주입 방법 (0) | 2024.05.17 |
---|---|
[Spring] 주요 개념 총정리 (0) | 2024.04.18 |
[Spring] JPA 연관관계 매핑 (0) | 2024.04.12 |
[Spring] REST API (0) | 2024.04.07 |