[JDBC] Layered Architecture

jy9922·2022년 7월 21일
0

Java

목록 보기
10/13
post-thumbnail

Layered Architecture🔧

  • 각 레이어는 자기가 맡은 역할을 해야 된다.
  • 데이터가 왔다갔다할 때 DTO, VO, DO, Entity, Bean 등 여러가지 표현을 사용한다.

SimpleBookSearch (View)

package lecture0721.simplebookserarch;


import java.util.ArrayList;
import org.apache.commons.dbcp2.BasicDataSource;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
import lecture0721.simplebookserarch.service.BookService;
import lecture0721.simplebookserarch.vo.BookVO;

public class SimpleBookSearch extends Application{
	TextArea textarea;
	Button connBtn, connBtn2;
	TextField textfield;
	
	
	private static BasicDataSource basicDS;
	
	@Override
	public void start(Stage primaryStage) throws Exception {
		
		// service 객체
		BookService service = new BookService();
		
		// 화면 구성
		BorderPane root = new BorderPane();
		root.setPrefSize(700, 500); // window 크기
		
		textarea = new TextArea();
		root.setCenter(textarea); // 화면 center에 textarea를 붙여요!
		
		textfield = new TextField();
		textfield.setPrefSize(350, 40);
		
		connBtn = new Button("키워드 검색");
		connBtn.setPrefSize(150, 40); // 버튼의 크기
		connBtn.setOnAction(e ->{
			textarea.clear();
			ArrayList<BookVO> result = service.bookSearchByKeyword(textfield.getText());
			for(BookVO i: result) {
				textarea.appendText(i.getBtitle()+", "+i.getBauthor()+", "+i.getBisbn()+"\n");
			}
			textfield.clear();
		});
		
		
		connBtn2 = new Button("ISBM으로 삭제");
		connBtn2.setPrefSize(150, 40); // 버튼의 크기
		connBtn2.setOnAction(e ->{
			textarea.clear();
			String result = service.bookDeleteByISBN(textfield.getText());
			textarea.appendText(result);
			textfield.clear();
			
		});
		
		
		FlowPane flowPane = new FlowPane();
		flowPane.setPadding(new Insets(10, 10, 10, 10)); // 여백을 줘요!
		flowPane.setPrefSize(700, 40);
		flowPane.setHgap(10);
		flowPane.getChildren().add(connBtn); // 버튼 부착
		flowPane.getChildren().add(textfield); // 입력상자 부착
		flowPane.getChildren().add(connBtn2);
		
		root.setBottom(flowPane);
		
		
		// 화면에 띄우기 위한 코드
		Scene scene = new Scene(root);
		primaryStage.setScene(scene);
		primaryStage.show();
		
	}
	public static void main(String[] args) {
		launch(); // 화면에 창을 띄우는 준비 작업 완료!
	}

}

BookService (Service)

package lecture0721.simplebookserarch.service;

import java.util.ArrayList;

import lecture0721.simplebookserarch.dao.BookDAO;
import lecture0721.simplebookserarch.vo.BookVO;

public class BookService {
	// 해야할 일 : 검색, 삭제
	private BookDAO dao;
	
	public BookService() {
		this.dao = new BookDAO();
	}
	public ArrayList<BookVO> bookSearchByKeyword(String keyword) {
		// 키워드를 이용해서 책을 찾는 로직 처리
		// for, if 등 다양한 로직처리가 일반적으로 나오는데
		// 우리는 Database 처리를 해야 한다.
		ArrayList<BookVO> result = dao.select(keyword);
		return result;
		
	}
	public String bookDeleteByISBN(String bisbn) {
		// 책 고유번호를 받아서 해당 책을 삭제하는 로직 처리
		String result = dao.delete(bisbn);
		return result;
	}
}

BookDAO

package lecture0721.simplebookserarch.dao;

import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSource;

import lecture0721.simplebookserarch.vo.BookVO;

public class BookDAO {
	private static BasicDataSource basicDS;
	public BookDAO(){
		try {
			basicDS = new BasicDataSource();
			Properties properties = new Properties();
			
			InputStream is = new FileInputStream("resources/db.properties");
			properties.load(is); // 가지고 온 파일을 properties 객체로 받아드림
			
			basicDS.setDriverClassName(properties.getProperty("DRIVER_CLASS"));
			basicDS.setUrl(properties.getProperty("JDBC_URL"));
			basicDS.setUsername(properties.getProperty("DB_USER"));
			basicDS.setPassword(properties.getProperty("DB_PASSWORD"));
			
			// 어떻게 설정해야 하나요?
			basicDS.setInitialSize(10);
			basicDS.setMaxTotal(10);
			
			
		} catch (Exception e) {
			// TODO: handle exception
		}
	
	}
	public static DataSource getDataSource() {
		return basicDS;
	}
	public ArrayList<BookVO> select(String keyword) {
		ArrayList<BookVO> list = null;
		ResultSet rs = null;
		PreparedStatement pstmt = null;
		Connection con = null;
		try {
			DataSource ds = getDataSource();
			
			try {
				
				con = ds.getConnection();
				con.setAutoCommit(false);
				
				String sql = "SELECT * FROM book WHERE btitle LIKE '%"+keyword+"%'";
				pstmt = con.prepareStatement(sql);
				
				rs = pstmt.executeQuery();
				con.commit();
				
				// ArrayList에 책 한권에 해당되는 정보를 하나씩 넣어주기
				list = new ArrayList<BookVO>();
				while (rs.next()) {
					BookVO tmp = new BookVO();

					tmp.setBtitle(rs.getString("btitle"));
					tmp.setBauthor(rs.getString("bauthor"));
					tmp.setBisbn(rs.getString("bisbn"));
					
					list.add(tmp);
				}
			
			} catch (SQLException e1) {
				System.out.println(e1);
			}
		
		} catch (Exception e2) {
			
		} finally {
			// 6. 사용한 자원을 해제해요!
			try {
				if (rs != null) rs.close();
				if (pstmt != null) pstmt.close();
				if (con != null) con.close();
			} catch (Exception e3) {
				// TODO: handle exception
			}
		}
		return list;
		
	}
	public String delete(String bisbn) {
		ArrayList<BookVO> list = null;
		ResultSet rs = null;
		PreparedStatement pstmt = null;
		Connection con = null;
		String msg = "";
		try {
			DataSource ds = getDataSource();
			
			try {
				
				con = ds.getConnection();
				con.setAutoCommit(false);
				
				String sql = "DELETE FROM BOOK where bisbn = '"+bisbn+"'";
				pstmt = con.prepareStatement(sql);
				
				int result = pstmt.executeUpdate();
				con.commit();
				
				// ArrayList에 책 한권에 해당되는 정보를 하나씩 넣어주기
				if (result >= 1) {
					msg = "삭제 완료!\n";
				} else {
					msg = "/n 삭제 할 자료가 없습니다..!/n";
				}
			
			} catch (SQLException e1) {
				System.out.println(e1);
			}
		
		} catch (Exception e2) {
			
		} finally {
			// 6. 사용한 자원을 해제해요!
			try {
				if (rs != null) rs.close();
				if (pstmt != null) pstmt.close();
				if (con != null) con.close();
			} catch (Exception e3) {
				// TODO: handle exception
			}
		}
		return msg;

	}
}

BookVO

package lecture0721.simplebookserarch.vo;

public class BookVO {
	// BookVO는 책 한권, 한권을 의미함
	// desc table; 을 가리키는 형태
	// 필드는 무조건 private
	// 책에 대한 column명을 모두 명시(원칙)
	private String bisbn;
	private String btitle;
	private String bdate;
	private int bpage;
	private int bprice;
	private String bauthor;
	
	public BookVO() {
		
	}

	public String getBisbn() {
		return bisbn;
	}

	public void setBisbn(String bisbn) {
		this.bisbn = bisbn;
	}

	public String getBtitle() {
		return btitle;
	}

	public void setBtitle(String btitle) {
		this.btitle = btitle;
	}

	public String getBdate() {
		return bdate;
	}

	public void setBdate(String bdate) {
		this.bdate = bdate;
	}

	public int getBpage() {
		return bpage;
	}

	public void setBpage(int bpage) {
		this.bpage = bpage;
	}

	public int getBprice() {
		return bprice;
	}

	public void setBprice(int bprice) {
		this.bprice = bprice;
	}

	public String getBauthor() {
		return bauthor;
	}

	public void setBauthor(String bauthor) {
		this.bauthor = bauthor;
	}
	

}

0개의 댓글