- 02 Spring JDBC
- JDBC API를 사용했을 때 불편한 부분
- 반복되는 코드
- 연결부터 자원의 반납까지 모든 부분의 관리 필요
- 예외처리로 인해서 코드 복잡도 상승
- Jdbc Template
- JDBC 코어 패키지의 중앙 클래스
- JDBC와 같은 라이브러리로 사용 가능
- implementation ‘org.springframework.boot:spring-boot-starter-jdbc’
- Spring 에서 개발자가 JDBC를 쉽게 사용할 수 있도록 도와주는 클래스
- JDBC Template 을 사용하면 해결되는 부분
- 구조적인 반복 해결
- 손쉬운 Transaction 처리
- 쉽게 자바 객체로 매핑 가능
- 구조적인 반복을 해결
- JDBC API를 사용할 때 요청 시 다음 과정이 진행된다.
- try-catch 문 생성
- Connection 획득 / 종료
- Statement 준비 / 실행 / 종료
- 결과를 가져오기 위한 ResultSet 생성
- 예외처리
- 실제 쿼리를 요청하는 부분 외에 구조적인 반복이 심하다는 문제점이 있다.
- JdbcTemplate를 사용할 경우 위 반복을 내부적으로 처리해주고 작업의 목적을 분명하게 만들 수 있다.
- 04 Jdbc Template 이란
publicvoidfindData()throwsSQLException { Connection connection =null; PreparedStatement stmt =null; try{ // 데이터베이스 연결 획득 connection = dataSource.getConnection(); // SQL 쿼리를 준비 stmt = connection.prepareStatement("SELECT * FROM mytable"); // 쿼리 실행 stmt.execute(); // 결과 처리 (필요한 경우) }catch(SQLException e) { // SQL 예외 처리 e.printStackTrace(); }finally{ // 자원 해제 (close) if(stmt !=null) { stmt.close(); } if(connection !=null) { connection.close(); } } } |
- < JDBC API > 만을 사용한 코드 , 구조적인 반복이 있다.
publicvoidretrieveData() { // jdbcTemplate을 사용하여 데이터베이스에서 모든 데이터를 조회하는 메서드 jdbcTemplate.query("SELECT * FROM mytable"); } |
- <Jdbc Template > 을 사용한 코드 구조적 반복이 해결되었다.
- 손 쉬운 Transaction 처리
- Auto commit 설정 해제
- Commit을 위한 코드 추가 필요
- JDBC API 에서 트랜잭션을 사용하기 위해서는 다음 사항들이 추가적으로 요구됩니다.
- Jdbc Template을 사용할 경우에는 @Transactional을 이용하여 트랜잭션 처리가능
*commit : 저장되지 않은 모든 데이터를 데이터베이스에 저장하고 현재의 트랜잭션을 종료하라는 명령
*Transaction: 하나의 그룹으로 처리되야하는 명령문들을 모아 놓은 논리적인 작업 단위
- 쉽게 자바 객체로 매핑 가능
- JDBC API 를 사용할 때는 ResultSet에서 컬럼을 꺼내고 직접 매핑하는 작업이 필요했습니다.
stmt = connection.prepareStatement("SELECT * FROM post"); ResultSet rs = stmt.executeQuery(); if(rs.next()) { Post post =newPost( rs.getInt("id"), rs.getString("title") . . . ); } |
- Jdbc Template를 사용하면 맵퍼를 이용해 객체 생성이 가능합니다.
List<Post> posts = jdbcTemplate.query("SELECT * FROM post", (resultSet, i) ->newPost( resultSet.getInt("id"), resultSet.getString("title") )); |
- [ 퀴즈 ] Jdbc Template의 이점이 아닌 것
JdbcTemplate의 이점은 다음과 같습니다.
1. 구조적인 반복 해결: JdbcTemplate은 반복적인 JDBC 코드 작성을 줄여줍니다.
JdbcTemplate은 반복적인 작업(커넥션 생성, Statement 생성, ResultSet 처리 등)을 자동으로
처리하여 개발자가 직접 처리해야 하는 반복적인 코드를 줄여줍니다.
2. 손쉬운 Transaction 처리: JdbcTemplate은 트랜잭션 관리를 간편하게 처리할 수 있도록
지원합니다. 트랜잭션의 시작, 커밋, 를백을 명시적으로 처리할 필요 없이, JdbcTemplate은
트랜잭션 관리를 자동으로 처리해줍니다.
3. 쉽게 자바 객체로 매핑 가능: JdbcTemplate은 ResultSet에서 조회한 데이터를 자바 객체로
매핑할 수 있는 기능을 제공합니다. 개발자는 SQL 쿼리 결과를 직접 처리하는 대신,
JdbcTemplate의 매핑 기능을 활용하여 자바 객체로 데이터를 쉽게 변환할 수 있습니다.
하지만, JdbcTemplate이 JDBC에 비해 빠른 쿼리 속도를 제공한다는 것은 올바르지 않습니다.
JdbcTemplate은 JDBC를 기반으로 동작하며, 일부 작업을 간소화하고 개발 생산성을
향상시켜주지만 성능 측면에서는 JDBC와 유사한 수준의 성능을 보입니다.
- Jdbc Template 을 이용하여 데이터 다루기
- JDBC 환경과 동일하게 진행 가능
- 동일한 build.gradle 파일
- 동일한 application.properties 파일
- 생성한 Entity도 동일하게 사용 가능
- 반복되는 코드를 대부분 제거
- SQL은 작성
- 환경설정
- JDBC API 에서 바뀌는 부분
- Jdbc Template를 이용하여 게시글 저장
publicintsave(Post post) { String sql ="INSERT INTO post (title, content) VALUES (?, ?)"; intresult = jdbcTemplate.update(sql, post.getTitle(), post.getContent()); returnresult; } |
- Jdbc Template 에서 Insert와 update, delete는 update() 메소드를 사용하고 쿼리 실행으로 인해 변경된 행의 개수를 반환
- jdbc Template 을 이용하여 게시글 조회
publicList<Post>get() { String sql ="SELECT * FROM post"; returnjdbcTemplate.query(sql, (rs, rowNum) -> { Post post =newPost(); post.setId(rs.getLong("id")); post.setTitle(rs.getString("title")); post.setContent(rs.getString("content")); returnpost; }); } |
- Jdbc Template CRUD에 사용되는 method 정리
작업
메서드
예시
Create
update(String sql, Object... args)
jdbcTemplate.update("INSERT INTO post (title, content) VALUES (?, ?)", "제목", "내용");
Read
queryForObject(String sql, Object[] args, RowMapper<T> rowMapper)
Post post = jdbcTemplate.queryForObject("SELECT id, title FROM post WHERE id = ?", new Object[]{27}, (rs, rowNum) -> {Post result = new Post(); result.setId(rs.getLong("id")); result.setTitle(rs.getString("title")); return result;});
Read (List)
query(String sql, RowMapper<T> rowMapper)
List<Post> posts = jdbcTemplate.query("SELECT id, title FROM post", (rs, rowNum) -> { Post post = new Post(); post.setId(rs.getLong("id")); post.setTitle(rs.getString("title")); return post;});
Update
update(String sql, Object... args)
jdbcTemplate.update("UPDATE post SET content = ? WHERE id = ?", "변경된 내용", 27);
Delete
update(String sql, Object... args)
jdbcTemplate.update("DELETE FROM post WHERE id = ?", 27);
- 정리
- 반복 문제 해결
- 간결한 코드로 가독성 향상
- 자동화 해주는 부분과 객체 매핑을 간단하게 가능
- SQL을 직접 작성
- JDBC API 보다 Jdbc Template를 사용하는 것이 더 많은 장점을 가짐
- 아직 남아있는 단점 존재
- [퀴즈 ]
publicintsave(User user) { String sql ="insert into user(name) values(?)"; intresult = jdbcTemplate.update(sql, user.getName()); returnresult; } |
- update() 메소드는 INSERT, UPDATE, DELETE와 같은
데이터베이스 변경 작업을 수행하는 데 사용됩니다. 첫 번째
매개변수로는 실행할 SQL 쿼리를 전달하고, 필요에 따라 추가
매개변수로 SQL 쿼리의 파라미터를 전달합니다. 이 경우에는
sql 변수에 담긴 쿼리에서 user.getName() 을파라미터로
전달하여 실행합니다.
추천인 코드 : o6i4B3y95 : 앨리스트랙 참여 링크
#엘리스트랙 #엘리스트랙후기 #온라인코딩부트캠프 #온라인코딩학원 #백엔드학원 #개발자국비지원 #개발자부트캠프 #국비지원부트캠프 #DOCKER #백엔드 #자바스프링 #스프링강의 #백엔드인강 #RESTAPI #스프링개발자
'Elice --Cloud--Track > 10~12 주차' 카테고리의 다른 글
12주차 블로그 챌린지 (0) | 2024.02.11 |
---|---|
12주차 블로그 챌린지 (0) | 2024.02.11 |