DAY-29. Jdbc PreparedStatment ์ฌ์ฉ, Dateํ์
๐ 2022-04-12
๋ฐ์ดํฐ๋ฒ ์ด์ค - JDBC
โ ์์ ์ ๋ฃ๊ณ , ๊ฐ์ธ์ด ๊ณต๋ถํ ๋ด์ฉ์ ์ ์ ๊ฒ ์ด๊ธฐ์ ์ค๋ฅ๊ฐ ๋ง์ ์๋ ์์
2022-04-12
1๏ธโฃ Statement ํ์ฉ์ ๋ฌธ์ ์
๐งจ SQLInjection ์ํ ๋ฐ์
public class SQLInjection {
public static void main(String[] args) {
select("abc123","5555' or '1' = '1'"); // ์ค๋ฅ๊ฐ ๋์ผํ๋๋ฐ abc123 : 1234๊ฐ ์ถ๋ ฅ
}
public static void select(String id, String pw) {
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String username = "kh";
String password = "kh";
try(Connection con = DriverManager.getConnection(url,username,password);
Statement stmt = con.createStatement()){
// statement๋ฅผ ์ฌ์ฉํ๋ฉด SQLInjection ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํด์ง๋ค
String sql = "select * from tbl_member where id = '" + id +"' and pw = '" + pw +"'";
ResultSet rs = stmt.executeQuery(sql);
if(rs.next())
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
}catch(Exception e) {
e.printStackTrace();
}
}
}
๐ก SQLInjection ๋ฐฉ์ง๋ฅผ ์ํด PreparedStatement๋ฅผ ํ์ฉ
// PreparedStatement -> ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ธ์๊ฐ์ผ๋ก ๋๊ฒจ์ฃผ๋ sql๋ฌธ(์ฟผ๋ฆฌ๋ฌธ)์ ๋ฏธ๋ฆฌ DBMS์ ์ปดํ์ผ์ ์ฌ๋ ค๋
// ์ถํ์ ? ์๋ฆฌ์ set๋๋ ๊ฐ์ ๋ง๊ทธ๋๋ก ๊ฐ ๊ทธ ์์ฒด๋ก ๋ค์ด๊ฐ (๋ฌธ์์ด ์ธ์) -> or์ฐ์ฐ์๊ฐ ์๋จนํ
public static void select2(String id, String pw) {
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String username = "kh";
String password = "kh";
String sql = "select * from tbl_memeber where id =? and pw =?";
try(Connection con = DriverManager.getConnection(url,username,pw);
PreparedStatement pstmt = con.prepareStatement(sql);){
pstmt.setString(1, id);
pstmt.setString(2, pw);
ResultSet rs = pstmt.executeQuery();
if(rs.next())
System.out.println(rs.getString(1) + " : " + rs.getString(2));
}catch(Exception e) {
e.printStackTrace();
}
}
2๏ธโฃ Statement vs PreparedStatement ๋น๊ต
1. cafe.DAO(Statement) - insert
public int insert(CafeDTO dto) throws Exception {
try(Connection con = DriverManager.getConnection(url,username,password);
Statement stmt = con.createStatement()) {
String sql = "insert into cafe values(seq_cafe.nextval,'" + dto.getProduct_name() + "'," + dto.getPrice() +",sysdate)";
int rs = stmt.executeUpdate(sql);
return rs;
}
}
2. cafe.DAO(PreparedStatement) - insert
// ์์ธ ์ ๋ฌํ๊ธฐ
public int insert(CafeDTO dto) throws Exception {
// ์ฟผ๋ฆฌ๋ฌธ์์ ์ฝ์
ํ ๋ฌธ์๋ค์ ?๋ก ํด๋๊ณ ๋์ค์ setString์ ์ด์ฉํด ์ค์
String sql = "insert into cafe values (seq_cafe.nextval,?,?, sysdate)";
try(Connection con = DriverManager.getConnection(url,username,password);
PreparedStatement pstmt = con.prepareStatement(sql);) {
// ?์ ํด๋นํ๋ ์ธ์๊ฐ ์ธํ
-> ์ปฌ๋ผ์ ์๋ฃํ์ ๋ฐ๋ผ ์ธํ
pstmt.setString(1, dto.getProduct_name()); // ์ฟผ๋ฆฌ๋ฌธ์ ์ฒซ ๋ฒ์งธ ?์ ์ธ์๊ฐ -> 1 -> ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์๋
pstmt.setInt(2, dto.getPrice()); // ์ฟผ๋ฆฌ๋ฌธ์ ๋ ๋ฒ์งธ ?์ ์ธ์๊ฐ -> 2 -> ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์๋
// ์ฟผ๋ฆฌ๋ฌธ์ ์คํ
int rs = pstmt.executeUpdate(); // ์ธ์๊ฐ์ sql๋ก ๋๊ฒจ์ฃผ์ง ์๋๋ค
return rs;
}
}
๐ ์ ๋ฆฌ
Statement
- try() ๋ฌธ์์์ createStatement() ํ์ฉ์ ์ธ์๊ฐ์ ๋ฃ์ด์ฃผ์ง ์๋๋ค
- try๋ฌธ ์์์ sql๋ฌธ์ ๋ง๋ค์ด์ค๋ค
- ์ฟผ๋ฆฌ๋ฌธ ์คํ์ ์ํด executeUpdate() / executeQuery()์ sql๋ฌธ์ ๋ฃ์ด์ค๋ค โ executeUpdate(sql) / executeQuery(sql)
PreparedStatement
- PreparedStatement๋ ๋จผ์ try๋ฌธ ์์ sql ์ฟผ๋ฆฌ๋ฌธ์ ์ ๋ ฅํ ๊ฐ์ผ๋ก ? ๋ฅผ ํด์ค๋ค
- try() ๋ฌธ์์์ con.preparedStatement() ์ฌ์ฉ์ ์์์ ์์ฑํ sql๋ฌธ์ ๋ฃ์ด์ค์ผ ํ๋คโ con.prepareStatement(sql);
- try๋ฌธ ์์์ pstmt๋ก ๊ฐ์ setํด์ค๋ค ์ด๋ ?์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ๋ค โ ex) pstmt.setString(1, dto.getProduct_name();
- Statement์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ๊ธฐ ์ํด executeUpdate() / executeQuery()๋ฅผ ํ์ง๋ง, ์ธ์๊ฐ์ผ๋ก sql์ ๋ฃ์ด์ฃผ์ง ์๋๋ค
- set์ ํด์ฃผ๋ ค๋ฉด ์ปฌ๋ผ์ ์๋ฃํ์ ์์์ผํ๋ค
๐ ๊ฒฐ๋ก
๋ณด์๊ณผ ํธ์๋ฅผ ์ํด์ PreparedStatement๋ฅผ ์ฌ์ฉํ๋๊ฒ ๋ซ๋ค!
3๏ธโฃ Date ํ์ฉ
๐ก ์ค๋ผํด์ Date ํ์ ์ ๋ด๊ฐ ์ํ๋ ๋ฐฉ์์ผ๋ก ์ถ๋ ฅํ๋ ค๋ฉด?
1) MemberDAO์ ํจ์๋ฅผ ๋ง๋ค์ด ์ฌ์ฉ
MemberDTO
import java.sql.Date;
public class MemberDTO {
private String id;
private String pw;
private String birth_date; // ๊ธฐ์กด์ ํ
์ด๋ธ์์๋ Date์ด์ง๋ง String์ผ๋ก ๋ณํ
public MemberDTO() {}d
public MemberDTO(String id, String pw, String birth_date) {
this.id = id;
this.pw = pw;
this.birth_date = birth_date;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getBirth_date() {
return birth_date;
}
public void setBirth_date(String birth_date) {
this.birth_date = birth_date;
}
}
MemberDAO
public ArrayList<MemberDTO> selectAll() throws Exception {
String sql = "select * from tbl_member";
try(Connection con = DriverManager.getConnection(url,username,password);
PreparedStatement pstmt = con.prepareStatement(sql);) {
ResultSet rs = pstmt.executeQuery();
ArrayList<MemberDTO> list = new ArrayList<>();
while(rs.next()) {
String id = rs.getString(1);
String pw = rs.getString(2);
// ์ค๋ผํด์์ ๋์ด์จ dateํ์
์ ์๋ฐ์ Stringํ์
์ผ๋ก ๋ณํํ ๊ฐ์ birth_date์ ์ ์ฅ
String birth_date = toJavaString(rs.getDate(3));
list.add(new MemberDTO(id, pw, birth_date));
}
return list;
}
}
// ์ค๋ผํด์์ ๋์ด์จ dateํ์
์ ์๋ฐ์ Stringํ์
์ผ๋ก ๋ณ๊ฒฝํ๋ ํจ์
public String toJavaString(Date date) {
// oracle date ํ์
์ ๋ฐ์ดํฐ๋ฅผ java์ String์ผ๋ก ๋ณํ -> SimpleDateFormat
// ์์ฑ์์ ์ธ์๊ฐ์ String ์ผ๋ก ๋ณํํ ๋ ์ด๋ค ํ์์ผ๋ก ๋ณํํ ๊ฒ์ธ์ง format
// oracle ์(mm/MM) ๋ถ(mi)
// java ์()
// yyyy๋
MM์ dd์ผ ์ด๋ฐ์์ผ๋ก ์ถ๋ ฅํ๊ฒ ๋ค
SimpleDateFormat sdf = new SimpleDateFormat("yyyy๋
MM์ dd์ผ");
return sdf.format(date);
}
- ๋ฐํ๊ฐ์ด toJavaString์ธ ํจ์๋ฅผ ๋ง๋ ๋ค
- ์ด๋ ์ธ์๊ฐ์ oracle์์ ๋์ด์ค๋ date ํ์ ์ ๊ฐ์ด๋ค
- ๊ทธ ๊ฐ์ SimpleDateFormat์ format์ ์ด์ฉํด String์ผ๋ก ๋ณํํ๋ค
- String์ผ๋ก ๋ณํํ ๊ฐ์ birth_date์ ๋ฃ์ด์ค๋ค
- list.add๋ก birth_date ๊ฐ์ ๋ฃ๋๋ค
String โ Date : parse ์ฌ์ฉ, Date โ String : format ์ฌ์ฉ
Run
ArrayList<MemberDTO> list= dao.selectAll();
if(list != null) {
for(MemberDTO dto2 : list) {
System.out.println(dto2.getId() + " " + dto2.getPw() + " " + dto2.getBirth_date());
}
}
์ถ๋ ฅ
2) Date.valueOf(String) ์ผ๋ก ๊ฐ๋จํ๊ฒ ํด๊ฒฐ
- Date birth_date = Date.valueOf(sc.nextLine()); ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ๋ ๋ถํฐ ๋ณํ์ ํด์ค์ ๋ฃ๋๋ค
4๏ธโฃ ๋ ์ง(Date) ํ์ฉ
String โ Date : parse ์ฌ์ฉ
Date โ String : format ์ฌ์ฉ
CafeDTO
// register_date ๋งด๋ฒํ๋๋ฅผ ์ด์ฉํด์ ํ์ฌ์๊ฐ๊ณผ ๋ฑ๋ก์๊ฐ์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํด String๊ฐ์ผ๋ก ๋ฐํํด์ฃผ๋ ๋ฉ์๋
public String getTimestamp() {
// System.currentTimeMillis() -> ํ์ฌ ์๊ฐ์ longํ์ผ๋ก ๋ฐํ
// String ๋ฐ์ดํธ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ register_date๋ฅผ ์ผ๋จ longํ์ผ๋ก ๋ฐํ
// register_date๋ฅผ ๋จผ์ ์๋ฐ์ Date ํ์
์ผ๋ก ๋ณํ
SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
try {
//1. sdf์ ํ์์ฒ๋ผ ์๊ธด register_date String ๊ฐ์ ์๋ฐ์ Date ํ์ผ๋ก ๋ณํํ๋ ์์
-> parse
// ("yy-MM-dd HH:mm:ss")ํํ๋ก ๋ฐ๊พธ๊ธฐ ์ํด ์์
java.util.Date date = sdf.parse(this.register_date);
//2. getTime : ์๋ฐ์ date ํ์
๋ฐ์ดํฐ๋ฅผ longํ์ผ๋ก ๋ณํํด์ ๋ฐํํด์ฃผ๋ ๋ฉ์๋
long origin_date = date.getTime(); // ๋ฑ๋ก์ผ์ long ํ ๋ณํ
//3. ํ์ฌ์๊ฐ
long cur_date = System.currentTimeMillis();
// ๋ ์๊ฐ๊ฐ์ ๊ฐญ -> ์ด ๋จ์๋ก ๊ณ์ฐ
long gap_time = (cur_date - origin_date) / 1000;
int sec = 60;
int min = 60;
int hour = 24;
int day = 30;
int month = 12;
if(gap_time < sec) {
return gap_time + "์ด ์ ";
}
else if((gap_time/=sec) < sec) { // 1์๊ฐ ๋ฏธ๋ง์ด๋ผ๋ฉด ~๋ถ์ // ๋๋๋ฉด์ ๋๋์ด์ ๋์จ๊ฐ์ ๋ค์ ๋ฃ๋๋ค
return gap_time + "๋ถ ์ ";
}
else if((gap_time/=sec)< hour) { // 1์ผ -> 24์๊ฐ // gap_time์ 60์ด์์ ๊ฐ์ ๊ฐ์ง๊ณ ์์ ๊ฑฐ๋ค
// 60๋ถ ๊ธฐ์ค์ผ๋ก ๋ถ ๋จ์
// 1์ผ -> 24์๊ฐ
return gap_time + "์ ์ ";
}
else if((gap_time/=hour) < day) { // 30์ผ ๋ฏธ๋ง์ด๋ฉด ~์ผ ์
return gap_time + "์ผ ์ ";
}
else if((gap_time/=day) < month) {
return gap_time + "๊ฐ์ ์ ";
}
}catch(Exception e) {
e.printStackTrace();
}
return null;
}
- String์ธ register_date๋ฅผ date์ ํํ๋ก ๋ฐ๊พผ๋ค
- date๋ก ๋ฐ๋ register_date๋ฅผ longํ์ผ๋ก ๋ด๋๋ค
- longํ์ผ๋ก ๋ฐํ๋๋ System.currentTimeMillis()์ regiser_date๋ฅผ ๋น๊ตํด๋ณธ๋ค
์ถ๋ ฅ
public String toString() {
return product_id +" : " +product_name + " : " +price + " : " +register_date ;
}
Leave a comment