티스토리 뷰

스프링을 사용하는 이유에 대해서 순차적으로 알아보기.


[문제점]

- 기존 자바로 JDBC 를 구현하기 위해서는 lib에 jar 파일을 넣고, Driver 로딩 , 커넥션 연결, SQL 명령어 작성,  PreparedStatement에 값 설정 쿼리 실행 결과값 제어 자원반납과 같은 순으로 작업을 해야한다.

여기서 우리는 항상 커넥션 관리를 매번 해야 하나 ? 
close를 위한 try-catch-finally 구문 같은 부분도 가독성이 떨어진다.
select 명령어 실행 후에는 결과값을 핸들링 까지 해줘야 한다.

이러한 문제점을 스프링에서는 조금 더 효과적으로 개발할 수 있게 도와주지만 지금은 기존 자바 버전의 불편한 점부터 느껴보도록 하겠다.
( 물론 이전부터 이런식으로 JDBC 연동을 하였기 때문에 이런 작업이 더 편하고 익숙해진 나다. )


스프링 작업환경에서 기존 자바 버전의 JDBC 구현이므로 메이븐을 이용해 jar 파일은 가져와보자.
혹여 스프링 작업환경 구축이 안되어 있다면, JDBC jar 파일을 다운 받아 사용해야 한다.

jar 파일 받기 좋은 곳

메이븐 이용해 가져오기 ( pom.xml 설정 )


		
		
			mysql
			mysql-connector-java
			5.1.38
		

Mysql 로 테이블 생성하기 (오라클도 상관 x)

create table book(
book_num number,
title varchar2(50),
publisher varchar2(50),
price number,
writer varchar2(50)
);

BookDao 작성

package test01_jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import vo.BookVO; public class BookDao { public int insertBook(BookVO book) { Connection con = null; PreparedStatement pstmt = null; int result = 0; try { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/사용할테이터베이스", "사용자", "비밀번호"); String sql = "insert into book" + "(title,price,publisher,writer)" + " values(?,?,?,?)"; pstmt = con.prepareStatement(sql); pstmt.setString(1, book.getTitle()); pstmt.setInt(2, book.getPirce()); pstmt.setString(3, book.getPublisher()); pstmt.setString(4, book.getWriter()); result = pstmt.executeUpdate(); } catch (ClassNotFoundException e) { System.out.println("드라이버 로딩 오류"); e.printStackTrace(); } catch (SQLException e) { System.out.println("Mysql IP주소, 아이디, 비밀번호 확인"); e.printStackTrace(); } finally { if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { System.out.println("pstmt 반납 실패"); e.printStackTrace(); } } if (con != null) { try { con.close(); } catch (SQLException e) { System.out.println("con 반납 실패"); e.printStackTrace(); } } } // finally 끝 return result; }// insert Book 끝 public List

selectAll() { Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; List bookList = new ArrayList<>(); try { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/사용할테이터베이스", "사용자", "비밀번호"); String sql = "select book_num,title,price,publisher,writer from book"; pstmt = con.prepareStatement(sql); rs = pstmt.executeQuery(); while (rs.next()) { BookVO book = new BookVO(); book.setBookNum(rs.getInt(1)); book.setTitle(rs.getString(2)); book.setPirce(rs.getInt(3)); book.setPublisher(rs.getString(4)); book.setWriter(rs.getString(5)); bookList.add(book); } } catch (ClassNotFoundException e) { System.out.println("드라이버 로딩 오류"); e.printStackTrace(); } catch (SQLException e) { System.out.println("Mysql IP주소, 아이디, 비밀번호 확인"); e.printStackTrace(); } finally { if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { System.out.println("selectAll 반납 오류"); e.printStackTrace(); } } // if 끝 if (con != null) { try { con.close(); } catch (SQLException e) { System.out.println("selectAll 반납 오류"); e.printStackTrace(); } } if (rs != null) { try { rs.close(); } catch (SQLException e) { System.out.println("selectAll 반납 오류"); e.printStackTrace(); } } } return bookList; } }// class 끝

간단한 Test 클래스 작성

package test01_jdbc;

import vo.BookVO;

public class Test {
	
	public static void main(String[] args) {
		
		BookDao dao = new BookDao();
		
		
		//테이블 삽입하기. (이부분 주석 풀고 테이블 들어가는지 확인하기 )
		
//		BookVO book = new BookVO("테이블 들어가나","확인해봐요",25000,"확인");
		
//		int result = dao.insertBook(book);
		
//		System.out.println("insert result:"+result);
		
		
		//전체 테이블 확인하기 .
		for(BookVO b : dao.selectAll()) {
			System.out.println(b);
		}
		

		
		
	}

}

BookVO (BookDTO, BookBean 편한대로 명칭쓰자.. Getter Setter 니까..)

package vo;

public class BookVO {
	
	private int bookNum;
	private String title;
	private String writer;
	private int pirce;
	private String publisher;
	
	
	public BookVO() {
		
	}
	
	public BookVO( String title, String writer, int pirce, String publisher) {
		this.title = title;
		this.writer = writer;
		this.pirce = pirce;
		this.publisher = publisher;
	}
	
	
	public BookVO(int bookNum, String title, String writer, int pirce, String publisher) {
		super();
		this.bookNum = bookNum;
		this.title = title;
		this.writer = writer;
		this.pirce = pirce;
		this.publisher = publisher;
	}
	public int getBookNum() {
		return bookNum;
	}
	public void setBookNum(int bookNum) {
		this.bookNum = bookNum;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public int getPirce() {
		return pirce;
	}
	public void setPirce(int pirce) {
		this.pirce = pirce;
	}
	public String getPublisher() {
		return publisher;
	}
	public void setPublisher(String publisher) {
		this.publisher = publisher;
	}


	@Override
	public String toString() {
		return "BookVo [bookNum=" + bookNum + ", title=" + title + ", writer=" + writer + ", pirce=" + pirce
				+ ", publisher=" + publisher + "] \n";
	}
	
	

}



여기서 문제점은?


위에 언급했듯이 매번 우리는 커넥션을 해줘야 하고, 자원들을 관리해줘야 하며, 개발자가 SQL문까지 신경써야 하는 일이 생겼다.

물론 중복 코드는 따로 클래스를 만들어 관리해줄 수는 있지만, 여전히 모든 부분에 신경써야 함은 변함이 없다.

이를 스프링에서 객체관리를 통해 조금 더 편하게 관리 할 수 있는 버전으로 만들어 보도록 하겠다.







댓글
공지사항
글 보관함
최근에 올라온 글
최근에 달린 댓글