관련 내용
<Spring DB를 사용하기 위한 JDBC, Connection 기초>
- JDBC 기술이 어떤 역할을 하는 지, 커넥션은 어떻게 획득하는 지, SQL 쿼리와 JDBC 사용법은 어떻게 되는지에 대한 설명
[백엔드/스프링] - 스프링 DB 사용을 위한 JDBC에 대한 이해와 사용 방법
- 커넥션 풀에 대한 이해와, DataSource 인터페이스를 사용한, 커넥션 얻어오기 통일화 방법
[백엔드/스프링] - ConnectionPool에 대한 이해와 DataSource 인터페이스로 커넥션을 획득하는 방법 통일하기
개요와 목적
이번 글에서는 자바의 JDBC 기술과 MySQL을 사용해서, 텍스트 기능을 하는 API를 만들어 보려고 한다.
- DB에 Id 별텍스트 작성하기(write)
- DB Id 별텍스트 조회하기(read)
- DB Id 별 텍스트 업데이트하기(update)
- DB Id 별 텍스트 삭제하기(delete)
개발 환경
- SpringBoot(gradle) - 2.7.3
- mysql-connector-java - 8.0.28
JDBC - DB 커넥션 획득 방법
Spring Server와 MySQL을 연결하기 위해서는 MySQL의 커넥션을 획득해야 한다. 이번에는 JDBC 인터페이스 기술의 DriverManager 클래스를 사용해서, 커넥션을 획득해보자.
SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\repository\JdbcStringRepository.java
@Repository
@RequiredArgsConstructor
public class JdbcStringRepository {
public Connection connectJdbc() throws SQLException {
String url = "jdbc:mysql://127.0.0.3:3306/jdbc";
String username = "hwang";
String password = "5510";
return DriverManager.getConnection(url
, username
, password);
}
}
드라이버 매니저에 URL과 USERNAME, PASSWORD를 넣으면 URL 규칙에 따라 데이터 베이스 드라이버를 선택해서 데이터 드라이버가 작동하여 해당 DB의 커넥션을 가져와 반납한다. 해당 커넥션을 통해서 SQL 쿼리를 보내는 방식으로 DB와 소통할 수 있다.
JDBC - SQL 쿼리를 사용한 CRUD 기능 구현
텍스트 추가하기
DB에 아이디 별 텍스트를 추가하기 위해 아래 URL로 요청을 하게 되면 리포지토리의 save메소드가 실행된다.
SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\controller\TextController.java
@PostMapping("/api/text/{textId}")
SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\repository\JdbcStringRepository.java
public void save(Connection connection, String textId, String messageBody) {
String sql = "INSERT INTO storage (txt_id, message) VALUES(?,?)";
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setString(1, textId);
preparedStatement.setString(2, messageBody);
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
PreparedStatement 는 Statement 의 자식 타입인데, ? 를 통한 파라미터 바인딩을 가능하게 해준다.
pstmt.executeUpdate()를 통해서, 준비 된 SQL을 커넥션을 통해 데이터 베이스에 전달한다.
텍스트 조회하기
DB에 아이디 별 텍스트를 확인하기 위해 아래 URL로 요청을 하게 되면 리포지토리의 findByTextId 메소드가 실행된다.
SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\controller\TextController.java
@GetMapping("/api/text/{textId}")
SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\repository\JdbcStringRepository.java
public StorageDto findByTextId(Connection connection, String textId) {
String sql = "SELECT * FROM storage WHERE txt_id=?";
StorageDto storageDto = null;
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setString(1, textId);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
String id = resultSet.getString(2);
String message = resultSet.getString(3);
storageDto = new StorageDto(id, message);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return storageDto;
}
텍스트 추가와 다르게, preparedStatement.executeQuery()를 통해서, 해당 조건에 해당하는 컬럼의 정보를 담은 ResultSet을 가져온다.
그리고 resultSet의 진짜 데이터가 담겨 있는 두 번째 커서로 이동한 후에, 정보를 dto에 담아 전달한다.
텍스트 업데이트 하기
DB에 아이디 별 텍스트를 업데이트 위해 아래 URL로 요청을 하게 되면 리포지토리의 update메소드가 실행된다.
SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\controller\TextController.java
@PutMapping("/api/text/{textId}")
SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\repository\JdbcStringRepository.java
public void update(Connection connection, String textId, String messageBody) {
String sql = "UPDATE storage SET message=? WHERE txt_id=?";
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setString(1, messageBody);
preparedStatement.setString(2, textId);
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
sql 쿼리에 UPDATE 와 txt_id 조건을 지정하고 excuteUpdate로 쿼리를 DB에 보낸다.
텍스트 삭제 하기
DB에 아이디 별 텍스트를 삭제 위해 아래 URL로 요청을 하게 되면 리포지토리의 delete메소드가 실행된다.
SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\controller\TextController.java
@DeleteMapping("/api/text/{textId}")
SpringHTTPServer\src\main\java\com\example\springhttpserver\HTTPServer\repository\JdbcStringRepository.java
public void delete(Connection connection, String textId) {
String sql = "DELETE FROM storage WHERE txt_id=?";
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setString(1, textId);
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
sql 쿼리에 DELETE와 조건을 지정해서 excuteUpdate로 DB에게 보낸다.
'Web Sever 개발과 CS 기초 > 스프링' 카테고리의 다른 글
JDBC를 사용한 Trasaction 처리와 이해 (0) | 2023.04.25 |
---|---|
ConnectionPool에 대한 이해와 DataSource 인터페이스로 커넥션을 획득하는 방법 통일하기 (0) | 2023.04.13 |
스프링 DB 사용을 위한 JDBC에 대한 이해와 사용 방법 (0) | 2023.04.13 |
Spring Security와 JWT 토큰을 이용하여 REST API 인증,인가 구현하기 (0) | 2023.03.07 |
Spring Proxy가 아닌 방법으로 AOP 구현 방법 (0) | 2023.01.15 |