부트캠프수업정리

5주차 정리(2/3~2/4)

파뱁 2022. 2. 4. 23:43
728x90

설연휴가 있던 주간이라 실질적인 수업은 한번 진행되었다.

 

이번주에는 AWS와 MySQL을 연동해보는 작업을 했다.

 

AWS는 자칫하면 바로 요금이 부과되기 때문에 RDS를 설정하는 것도 굉장히 신경써야 했다.

특히 스냅샷 관련한 건 왠만하면 안하는 게 좋다. 요금이 나도 모르게 부과될 수도 있기 때문이다.

 

또한 사용하지 않을 때는 가급적 종료하는 것이 좋다

 

이전에 이클립스를 통해 로컬에서의 oracle DB 에 접근하는 코드를 본적이 있는데, 이를 응용해서 RDS와 연결하는 자바 코드도 짜보았다.

 

package step01.basic;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCTest2 {

	public static void main(String[] args) {
		//insert();
		select();
	}
	//특정 데이터를 메소드 내부에 구성해서 저장
	public static void insert() {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			
			String url = "jdbc:mysql://[로컬호스트 혹은 RDS 엔드포인트]:3306/[database 이름]?serverTimezone=UTC";
			Connection con = DriverManager.getConnection(url,[유저],[패스워드]);

			Statement stmt = con.createStatement();
			
			int rset = stmt.executeUpdate("insert into dept values(60, 'a','b')");
			
			System.out.println(rset+ " 행 저장 성공");
			
			stmt.close();
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static void select() {
		try {
			//드라이버 로딩
			Class.forName("com.mysql.cj.jdbc.Driver");
			System.out.println("--");
			//접속
			String url = "jdbc:mysql://[로컬호스트 혹은 RDS 엔드포인트]:3306/[database 이름]?serverTimezone=UTC";
			Connection con = DriverManager.getConnection(url,[유저],[패스워드]);

			Statement stmt = con.createStatement();
			
			//sql문장 실행
			ResultSet rset = stmt.executeQuery("select * from dept");
			
			//실행결과 활용
			while(rset.next()) {
				System.out.println(rset.getInt("deptno") + "\t"+
									rset.getString("dname") + "\t"+
									rset.getString("loc"));
			}
			
			//자원 반환 - ResultSet -> Statement -> connection
			rset.close();
			stmt.close();
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

이 코드를 중복 코드 등을 고려하여 리팩토링 하면 다음과 같다.

 

DeptDAO.java

/*
 * 1.중복 코드 분리
 * 2. 최적의 구조로 변환
 * 3. 코드 리팩토링
 * 
 * DBUtil.java - 모든 DAO들이 공유하는 로직으로만 구성
 */
package step02.app;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import util.DBUtil;

public class DeptDAO {

	public static void main(String[] args) {
		//insert();
		select();
	}
	//특정 데이터를 메소드 내부에 구성해서 저장
	public static void insert() {
		//try 블록 내에서 선언된 변수는 try 외부에선 사용 불가
		Connection con = null;
		Statement stmt = null;
		try {
			con = DBUtil.getConnection();
			
			stmt = con.createStatement();
			
			int rset = stmt.executeUpdate("insert into dept values(60, 'a','b')");
			
			System.out.println(rset+ " 행 저장 성공");
			
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DBUtil.close(con, stmt);
		}
	}
	public static void select() {
		Connection con = null;
		Statement stmt = null;
		ResultSet rset = null;
		try {
			con = DBUtil.getConnection();
			
			stmt = con.createStatement();
			
			//sql문장 실행
			rset = stmt.executeQuery("select * from dept");
			
			//실행결과 활용
			while(rset.next()) {
				System.out.println(rset.getInt("deptno") + "\t"+
									rset.getString("dname") + "\t"+
									rset.getString("loc"));
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			DBUtil.close(con, stmt, rset);
		}
	}

}

 

DBUtil.java

//모든 DAO가 공통적으로 사용되는 코드들로만 구성된 최적의 구조
package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBUtil {
	/*
	 * 단한번 백퍼센트 실행 보장
	 * 이름이 없기때문에 호출 불가
	 * 누구나가 공유하는 자원을 한번만 초기화 하고자 하는 로직으로 개발
	 */
	static {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	//절대 공유해서는 안됨, 요청시마다 새로 생성해서 제공
	//접속 성공시 커넥션 객체 반환/접속 , 실패시 예외 반환
	/*
	 * 예외처리는 문제가 생기면 반드시 호출한 곳에서도 상활 파악 필수
	 * try~catch로 예외 처리보다 throws로 상황에 대한 알림으로도 사용
	 */
	public static Connection getConnection() throws SQLException {
		String url = "jdbc:mysql://[로컬호스트 혹은 RDS 엔드 포인트]:3306/[database 이름]?serverTimezone=UTC";
		return DriverManager.getConnection(url,[유저],[패스워드]);

	}
	
	//모든 DAO 클래스들의 모든 메소드가 반드시 실행하는 자원반환 로직의 메소드
	//select : ResultSet -> Statement -> connection
	public static void close(Connection con, Statement stmt, ResultSet rset) {
		try {
			if(rset != null) {
				rset.close();
				rset = null;
			}
			if(stmt != null) {
				stmt.close();
				stmt = null;
			}
			if(con != null) {
				con.close();
				con = null;
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	//insert, update, delete : Statement -> connection
	public static void close(Connection con, Statement stmt) {
		try {
			if(stmt != null) {
				stmt.close();
				stmt = null;
			}
			if(con != null) {
				con.close();
				con = null;
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
728x90
반응형

'부트캠프수업정리' 카테고리의 다른 글

7주차 정리(2/14~2/18)  (0) 2022.02.21
6주차 정리(2/7~2/11)  (0) 2022.02.14
4주차 정리(1/24~1/28)  (0) 2022.01.28
3주차 정리(1/17~1/21)  (0) 2022.01.21
2주차 정리(1/11~1/14)  (0) 2022.01.14