DAY-29. Jdbc PreparedStatment ์‚ฌ์šฉ, Dateํƒ€์ž…

5 minute read

๐Ÿ” 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

  1. try() ๋ฌธ์•ˆ์—์„œ createStatement() ํ™œ์šฉ์‹œ ์ธ์ž๊ฐ’์„ ๋„ฃ์–ด์ฃผ์ง€ ์•Š๋Š”๋‹ค
  2. try๋ฌธ ์•ˆ์—์„œ sql๋ฌธ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค
  3. ์ฟผ๋ฆฌ๋ฌธ ์‹คํ–‰์„ ์œ„ํ•ด executeUpdate() / executeQuery()์— sql๋ฌธ์„ ๋„ฃ์–ด์ค€๋‹ค โ†’ executeUpdate(sql) / executeQuery(sql)

PreparedStatement

  1. PreparedStatement๋Š” ๋จผ์ € try๋ฌธ ์œ„์— sql ์ฟผ๋ฆฌ๋ฌธ์— ์ž…๋ ฅํ•  ๊ฐ’์œผ๋กœ ? ๋ฅผ ํ•ด์ค€๋‹ค
  2. try() ๋ฌธ์•ˆ์—์„œ con.preparedStatement() ์‚ฌ์šฉ์‹œ ์œ„์—์„œ ์ž‘์„ฑํ•œ sql๋ฌธ์„ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹คโ†’ con.prepareStatement(sql);
  3. try๋ฌธ ์•ˆ์—์„œ pstmt๋กœ ๊ฐ’์„ setํ•ด์ค€๋‹ค ์ด๋•Œ ?์˜ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ๋‹ค โ†’ ex) pstmt.setString(1, dto.getProduct_name();
  4. Statement์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฟผ๋ฆฌ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด executeUpdate() / executeQuery()๋ฅผ ํ•˜์ง€๋งŒ, ์ธ์ž๊ฐ’์œผ๋กœ sql์„ ๋„ฃ์–ด์ฃผ์ง€ ์•Š๋Š”๋‹ค
  5. 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);
	}
  1. ๋ฐ˜ํ™˜๊ฐ’์ด toJavaString์ธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค
  2. ์ด๋•Œ ์ธ์ž๊ฐ’์€ oracle์—์„œ ๋„˜์–ด์˜ค๋Š” date ํƒ€์ž…์˜ ๊ฐ’์ด๋‹ค
  3. ๊ทธ ๊ฐ’์„ SimpleDateFormat์˜ format์„ ์ด์šฉํ•ด String์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค
  4. String์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’์„ birth_date์— ๋„ฃ์–ด์ค€๋‹ค
  5. 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());
	}
}

์ถœ๋ ฅ

1.png

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;
}
  1. String์ธ register_date๋ฅผ date์˜ ํ˜•ํƒœ๋กœ ๋ฐ”๊พผ๋‹ค
  2. date๋กœ ๋ฐ”๋€ register_date๋ฅผ longํ˜•์œผ๋กœ ๋‹ด๋Š”๋‹ค
  3. longํ˜•์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” System.currentTimeMillis()์™€ regiser_date๋ฅผ ๋น„๊ตํ•ด๋ณธ๋‹ค

์ถœ๋ ฅ

public String toString() {
		return product_id +" : " +product_name + " : " +price + " : " +register_date ;
}

Categories:

Updated:

Leave a comment