JDBC의 등장배경
애플리케이션 서버에서 DB에 접근하기 위해선 여러 작업이 필요하다
우선 DB에 연결하기 위해 커넥션을 연결해야하고
SQL을 작성한 후 커넥션을 통해 SQL을 요청한다.
그 다음 요청한 SQL에 대한 결과를 응답 받는다.
하지만 우리가 쓰던 MySQL서버에서 PostgreSQL서버로 변경한다면 각 서버마다 연결 방법, SQL요청하는 방법, 결과를 응답받는 방법 모두 다를 수 있기 때문에 애플리케이션 서버에서 바뀌는 DB서버에 따라 모든 로직을 수정해야한다.
이러한 문제를 해결하기 위해 JDBC 표준 인터페이스가 등장했다.
JDBC는 DB에 접근할 수 있도록 Java에서 제공하는 API이다.
JDBC에 연결해야하는 DB의 JDBC 드라이버를 제공하면 DB 연결 로직을 변경할 필요없이 DB변경이 가능하다.
여러 DB회사들은 자신의 DB에 맞도록 JDBC인터페이스를 구현하 후 라이브러리로 제공하는데 이를 JDBC드라이버라 부른다.
따라서 DB를 교체할 때 JDBC 드라이버만 변경하면 손쉽게 DB 변경이 가능하다.
JDBCTemplate 사용방법
비록 JDBC의 등장으로 손쉽게 DB교체가 가능해졌지만 아직 DB에 연결하기 위해 여러가지 작업 로직들을 직접 작성해야한다는 불편함이 남아있는데 커넥션 연결, statement 준비 및 실행, 커넥션 종료 등 반복적인 작업들을 대신 처리해주는 JDBCTemplate이 등장하였다.
application.properties에 DB에 접근하기 위한 정보를 작성합니다.
spring.datasource.url=jdbc:mysql://localhost:3306/memo
spring.datasource.username=root
spring.datasource.password={비밀번호}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
build.gradle에 JDBC 라이브러리와 MySQL을 등록합니다.
// MySQL
implementation 'mysql:mysql-connector-java:8.0.28'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
1. 인텔리제이 우측 DataBase탭을 클릭하고 +버튼을 누른 뒤
2. Data Source에서 MySQL 클릭 ( 사진의 경우 최근 사용하여서 위에 위치하였고 처음 사용하는 경우 아래 목록에 있다.)
3.User에 root입력, 기존에 설정한 MySQL비밀번호 입력 후 DataBase에 자신의 DataBase명 입력한 뒤 Test Connection클릭하면 가능한지 테스트 해볼 수 있다. 테스트 후 OK버튼을 누르면 MySQL연결이 완료된다.
DB연동이 완료되면 DB연결이 필요한 곳에서 JdbcTemplate을 주입받아와 사용한다.
private final JdbcTemplate jdbctemplate;
public MemoRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
INSERT
String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
jdbcTemplate.update(sql, "Robbie", "오늘 하루도 화이팅!");
UPDATE
String sql = "UPDATE memo SET username = ? WHERE id = ?";
jdbcTemplate.update(sql, "Robbert", 1);
DELETE
String sql = "DELETE FROM memo WHERE id = ?";
jdbcTemplate.update(sql, 1);
SELECT
String sql = "SELECT * FROM memo";
return jdbcTemplate.query(sql, new RowMapper<MemoResponseDto>() {
@Override
public MemoResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException {
// SQL 의 결과로 받아온 Memo 데이터들을 MemoResponseDto 타입으로 변환해줄 메서드
Long id = rs.getLong("id");
String username = rs.getString("username");
String contents = rs.getString("contents");
return new MemoResponseDto(id, username, contents);
}
});
SELECT의 경우 결과가 여러줄로 넘어오기 때문에 RowMapper를 사용하여 한줄 씩 처리할 수 있다.
물론 JDBC를 사용하여 직접 DB에 연동하고 SQL문을 요청하는데 있어서 편리함을 얻을 수 있었지만
아직 직접 SQL문을 String 변수에 저장하고 메소드를 호출하는 번거로움이 있다.
또 아직 SQL에 의존적이라 변경에 취약하다.
예를 들어 컬럼이 추가된다면 SQL을 직접 수정하고 DTO객체에 값을 넣어주는 부분도 추가해주어야한다.
다행히 JPA라는 Java의 DB와 객체를 매핑하여 소통하는 ORM기술이 등장하여 매우 편리하게 DB의 테이블을 만들거나 SQL문을 작설할 수 있다.
'백엔드(Back End) > Spring' 카테고리의 다른 글
[TIL]20230628 - Spring Security, Spring Ec2 배포 (0) | 2023.06.29 |
---|---|
[TIL]20230626 - 간단한 과제를 만들며 JPA Auditing기능 사용 (0) | 2023.06.27 |
[Spring] HTTP 데이터를 객체로 처리하는 방법 Model Attribute와 Request Body (0) | 2023.06.26 |
[Spring] HTTP 데이터를 변수로 처리하는 방법 Path Variable과 Request Param (0) | 2023.06.26 |
[TIL]20230624 - Spring Controller가 데이터를 반환하는 방법 (0) | 2023.06.25 |