일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 리스코프치환원칙
- 상수와 Enum
- 제임스고슬링
- 객체지향적인 설계
- 우테코4기
- 자바 버전 다운 그레이드
- 프로젝트 패키지 구조
- 우아한테크코스
- 자바 4334
- 우테코
- java 1000번 A+B
- ControllerTest
- Oracle JDK와 OpenJDK의 차이
- Getter Setter
- JXM
- PR 오류
- 테스트 성능 개선
- 백준
- 윤년계산하기
- 자바로 만들수 있는 것
- 블랙잭 회고
- JDK
- 상근날드
- ServiceTest
- 자판기미션
- 인수테스트
- 자바의 종류
- 방어적 복사
- There isn't anything to compare.
- throw 와 throws 차이
- Today
- Total
개발새발
JDBC와 JDBC Template 본문
JDBC 학습 동기
데이터가 보존 가능한 web 프로그램을 만드려고 하다 보니, web 과 DB를 연동해야 했다.
연동하는 방법 중 하나인 JDBC 를 사용하라는 요구사항이 있었고, 따라서 학습하게 되었다.
JDBC ( Java database connectivity)란?
자바 프로그램 내에서 데이터 베이스 sql 문을 실행하기 위한 자바 API 이다.
JDBC 를 사용해서 DB 연결 하는 과정
연결에 필요한 정보 추가
DriverManager 를 사용하여 Connection 얻어오기
얻어온 Connenction 과 PreparedStatement 를 사용하여 sql 문 시행시키기
PreparedStatement 란?
Sql injection 을 방어하기 위한 방법이다.
sql 문을 받아서 단지 실행만 시켜준다면, 사용자가 임의로 데이터를 알아내거나, 수정, 삭제 등을 할 수 있게 되기 때문에
안전한 프로그램을 만들 수 없다.
따라서 파라미터 값을 받아서 sql 문을 실행시킬 때는, Preparedstatement 객체를 상수 스트링으로 생성하고,
파라미터 부분을 setString 을 사용하여 외부 입력이 쿼리의 구조문을 바꾸는 것을 방지할 수 있다.
? 부분에 데이터를 넣을 수 있고, setString 을 할 때는 set 할 위치와 데이터를 매개변수로 넘겨줘야한다.
? 의 위치는 왼쪽부터 1이고, 오른쪽으로 갈수록 증가한다.
JDBC 의 불편함
- 쿼리를 실행하기 전과 후에 많은 코드를 작성해야함 (connenetion 불러오기, sql 실행을 위한 코드 등등)
- Jdbc 에서 발생하는 에러는 Runtime Exception이다. 따라서 모두 예외처리를 해줘야 한다.
Spring Jdbc 가 나타났다.
JDBC의 불편함을 개선한 Spring JDBC
위에서 하던 번거로운 작업들을 Spring JDBC 가 대신 해준다.
- Connection 열기와 닫기
- Statement 준비와 닫기
- Statement 실행
- ResultSet Loop처리
- Exception 처리와 반환
- Transaction 처리
Spring JDBC 에서 개발자가 할 일
- dataSource 설정하기
- sql 문 작성하기
- 결과 처리하기
그 외에 나머지는 전부 Framwork 가 알아서 처리해준다.
DataSource 란?
DB 와 관계된 커넥션 정보를 가지고 있으며, 빈으로 등록하여 정보를 넘겨준다.
Jdbc template 가 JDBC API 를 이용하고 DB 연동을 하기 위해서는, DB 로 부터 커넥션을 얻어야 한다.
그 때 사용하는 정보들을 DataSource 라고 한다.
DataSource 를 Jdbc 템플릿에 주입시켜준 후 Jdbc template 이 JDBC Driver를 이용하여 DB 에 접근한다.
DataSource 주입 방법
JDBC Template을 사용해서 DB 연결 하는 과정
1. application.properties 에서 spring.datasource ~ 를 설정해주면 Spring 이 로딩 되는 시점에 데이터가 주입된다.
2. DataSource 를 JdbcTemplate 에 설정해준다 .
DB Connection Pooling이란?
- 자바 프로그램에서 데이터베이스 연결(커넥션 객체를 얻는것)은 오래걸림
- 일정량의 Connection객체를 미리 만들어 저장 후 요청을 받으면 꺼내서 사용한다.
- 속도와 퍼포먼스가 좋아짐
- 커넥션풀을 관리하고, 커넥션객체를 풀에서 꺼냈다 반납하는 이러한 과정을 DataSource가 하게된다.
JDBC Template 이란?
Spring JDBC 를 사용하는 방법 중 하나로, DataSource 을 사용해서 DB 연결, 내부는 JDBC API 를 사용한다.
JDBC Template 이 제공하는 기능
- 실행 : insert, update 같이 DB 의 변경이 일어나는 쿼리를 수행함.
- 조회 : select를 이용해 데이터를 조회하는 작업을 수행함
- 배치 : 여러 개의 쿼리를 한번에 수행하는 작업
-결과 : 반환 값을 성형함
- 커넥션 연결/종료과 같은 작업을 자동으로 처리해줌
1. 실행,조회
여기서 Preparedstatement 객체를 직접 활용하지 않고, jdbcTemplate 에서 제공하는 update 를 사용하면
같은 효과를 얻을 수 있다.
왜냐하면 jdbcTemplate update 내부 동작에서 Preparedstatement 객체를 만들고, 실행하는 로직이 있기 때문이다.
JdbcTemplate 조회 값이 여러개 일 경우
1. RowMapper 를 활용해서 ResultSet 의 결과를 자바 객체로 변환 할 수 있다.
RowMapper 를 상속받은 구현체를 만든 다음, ResultSet 에서 getString (컬럼 이름) 으로 데이터를 추출할 수 있다.
JdbcTeamplate.query() 를 사용하면 여러개의 결과 값을 추출할 수 있다.
값이 1개일 경우는 queryForObject 를 사용해서 바로 매핑이 가능하다.
전체적인 흐름 (Data Access Layer)
느낀점
최초의 JDBC 만 사용했을 때는, DAO 객체마다 Connenction 을 만들어주고, sql 문을 날리기 위해서는
Preparedstatement 객체를 하나 하나 만들어줘야 했는데, JdbcTemplate 을 사용하니
Connenction 과 Preparedstatement 를 만들어주는 부분이 자동화되어 엄청 간편했다.
참고자료
Spring JDBC를 통한 DB 연동
DataSource JDBC API는 DriverManager 외에 DataSource를 이용해서 DB 연결을 구하는 방법을 정의하고 있다. DB연동 기능을 구현하고 Bean으로 등록되어 있는 객체(주로 @Repository 어노테이션을 붙인)에 DataSource
hyeon9mak.github.io
[Spring] JdbcTemplate이란 무엇인가?
나는 이전까지 JDBC를 이용하여 프로젝트를 진행했었다.(아는게 이거밖에 없었다.) JDBC는 데이터베이스 종류에 영향을 받지 않고 정해진 API를 이용하여 처리하는 것이다. 이러한 JDBC는 추상화를
mungto.tistory.com
Spring JDBC를 통한 DB 연동
DataSource JDBC API는 DriverManager 외에 DataSource를 이용해서 DB 연결을 구하는 방법을 정의하고 있다. DB연동 기능을 구현하고 Bean으로 등록되어 있는 객체(주로 @Repository 어노테이션을 붙인)에 DataSource
hyeon9mak.github.io
[Spring] Spring JDBC, DataSource란?
DataSource란? DB와 관계된 커넥션 정보를 담고있으며 빈으로 등록하여 인자로 넘겨준다. → 이 과정을 통해 Spring은 DataSource로 DB와의 연결을 획득한다. DB 서버와의 연결을 해준다. DB Connetion pooling기
esoongan.tistory.com
'우아한테크코스' 카테고리의 다른 글
터놓고 테스트 성능 개선기 1 (1) | 2022.09.03 |
---|---|
객체, 설계 (0) | 2022.08.24 |
MVC 패턴 (0) | 2022.02.20 |
Enum을 사용하는 이유가 뭘까? (0) | 2022.02.20 |
오류와 예외는 같은걸까? (0) | 2022.02.20 |