작업 성공의 예
작업 실패의 예
작업 성공의 예
작업 실패의 예
com.bitcamp.board.service.DefaultBoardService 클래스 변경
DefaultBoardService class, add()
public class DefaultBoardService implements BoardService{
Connection con; // 트랜잭션을 다룰 때 사용할 객체
BoardDao boardDao;
public DefaultBoardService(BoardDao boardDao, Connection con) {
this.boardDao = boardDao;
this.con = con;
}
@Override
public void add(Board board) throws Exception {
con.setAutoCommit(false);
try {
// 1) 게시글 등록
if (boardDao.insert(board) == 0) {
throw new Exception("게시글 등록 실패!");
}
// 2) 첨부파일 등록
boardDao.insertFiles(board);
con.commit();
} catch (Exception e) {
con.rollback();
throw e;
} finally {
con.setAutoCommit(true);
}
}
...
Client 요청별로 Connection 객체를 생성한다.
Controller가 다른 Controller 안씀
Service가 다른 Service 안씀
DAO가 다른 DAO 안씀
com.bitcamp.sql.DataSource 클래스 생성
DataSource class
// 스레드 전용 DB 커넥션을 제공하는 일을 한다.
//
public class DataSource {
String jdbcUrl;
String username;
String password;
// 스레드 전용 DB 보관소 객체
ThreadLocal<Connection> conStore = new ThreadLocal<>();
public DataSource(String driver, String jdbcUrl, String username, String password) throws Exception{
//JDBC Driver 클래스 로딩하기
Class.forName(driver);
this.jdbcUrl = jdbcUrl;
this.username = username;
this.password = password;
}
public Connection getConnection() throws Exception {
Thread currThread = Thread.currentThread();
System.out.printf("%s => getConnection() 호출\n", currThread.getName());
// 현재 스레드의 보관소에서 DB 커넥션 객체를 꺼낸다.
Connection con = conStore.get();
if(con == null) { // 현재 스레드 보관소에 커넥션 객체가 없다면,
con = DriverManager.getConnection(jdbcUrl, username, password);
conStore.set(con); // 새로 만든 DB 커넥션 객체를 다음에 다시 사용할 수있도록 보관한다.
System.out.printf("%s => Connection 객체 생성\n", currThread.getName());
}
return con;
}
}
com.bitcamp.board.dao.MariaDBBoardDao 클래스 변경
com.bitcamp.board.dao.MemberDBBoardDao 클래스 변경
com.bitcamp.board.service.DefaultBoardService 클래스 변경
DefaultBoardService class
public class DefaultBoardService implements BoardService {
DataSource ds;
BoardDao boardDao;
public DefaultBoardService(BoardDao boardDao, DataSource ds) {
this.boardDao = boardDao;
this.ds = ds;
}
@Override
public void add(Board board) throws Exception {
ds.getConnection().setAutoCommit(false);
try {
// 1) 게시글 등록
if (boardDao.insert(board) == 0) {
throw new Exception("게시글 등록 실패!");
}
// 2) 첨부파일 등록
boardDao.insertFiles(board);
ds.getConnection().commit();
} catch (Exception e) {
ds.getConnection().rollback();
throw e;
} finally {
ds.getConnection().setAutoCommit(true);
}
}
...