JDBC의 SQL Injection 대응

정확히는 JDBC 내부적으로 SQL Injection에 대응하고 있다. PreparedStatement 클래스를 예로 들면 setString() 메서드에 내부적으로 SQL Injection에 대응하고 있기 때문에 안전하게 사용할 수 있다. https://www.baeldung.com/sql-injection 따라서 아래와 같은 코드를 작성하지 않도록 조심하자. String sql = "select " + "customer_id,acc_number,branch_id,balance " + "from Accounts where customer_id = '" + customerId + "'"; Connection c = dataSource.getConnection(); ResultSet rs = c.createStatement().executeQuery(sql); select count(1) from user where id = ? and password = ?

2024-09-15 · 1 min · 70 words

JDBC에서 모든 테이블 이름 찾기

Rest Assured를 통한 E2E 테스트 진행시, 모든 테스트를 독립적으로 만들기 위해 각 테스트마다 모든 테이블을 TRUNCATE 할 필요가 있었다. 그래서 모든 테이블의 이름을 찾는 과정이 필요했다. DatabaseMetaData 를 통해 찾을 수 있다고 한다. DatabaseMetaData는 Connection을 통해 얻을 수 있다. 나같은 경우 Spring을 사용하고 있어서 JdbcTemplate를 통해서 구할 수 있었다. private void truncateAllTables() throws SQLException { JdbcTestUtils.deleteFromTables(jdbcTemplate, getAllTables().toArray(new String[0])); } private List<String> getAllTables() throws SQLException { DatabaseMetaData metaData = jdbcTemplate.getDataSource().getConnection().getMetaData(); List<String> tables = new ArrayList<>(); try (ResultSet resultSet = metaData....

2024-09-15 · 1 min · 104 words

JDBC에서 MySQL의 COUNT 함수 리턴 타입

배경 MyBatis를 이용해 특정 id별 COUNT 결과를 Pair<Long, Int> 로 리턴했더니, 타입 캐스팅 예외가 발생했다. java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer 문제 상황 예시 코드 @Select("...") fun countByIds(ids: List<Long>): List<Pair<Long, Int>> 원인 MySQL의 COUNT 함수의 리턴 타입은 BIGINT 이다. MySQL JDBC Driver 에서 BIGINT는 기본적으로 Java의 Long 타입으로 변환되므로 타입 캐스팅 예외가 발생한다. 참고 자료 https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_count https://dev.mysql.com/doc/connector-j/en/connector-j-reference-type-conversions.html

2024-09-15 · 1 min · 58 words

JDBC execute vs executeQuery vs executeUpdate

execute: 일반적인 sql 실행. 리턴 타입이 ResultSet이면 TRUE, 아니면 false다. executeQuery: 특정 데이터를 탐색할 때 사용하는 메소드. 리턴타입이 ResultSet이다. executeUpdate: DML, DDL 등을 입려할 때 사용하는 메소드. 리턴타입이 int로 영향받은 행의 개수를 반환한다. 참고 자료 https://javaconceptoftheday.com/difference-between-executequery-executeupdate-execute-in-jdbc/

2024-09-15 · 1 min · 36 words