7/9, 7/10 JdbcTemplate

박세현·2024년 7월 8일

Spring

목록 보기
3/15
post-thumbnail

JdbcTemplate

1. 설치 및 설정

1) spring-jdbc

  • implementation 'org.springframework:spring-jdbc:6.1.10'


2) tomcat-jdbc

  • implementation 'org.apache.tomcat:tomcat-jdbc:10.1.25'

  • 커넥션 풀

    • 미리 연결 객체를 여러개 생성해서 필요할때마다 빌려주고, 회수하는 방식
    • 근데 새벽시간과 같은 많이 사용하지 않은 시간에는 자동으로 연결을 끊는 경우가 있어 주기적으로 연결이 유효한지 체크해보는 메서드가 있음
    • 반응성, 성능 향상의 효과

  • HikariCp

    • 이것도 커넥션풀임
    • 스프링부트에 기본탑재된 커넥션 풀
  • javax.sql.DataSource

    • 커넥션 풀임
    • 커넥션 풀을 구현한...


3) 기타 필요 의존성

  • spring-context

    • implementation 'org.springframework:spring-context:6.1.10'
  • lombok

    • compileOnly 'org.projectlombok:lombok:1.18.34'
  • spring-test : 의존성을 주입받은 상태로 test실현 가능(스프링부트에는 기본 탑재되어 있음)

    • testImplementation 'org.springframework:spring-test:6.1.10'
  • ojdbc11
    • implementation 'com.oracle.database.jdbc:ojdbc11:23.4.0.24.05'
  • 로거
    • slf4j-api
      • implementation 'org.slf4j:slf4j-api:2.0.13'
    • logback classic
      • implementation 'ch.qos.logback:logback-classic:1.5.6'
    • 로거 설정(resources 디렉토리)



2. DataSource 설정

  • javax.sql.DataSource
  • 연결 유효성 체크 관련 메서드 - Tomcat JDBC, HikariCp


예시) 스키마 생성



예시) DB 연결 설정



예시) 커넥션 풀 설정



예시) db연결은 메모리를 소비하므로 다 쓰면 메모리를 해재 해주어야 함

ㄴ 스프링 컨테이너가 소멸될 때 자원도 같이 해재해주도록 설정



예시) db연결 테스트



예시) 쿼리 수행




3. JdbcTemplate을 이용한 쿼리실행

1) query() : SELECT 문

  • List query(String sql, RowMapper rowMapper)
  • List query(String sql, Object[] args, RowMapper rowMapper)
  • List query(String sql, RowMapper rowMapper, Object... args)

예시) db에서 데이터 가져오기

ㄴ 로우매퍼가 db 데이터한개씩 꺼내옴?
ㄴ 리졸트셋이 멤버객체에 할당??

ㄴ 람다식 쓰라는 소리

ㄴ 람다식 사용한ver



2) queryForObject()

  • 단일 데이터 조회
  • 조회된 데이터가 반드시 1개여야 함, 그렇지 않으면 예외가 발생

예시) db에서 단일데이터 가져오기



예시) 전체데이터나 단일데이터 조회할 때 겹치는 부분이 많으니 따로 빼자

ㄴ 매퍼 부분이 겹침

ㄴ 따로 뺌

ㄴ 이렇게 짧게 쓸 수 있음

ㄴ 애도 이렇게 짧게 쓸 수 있음



예시) 데이터가 없는 경우

ㄴ 없는 데이터 조회해서 예외발생함

ㄴ try~catch 적용하자



예시) 데이터 갯수 count



3) update()

  • 데이터 변경을 가하는 SQL - INSERT, DELETE, UPDATE : 반환값 - 반영된 레코드 갯수
  • int update(String sql)
  • int update(String sql, Object... args)
    • PreparedStatement 방식으로 쿼리 작성
      값 바인딩 ?, ?

예시) INSERT 쿼리수행




4. PreparedStatementCreator를 이용한 쿼리 실행

  • Connection 객체 매개변수로 정의되어 있는 메서드를 통해서 사용 가능
  • 증감 번호 형태의 PK를 조회 할 때 주로 사용
    ex) seq 번호

Interface Connection
https://docs.oracle.com/en/java/javase/17/docs/api/java.sql/java/sql/Connection.html


예시) Insert 쿼리

ㄴ 넘겨주는 값이 커넥션 객체...?

ㄴ new PreparedStatementCreator() : 가 회색인 이유
-> 람다식을 사용하라는 의미

ㄴ 람다식 적용한ver



1) KeyHolder

Class Number(추상클래스)
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Number.html

ㄴ 기본형으로 반환하는 메서드


예시) INSERT 쿼리 실행 시 KeyHolder를 이용해서 자동 생성 키값 구하기

ㄴ 보통 number형태로 반환하는 경우는 숫자를 가져오는데 long인지 int인지를 모르니까 number로 반환
ㄴ number : 추상클래스, 인티저...등의 가장 상위 클래스




6. 스프링의 익셉션 변환 처리

  • 각 연동 기술에 따라 발생하는 익셉션을 스프링이 제공하는 익셉션으로 변환함으로써 다음과 같이 구현 기술에 상관없이 동일한 코드로 익셉션을 처리할 수 있게 된다.
  • SQLExcpetion, HibernateException, PersistenceException -> DataAccessException
    (RuntimeException)



7. @Transactional

  • 트랜잭션 처리
  • 수동 관리
  • 자동 롤백 해줌
    • 테스트 할 때 테스트 데이터가 db에 저장되는 것 방지할 경우 등등에 사용
  • 클래스명 위, 메서드명 위에 사용
Connection
- setAutoCommit(false)		(공통기능)

↓

SQL 1...

SQL 2... 					(핵심기능)

SQL 3...

↓

Connection					(공통기능)
commit();
  • 설정

예시) 자동 롤백





Spring Data 프레임워크

  • Spring Data JPA
    • implementation 'org.springframework:spring-jdbc:6.1.10'

Spring Data Core 3.3.1 API
https://docs.spring.io/spring-data/commons/docs/current/api/index.html

  • Spring Data JDBC
    • implementation 'org.springframework.data:spring-data-jdbc:3.3.1'
    • 쿼리 메서드를 제공해줌
    • CRUDRepository 인터페이스를 상속받은 인터페이스 Repository

Interface CrudRepository<T,ID> (T : 엔티티 자료형, ID : 기본키의 자료형 )
https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/CrudRepository.html

  • count, delete, find, save

ㄴ 이터러블 : 콜렉션프레임웤(셋, 리스트...)

ㄴ save : 기본키가 있으면 수정 없으면 추가


예시)

ㄴ 기본적으로 컨테이너 관리객체
ㄴ 의존성 주입만 해주면 된다???

ㄴ 인터페이스만 있어도 프록시형태의 구현체가 자동 생성된다?? 뭐가 그렇게 해주는데...ㅠ

profile
귤귤

0개의 댓글