메모장

Spring JDBC 본문

Spring/개념정리

Spring JDBC

Itchild 2024. 7. 4. 13:51
728x90
반응형

 

" 코드 복사하기 " , " 코드가 반복된다 " 가 됐다면,

우리는 "더 줄일 수는 없을까 ?" (모듈화, 캡슐화 ,...)를 고민 해봐야한다!!

== 같은말로 "정형화 시킬순 없나 ?"

 

DAO에서 반복되는 코드가 있으니 코드끼리의 유사성이 있구나 라는것을 알 수 있다.

 

1. 기존 JDBC 코드 살펴보기

 

JDBC 로직이 반복되네 ? (유사하네 ?) 더 줄일수 없을까 ? 라고 생각 !!

=> 유사하거나 반복되는 알고리즘을 캡슐화 하여 재사용 하는 패턴

Template 패턴 이라고 한다.

코딩순서가 정해져 있는 == 정형화되어있는 기술에서 특히 유용하게 활용됨

(Template패턴을 적용하기 좋은 사례 이다.)

ex) jdbc 뿐만 아니라 , 트랜잭션 , Mybatis, JPA,... 등등이 있다.

( connection 확보 하고 연결 받아서 연결 종료하는 그러한 패턴 )

 


 

 

우리가 지금까지 배운 패턴들에 대해 짚고 넘어가자 !

=> MVC 패턴, factory패턴 (객체생성코드를 캡슐화 하는것 ,new 를 은닉화 , 그래서 결합도를 낮추는것 ),

싱글톤(메모리 성능을 향상시키기 , 동일한 객체를 하나만 남기는것 ),,,,

 


2. "JDBCTemplate" 클래스를 적용하여 DAO 구성하기

 

3. pom.xml 에 jar 추가

 

" DBCP " : DB 커넥션 풀(connection pool) == 커넥션(connection)들을 대신 관리해주는 주체(객체)

// 대신 관리를 해준다.

커넥션 connection 을 대신 관리한다는건 그 만큼 커넥션 connection 이 중요하다.

DB연결은 conn을 DB로 부터 확보하는 것 에서부터 시작 !

JDBCTemplate 클래스는

★ DataSource 객체를 통해 ★

conn 을 확보 및 관리함

 

 

 

4. DataSource 객체를 생성

 

new(객체생성) 을 누가해주는가 ? 스프링 컨테이너가 생성하도록 해야함

== <bean> 등록을 해야함

destroy-method : class 속성에 선언한 클래스의 close 메서드를 호출하는 의미

 

DataSource 객체 <bean> 등록시 setter DI (의존주입) 을 함께 설정해야함!!!!!

JDBCUtil 대신 하는 setter 의존주입 !

// ref 가 없는이유 드라이버 클래스가 String 이라 value가 들어감

 

5. DAO로 이동

 

원래 있던 BoardDAO 에서 코드를 줄여나가는 과정을 보여줄 예정이라 BoardDAO2 라고 임의로 만들었다.

 

// 커넥션이 대신 확보된 템플릿을 활용

private JdbcTemplate jdbcTemplate;

 

INSERT 파트를 바꿔볼 예정

<Oracle 쿼리문 >

private final String insert="INSERT INTO BOARD (BID,TITLE,CONTENT,WRITER) VALUES ((SELECT NVL(MAX(BID),0)+1 FROM BOARD),?,?,?)";

< 기존코드 >
public boolean insert(BoardVO bVO) {
    System.out.println("BoardDAO 로그 insert() 메서드");
	conn=JDBCUtil.getConnection();
				try {
					pstmt=conn.prepareStatement(insert);
					pstmt.setString(1, bVO.getTitle());
					pstmt.setString(2, bVO.getContent());
					pstmt.setString(3, bVO.getWriter());
					int rs=pstmt.executeUpdate();
					if(rs<=0) {
						return false;
					}
				} catch (SQLException e) {
					e.printStackTrace();
					return false;
				} finally {
					JDBCUtil.close(conn, pstmt);
				}
				return true;
	}
 

 

이제 기존 코드를 다 지운 후 !

// jdbcTemplate 아 나 뭐좀 수행해줄래 ? update 가 쓰인다.

// executeUpdate() 의 업데이트라고 보면됨

 

// ?,?,? 넣어야하는 인자를 순서에 맞게 () 안에 넣어주면 된다. 인자를 나열해주기만 하면 된다.

 

근데 update() 반환 타입이 int 라서

< 완성코드 >
public boolean insert(BoardVO bVO) {
int rs = jdbcTemplate.update(insert,bVO.getTitle(),bVO.getContent(),bVO.getWriter());
if(rs<=0) { // int rs 받아서 rs가 0 이하면 뭔가 안된 것이다.
   return false;
}
   return true;
}
 

 

 

6. DAO의 클래스의 멤버변수로 JdbcTemplate를 등록 -> DI(의존주입)

 

등록해야한다 : applicationContext.xml(루트 컨테이너)

dataSource 객체를 setter 주입함

 

7. DAO2를 사용해보자!

-> Service가 사용함

Service의 멤버변수 변경

@Repository로 Service에 의존주입할 객체 생성

 

 

정리

1. jar 파일들 필요!

DBCP (데이터 베이스 커넥션 풀) 이용할 수 있도록 DataSource (데이터 소스) new 객체생성

 

 

2. 대략 순서

DBCP 활용하는 -> DataSource(데이터 소스) 는 -> Template패턴 으로 부터 나왔고 -> DAO2 그것을 DAO에 적용시켜 -> Service 레이어를 이용하여 유지보수를 용이하게 하고 -> Controller 를 실행시킨다.

-> HM (HandlerMapping) -> DispatcherServlet 서블릿 -> Spring

 

------- 전체 흐름 -------

스프링에서 동작하려면 DS 서블릿이 동작해야 하는데 DS 는 HM이 실행하는데

HM 요청에 의한 Controller 객체가 반환된다.

Service 레이어를 DAO에 적용 DAO에 대한 유지보수를 용이하게 하였는데

Template 패턴을 이용해 JDBCUtil에서 반복되는 코드를 줄였고 그 과정에서 DataSource 가 객체 생성을 담당

해주고 DBCP 가 connection 확보를 담당해주는 역할을 한다.

 

3. 서비스 레이어 사용중이라 BoardServiceImpl 가서 멤버변수인 BoardDAO를 BoardDAO2로만 바꾸면 됨 !

@Repository 옮겨주기 BoardDAO 2 로! 잊지 말고 !

 

 

 

 

 

 

 

 

 

 

728x90
반응형

'Spring > 개념정리' 카테고리의 다른 글

Spring 파일 업로드  (0) 2024.08.07
Spring JDBC 실습 (selectAll / One)  (1) 2024.07.04
AOP 로그 실습 (@ 어노테이션 으로 변경)  (0) 2024.07.04
AOP 실습2 (after-throwing,around 실습)  (0) 2024.07.04
AOP 실습 (.xml)  (0) 2024.07.04