| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- @ResponseBody
- .xml
- application.properties
- springjdbc
- 바인딩변수
- @RequestParam
- frontController
- springmvc
- MVC
- AOP
- Model
- Java
- produces
- @Valid
- 유효성검사
- @
- 어노테이션
- gradle
- PointCut
- @RequestMapping
- 서비스레이어
- 스프링
- 비즈니스레이어
- jointpoint
- SpringBoot
- 생성자주입
- spring
- c:if
- after-throwing
- 의존주입
- Today
- Total
메모장
Spring JDBC 본문
" 코드 복사하기 " , " 코드가 반복된다 " 가 됐다면,
우리는 "더 줄일 수는 없을까 ?" (모듈화, 캡슐화 ,...)를 고민 해봐야한다!!
== 같은말로 "정형화 시킬순 없나 ?"
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 로! 잊지 말고 !
'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 |