DBCP를 이용한 DB 연동 설정& 테스트_05

차관호·2024년 2월 21일

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도 만들어준다!

서버를 실행하면!!

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

profile
안녕하세요 :-)

0개의 댓글