참고 도서 : 스프링5 프로그래밍 입문 - 최범균 저 |
ch08. DB 연동
[JDBC 단점 보완하는 스프링]
-<JDBC API> 이용 시 불필요하게 구조적 코드 중복 多
-<JDBC API> 이용 시 직접 수동 커밋 모드에서 커밋, 롤맥 처리 해야 됨.
-스프링은 JdbcTemplate 클래스 제공-> 구조적 반복 줄임 -스프링은 @Transactional을 트랜잭션 적용 메소드에 붙임 -> 스프링이 알아서 커밋과 롤백 처리O. -> 코드 작성 시, 핵심 코드만 집중하여 작성 O |
[DB 연동에 필요한 모듈 추가] : pom.xml 파일에 추가해야 할 모듈
spring-jdbc : DB연동에 필요한 기능 제공 (jdbcTemplate 제공) tomcat-jdbc : DB 커넥션풀 기능 제공 (DataSource 제공) mysql-connector-java: MySQL 연결에 필요한 JDBC 드라이버 제공 |
[DB 테이블 생성]
create table spring5fs.MEMBER (
ID int auto_increment primary key,
EMAIL varchar(255),
PASSWORD varchar(100),
NAME varchar(100),
REGDATE datetime,
unique key (EMAIL)
)
[DB 데이터 생성]
insert into MEMBER (EMAIL, PASSWORD, NAME, REGDATE)
values ('madvirus@madvirus.net', '1234', 'cbk', now());
[DataSource 설정] : DB 연결(Connection) 목적
-스프링이 제공하는 DB 연동 기능은 DataSource 사용.
-DB 연동에 사용할 DataSource 클래스를 스프링 빈으로 등록 후, DB 연동 기능 구현한 빈 객체는 DataSource 주입받아 사용
@Configuration
public class DbConfig {
@Bean(destroyMethod = "close")
public DataSource dataSource() {
DataSource ds = new DataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
...
}
}
[커넥션 풀]
-커넥션 풀은 커넥션을 생성하고 유지한다.
-커넥션 풀 사용이유: 성능 때문(-> 매번 새 커넥션 생성 시 시간 소모 큼)
-따라서, 커넥션 풀에 미리 최소한의 커넥션 유지해둠
[커넥션 상태]
-커넥션 활성 상태: 커넥션 풀에 커넥션 요청 시
Connection conn = dataSource.getConnection(); //커넥션 요청 |
-커넥션 유휴 상태: 커넥션 풀에 반환 시
Connection conn.close(); //커넥션 반환 |
[Tomcat JDBC 주요 설정 set 메소드] : 주요 프로퍼티
-커넥션풀 기능 제공하는 DataSource 구현 클래스
-커넥션을 몇 개 만들지 지정 메소드 제공
setInitialSize(int) | 커넥션 풀 초기화 시 생성할 초기 커넥션 개수 지정 |
setMaxActive(int) | 커넥션 풀에서 가져올 수 있는 최대 커넥션 개수 지정 |
setMaxIdle(int) | 케넥션 풀에서 유지가능한 최대 커넥션 개수 지정 |
setMinIdle(int) | 커넥션 풀에 유지할 최소 커넥션 개수 지정 |
setMaxWait(int) | 커넥션 풀에서 커넥션 최대 대기 시간 |
setMaxAge(long) | 최초 커넥션 연결 후 최대 유효 시간 |
setValidationQueryt(int) | 커넥션 유효 검사 시 사용할 쿼리 지정 |
setValidationQueryTimeout(int) | 검사 쿼리 최대 실행 시간 |
setTestOnBorrow(boolean) | 풀에서 커넥션 가져올 때 검사 여부 지정 |
setTestOnReturn(boolean) | 풀에 커넥션 반환 시 검사 여부 지정 |
setTestWhileldle(boolean) | 커넥션 유휴상태 동안 검사 여부 지정 |
setMinEvictableIdelTimeMillis(int) | 풀에 유휴 상태 최소 유지 시간 지정 |
setTimeBetweenEvictionRunsMillis(int) | 풀 유휴 커넥션 검사 주기를 밀리초 단위로 지정 |
[JdbcTemplate 이용 쿼리 실행]
➀ JdbcTemplate 객체 생성
➁ JdbcTemplate 이용 -> 조회(SELECT) 쿼리 실행
ⓐ query() 메소드
ⓑ queryForObject() 메소드
➂ JdbcTemplate 이용 -> 변경(INSERT/UPDATE/DELETE) 쿼리 실행
: update()메소드
▶쿼리에서 사용할 (인덱스 파라미터) 값 전달
ⓐ
ⓑ
▶INSERT 쿼리 실행 시-< KeyHolder 이용 자동 킷값 생성
[DB 연동 과정에서 발생 가능한 Exception] : 3가지 경우
➀ DB 연결 정보 잘못 지정 시.(ex. 계정 암호 틀림) ➁ DB 연결 실패 ➂ 잘못된 쿼리 사용 시 |
[스프링의 Exception 익셉션 변환 처리] : DataAccessException 타입
-스프링은 SQL익셉션 발생 시-> 스프링 제공 익셉션 타입으로 변환해서 재발생시킴
-스프링 제공 익셉션으로 변환시킴으로써 연동 기술에 상관없이 동일한 코드로 익셉션 처리 가능
[트랜잭션 처리]
-트랜잭션 : 여러 쿼리를 논리적으로 하나의 작업으로 묶어줌
-트랜잭션으로 묶인 쿼리 중 하나라도 실패 시 전체 쿼리 실패로 간주
-롤백 : 쿼리 실패 시, 실행 취소 후 DB 기존 상태로 되돌리는 것 - 커밋 : 쿼리 성공 시, 결과를 실제 DB에 실제 반영하는 것 |
[스프링의 트랜잭션 처리] : @Transactional
-스프링은 중복 없는 간단한 코드로 트랜잭션 범위 지정 가능
-트랜잭션 범위에서 실행하고 싶은 메소드에 @Transactional 붙임
-스프링은 @Transactional 붙은 메소드를 동일한 트랜잭션 범위에서 실행
<@Transactional 정상 동작 위해 추가할 스프링 설정> ㉠ @Transactional 활성화 설정 ㉡ PlatformTransactionManager 빈 설정 |
<@Transactional 사용 위해 스프링 설정에 추가한 설정>
@Configuration
@EnableTransactionManagement //@Transactional 활성화 설정
public class AppCtx {
@Bean //플랫폼 트랜잭션 매니저 빈 설정
public PlatformTransactionManager transactionManager() {
DataSourceTransactionManager tm = new DataSourceTransactionManager();
tm.setDataSource(dataSource());
return tm;
}
}
-@EnableTransactionManagement = @Transcation 메소드를 트랜잭션 범위에서 실행하는 기능 활성화 -PlatformTransactionManager 인터페이스 = 스프링은 동일한 방식으로 트랜잭션 처리 위해 이 인터페이스를 제공, 사용함 |
[@Transactional과 프록시 객체]
-프록시 객체 = AOP를 구현
= 여러 빈 객체에 공통 적용되는 기능 구현한 방법
-트랜잭션도 여러 빈 객체에 공통 적용되는 기능 중 하나.
-트랜잭션 처리/커밋 처리/롤백 처리 의 주체 = 프록시 객체
:@Transactional 적용을 위해 @EnableTransactionManagement 사용하게 되면 스프링은 @Transactional 적용한 빈 객체 찾아서 알맞은 프록시 객체를 생성 -> 프록시 객체는 @Transcational 붙은 메소드 호출하여 트랜잭션 시작 -> 성공적 실행되면 트랜잭션 커밋 처리 -> 실패하면(익셉션 발생) 트랜잭션 롤백 처리 |
'Web(웹)_관련 공부 모음 > [개념]_스프링 5 프로그래밍' 카테고리의 다른 글
ch10. 스프링 MVC 프레임워크 동작 방식 (0) | 2022.01.31 |
---|---|
ch09. 스프링 MVC 시작하기 (0) | 2022.01.31 |
ch07. AOP 프로그래밍 (0) | 2022.01.27 |
ch06. 빈 라이프사이클과 범위 (0) | 2022.01.27 |
ch05. 컴포넌트 스캔 (0) | 2022.01.26 |