기억의 DataBase

Spring JDBC 본문

Spring

Spring JDBC

Zester; 2019. 3. 22. 18:04
  • Spring JDBC
개발하기 지루한 JDBC의 모든 저수준 세부사항을 스프링 프레임워크가 처리해준다.
(개발자는 필요한 부분만 개발하면 된다.)


  • Spring JDBC 패키지
org.springframework.jdbc.core : JdbcTemplate 및 관련 Helper 객체 제공

org.springframework.jdbc.datasource : DataSource를 쉽게 접근하기 위한 유틸 클래스, 트랜젝션매니져

org.springframework.jdbc.object : RDBMS 조회, 갱신, 저장등을 안전하고 재사용 가능한 객체 제공

org.springframework.jdbc.support : jdbc.core 및 jdbc.object를 사용하는 JDBC 프레임워크를 지원

  • JDBC Template
org.springframework.jdbc.core에서 가장 중요한 클래스
리소스 생성, 해지를 처리해서 연결을 닫는 것을 잊어 발생하는 문제 등을 피할 수 있도록 함
스테이먼트(Statement)의 생성과 실행을 처리
SQL 조회, 업데이트, 저장 프로시저 호출, ResultSet 반복호출 등을 실행
JDBC 예외가 발생할 경우 org.springframework.dao패키지에 정의되어 있는 일반적인 예외로 변환

※ JDBC Template를 기반으로 한 클래스들

NamedParameterJdbcTemplate : ? 대신 바인딩으로 파라미터를 처리할 수 있게 하는 클래스

 

SimpleJdbcTemplate(deprecated) : JDBC Template에서 가장 빈번하게 사용되는 작업들을 간편화한 클래스
 

 

SimpleJdbcInsert : Insert를 간편하게 할 수 있도록 돕는 클래스

  • Connection Pool


DBMS에 연결하는 과정은 많은 자원을 소비한다.
따라서 필요할때 마다 연결했다가 끊었다가 하는 것은 비효율적이다.
그래서 이러한 연결을 미리 여러개 해두고 필요에 따라 
Client에게 빌려주고 반납받을 수 있는 ConnectionPool이 효율적이다.

DataSource : ConnectionPool을 관리하는 목적의 객체로, 연결을 빌리고 반납하는 작업을 수행

  • Spring JDBC 설정과 DataSource를 활용한 연결확인
pom.xml에 dependency 추가(+Bulid에 JDK 버전 추가/플러그인) 

Spring

JDBC

DB Driver

DataSource

config 클래스를 모아둘 패키지를 만듬

 

ApplicationConfig메인 config 클래스로 사용하고, 

종류가 다른 config 클래스들은 @Import를 통해 불러서 적용
(config 파일을 분류하여, 유지보수가 용이)

basePackages를 활용하면 복수의 패키지를 scan할 수 있다


DBconfig 클래스에 연결에 필요한 정보(드라이버, 주소, 아이디, 비밀번호)와 
그 정보를 담아서 나르는데 사용할 DataSource 객체를 @Bean으로 등록

'ApplicationConfig' 클래스의 설정만 ApplicationContext의 객체에 담으면
'DBconfig' 클래스의 설정은 @Import 되어 있으므로 적용됨

이후 Spring Container인 ac에 있는 DataSource 클래스에 해당하는 객체를 꺼내
DataSource의 객체에 할당(이 객체는 연결에 필요한 정보들을 담고 있음)

DataSource의 객체인 ds가 가진 메소드인 getConnection()을 이용해  그 내용을
Connection의 객체 conn에 할당

conn이 null인 경우와 null임에도 close()하는 경우를 막기위해 예외처리

※import 할때 정확한 클래스 선택 주의

  • Select All


전체 패키지 구조

DTO(Data Transfer Object) 작성

             


Object의 기본 클래스인 toString()을 오버라이딩해주면 객체를 출력했을때
객체의 주소가 아니라 toString()에서 설정한 return 정보를 출력한다.


sql문을 모아놓은 class를 따로 생성

DAO(Data Access Object)

@Repository
어노테이션으로 config에서 scan하도록 함

BeanPropertyRowMapper
객체를 지정한 DTO로 담는데 사용
(DB의 네이밍과 JAVA의 네이밍 형식 변환도 해줌 ex) ROLE_ID == roleId)

DataSource dataSource
Spring 4.3부터는 scan으로 객체를 찾았을때, 기본 생성자가 없다면 필요한 객체를 생성하여 주입해줌 

jdbc.query(SELECT_ALL, Collections.emptyMap(), rowMapper);
jdbc.query(sql, 바인딩할 값이 있을 경우 전달할 객체, 결과값을 dto의 멤버필드에 mapping)


기존의 ResultSet과 같은 클래스 없이도 결과를 바로 원하는 형태로 가져올 수 있음

  • Insert

 선언

role 객체를 map객체로 바꾸어서 줌

insert할 객체를 준비해서, 메소드 인자로 넣음

  • Update

update문에서 =: 바로 뒤에 바인딩한 변수를 적어줘야 함
(띄어쓰기하면 sql 문법 에러 발생)

DAO에서 sql문과 map으로 변환한 객체를 넣음


update메소드 실행(set할 내용인지 where의 조건 내용인지 구분 주의)

  • Delete

delete문 작성

객체를 가지고 delete 조건을 줄 수도 있으나 비효율적
  1. 객체를 생성해야 한다
  2. delete 조건은 단일(ex) 100,200)한데, 다른 정보들까지 있는 객체는 필요하지 않다

단일한 정보(id)만을 받아서 Map 객체로 만든 후에 바로 줌
(int로 해도 되는데, Integer로 하는 이유는 null값을 받기 위해서?)

객체를 줄 필요없이 id 값 500을 입력

  • Select By Id

조건절을 가진 select문 작성

 

selectAll의 경우 query지만, 단일 객체를 return 할때는 queryForObject를 활용
조건에 맞는 값이 없을 경우 원하는 결과를 return

 

102번 조회

 

결과

'Spring' 카테고리의 다른 글

Spring Framework를 활용한 방명록 - 1.설정  (0) 2019.03.31
Spring MVC  (0) 2019.03.25
Java Config를 통한 IoC/DI  (0) 2019.03.21
xml을 통한 IoC/DI  (0) 2019.03.21
IoC와 DI  (0) 2019.03.21
Comments