CP프로그램중에 HikariCP라는 라이브러리가 있다 이걸 쓸 거임 음... 일본사람이 만든 건가?

지난번과 똑같이 검색해 들어가고 versions를 눌러서 2.7.4를 찾아주자 그거 쓸거임

찾아서 pom.xml에 복-붙 해주자

root-context.xml 파일을 열어서

뜬금없지만 ns는 name space의 약어란다. 그냥 생각난김에 써본다.
HikariCP는 HikariConfig라는 클래스를 갖고 있는데 여기에는 드라이버~ 서버URL, ID, PW 등을 설정하도록 코딩되어 있다. 근데 이런 것들이 setter로 만들어져 있는데, setter로 만들어서 쓰는 것을 property라고 부른다(프러퍼티?포티?)(변수를 만들고 setter 형식으로 받을 거예요 가! property다. 그렇단다)

bean 바로 옆 id를 통해서 저장하는 Key처럼 꺼내올수 있다. class 경로는 아래에서 확인할 수 있다.


바로 아래에도 이렇게 CP객체를 생성해주고(이때 hirariConfig(id로 선언한거)가 필요해서 생성자를 통해 파라미터로 전달해주었다) 이부분 말하는 거임

root-context의 bean눌러보면 확인가능
테스트를 위해 이렇게 생겨먹은 친구를 하나 만들어주자

package org.zerock.dao;
import static org.junit.Assert.fail;
import java.sql.Connection;
import java.sql.DriverManager;
import javax.sql.DataSource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class DataSourceTests {
// 자동 DI 디펜던시 인젝트 @Setter:lombok, @Autowired:spring, @Inject:javax 이 세가지는 거의 똑같이 동작합니다. // 쉽게 말해 밖에서 생성을 해서 객체로 집어넣는 것을 자동 DI라고 한다.
@Setter(onMethod_ = {@Autowired})
private DataSource dataSource; // DataSource가 커넥션에서 소스를 가져올 때 어느 디비를 연결해서 쓸 것인지를 정해 놓은 객체가 DataSource, 그래서 인터페이스가 내맘대로 상속받아 구현만하는...그런 좋은 친구다
// root-context에서 dataSource 객체를 이미 생성했었음 걔가 얘임
// 테스팅 하려고 하는 메서드 위에 사용되는 어노테이션 -> 있어야 테스팅 해준다
// JDBC 프로그램 -> 연결(con)을 개발자가 한다. --> 연결객체를 미리 여러개 만들어 놓고 저장해 놓은 프로그램 작성 : DBCP(db connection pool?)
@Test
public void testConnection() {
log.info(" - testConnection() - 연결 테스트(DataSource - DBCP) -------------------------");
// try 처리가 끝나면 사용한 객체를 자동 반납처리하기 (con.close()) 위해서 try(사용객체){처리} catch(){}
try(Connection con = dataSource.getConnection()) {
log.info("con : " + con); // null 이 나오면 연결 X
} catch (Exception e) {
//e.printStackTrace();
fail(e.getMessage());
}
} // end of testConnection()
}
기존과 크게 달라진건 (Connection con = dataSource.getConnection()) 이 부분이다 커넥션 꺼내오는 방법이 달라진 것이다. 매우 간결해짐!! Run as - Junit Test 해주고

root-context.xml안에
<context:component-scan base-package="org.zerock"></context:component-scan>
패키지를 org.zerock라고 지정해주고
servlet-context.xml에도 패키지를 org.zerock라고 지정해주자
<context:component-scan base-package="org.zerock" />
얘는 url이랑 상관있는 객체를 만드는 건데~~
root-context랑 용도가? 분류가? 조금 다르다! 뭐 바꿔써도 문제는 없다는데 분리해주는 거라더라~~


이제 실험을 해보자!
package org.zerock.board.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.zerock.board.service.BoardService;
import lombok.extern.log4j.Log4j;
// 자동 생성 되는 어노테이션 -> servlet-context.xml에 설정(설정이 안되어있으면 자동생성이 안 된다.)
@Controller
@RequestMapping("/board")
@Log4j
public class BoardController {
@Autowired
private BoardService service;
@GetMapping("/list.do")
public String list(Model model) {
log.info(" - 일반게시판 리스트 실행");
System.out.println("---- 일반 게시판 리스트 실행");
// model에 데이터를 속성 추가하면 request에 담긴다.
model.addAttribute("list", service.list());
// /WEB-INF/views/ + board/list + .jsp - forward
return "board/list";
}
}

list.jsp 의 경로는 /ex00/src/main/webapp/WEB-INF/views/board/list.jsp 이다!

service도 만들어주고

VO도 만들고

package org.zerock.board.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.sql.DataSource;
import org.springframework.stereotype.Repository;
import org.zerock.board.vo.BoardVO;
@Repository
public class BoardDAO {
@Inject
private DataSource dataSource;
public List<BoardVO> list() {
List<BoardVO> list = null;
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 1.2.
con = dataSource.getConnection();
// 3. sql
String sql = "select no, title, writer, writeDate, hit from board order by no desc";
pstmt = con.prepareStatement(sql);
// 5. 실행
rs = pstmt.executeQuery();
// 6. 담기
if(rs != null) {
while(rs.next()) {
if(list == null) list = new ArrayList<BoardVO>();
BoardVO vo = new BoardVO();
vo.setNo(rs.getLong("no"));
vo.setTitle(rs.getString("title"));
vo.setWriter(rs.getString("writer"));
vo.setWriteDate(rs.getString("writeDate"));
vo.setHit(rs.getLong("hit"));
list.add(vo);
}
}
System.out.println(list);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(con != null) con.close();
if(pstmt != null) pstmt.close();
if(rs != null) rs.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return list;
}
}
DAO도 만들어준다!
서버를 실행하면!!

워...후 잘 돌아간다. 끝