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 |