ch08. DB 연동

728x90
참고 도서 : 스프링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 붙은 메소드 호출하여 트랜잭션 시작

                  -> 
성공적 실행되면 트랜잭션 커밋 처리

                 -> 실패하면(익셉션 발생) 트랜잭션 롤백 처리

 

 
728x90