카테고리 없음
[모각코 12주차] 결과 13:00 ~ 16:00
ddd12347
2022. 9. 24. 22:52
JDBC
- 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API
- DBMS에 관계 없이 사용 가능함
- 구조
- jdbc api : 개발자가 주로 사용하는 DB에 접근하기 위한 API
- jdbc driver : dbms 벤더사에서 java.sql 인터페이스를 상속하여 메소드 몸체를 구현한 클래스 파일
- 클래스
- DriverManager : JVM에서 JDBC 전체를 관리하는 클래스, Driver 등록, Connection 연결 등
- Driver : 위의 jdbc driver
- Connection : DB와 연결성을 갖도록 하는 인터페이스
- Statement : SQL을 실행하도록 하는 인터페이스
- createStatement : Connection에서 statement를 생성하도록 하는 메소드
- preparedStatement : 동일한 SQL 문을 특정 값만 바꾸어 실행할 때 사용하는 인터페이스
- 위치홀더를 사용하여 SQL 문을 정의할 수 있고, “?”로 표현된다
- SQL문이 실행되기 전에 실제 값으로 대체된다.
- setXXXX(num, val) : num번째 위치홀더를 val로 대치할 수 있게 함
- sql injection 에 대응
- executeQuery : SQL 질의를 실행시키는 메소드, 인자로 SQL문을 담은 String 객체를 전달한다.
- ResultSet 인터페이스
- SQL문에서 SELECT문을 사용했을 때 성공 시 ResultSet을 반환함
- 커서로 ResultSet의 특정 행에 대해 참조 ex) next(), previous()
- flow
- DriverManager 객체를 통해서 Connection 객체를 받아온다.
- Connection 객체를 통해 Statement를 가져온다
- Statement를 통해 쿼리를 실행하여 ResultSet을 가져오거나 update를 실행한다.
- 데이터베이스 connection을 종료한다.
- DriverManager → Connection → Statement → ResultSet
var connection = DriverManager.getConnection( "jdbc:mysql://localhost/order_mgmt", // order_mgmt는 데이터베이스 "user", "password"); var statement = connection.createStatement(); var resultSet = statement.executeQuery("select * from customer"); // resultSet에 쿼리의 결과가 들어감 statement.close(); connection.close(); // 예외처리 없음
- try-catch-finally
- try 블록에서 예외가 발생하는 경우 코드 실행 중단
- catch 에 지정된 예외와 일치하면 catch 블록 실행
- finally : 예외 처리의 발생 여부에 관계 없이 무조건 실행
- try with resources
- try 구문에 리소스를 선언하고 리소스를 사용 후 자동으로 반납해주는 기능
- java.lang.AutoCloseable 인터페이스를 구현해야함
- 해당 구문을 사용하여 connection, statement, resultSet을 명시적으로 close하지 않아도 됨
try( var connection = DriverManager.getConnection( "jdbc:mysql://localhost/order_mgmt", "user", "password"); var statement = connection.createStatement(); var resultSet = statement.executeQuery("select * from customer"); // 자동으로 close 됨 ) { //..... } catch (SQLException throwable) { logger.error("Got error while closing connection"); }
JDBC
- 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API
- DBMS에 관계 없이 사용 가능함
- 구조
- jdbc api : 개발자가 주로 사용하는 DB에 접근하기 위한 API
- jdbc driver : dbms 벤더사에서 java.sql 인터페이스를 상속하여 메소드 몸체를 구현한 클래스 파일
- 클래스
- DriverManager : JVM에서 JDBC 전체를 관리하는 클래스, Driver 등록, Connection 연결 등
- Driver : 위의 jdbc driver
- Connection : DB와 연결성을 갖도록 하는 인터페이스
- Statement : SQL을 실행하도록 하는 인터페이스
- createStatement : Connection에서 statement를 생성하도록 하는 메소드
- preparedStatement : 동일한 SQL 문을 특정 값만 바꾸어 실행할 때 사용하는 인터페이스
- 위치홀더를 사용하여 SQL 문을 정의할 수 있고, “?”로 표현된다
- SQL문이 실행되기 전에 실제 값으로 대체된다.
- setXXXX(num, val) : num번째 위치홀더를 val로 대치할 수 있게 함
- sql injection 에 대응
- executeQuery : SQL 질의를 실행시키는 메소드, 인자로 SQL문을 담은 String 객체를 전달한다.
- ResultSet 인터페이스
- SQL문에서 SELECT문을 사용했을 때 성공 시 ResultSet을 반환함
- 커서로 ResultSet의 특정 행에 대해 참조 ex) next(), previous()
- flow
- DriverManager 객체를 통해서 Connection 객체를 받아온다.
- Connection 객체를 통해 Statement를 가져온다
- Statement를 통해 쿼리를 실행하여 ResultSet을 가져오거나 update를 실행한다.
- 데이터베이스 connection을 종료한다.
- DriverManager → Connection → Statement → ResultSet
var connection = DriverManager.getConnection( "jdbc:mysql://localhost/order_mgmt", // order_mgmt는 데이터베이스 "user", "password"); var statement = connection.createStatement(); var resultSet = statement.executeQuery("select * from customer"); // resultSet에 쿼리의 결과가 들어감 statement.close(); connection.close(); // 예외처리 없음
- try-catch-finally
- try 블록에서 예외가 발생하는 경우 코드 실행 중단
- catch 에 지정된 예외와 일치하면 catch 블록 실행
- finally : 예외 처리의 발생 여부에 관계 없이 무조건 실행
- try with resources
- try 구문에 리소스를 선언하고 리소스를 사용 후 자동으로 반납해주는 기능
- java.lang.AutoCloseable 인터페이스를 구현해야함
- 해당 구문을 사용하여 connection, statement, resultSet을 명시적으로 close하지 않아도 됨
try( var connection = DriverManager.getConnection( "jdbc:mysql://localhost/order_mgmt", "user", "password"); var statement = connection.createStatement(); var resultSet = statement.executeQuery("select * from customer"); // 자동으로 close 됨 ) { //..... } catch (SQLException throwable) { logger.error("Got error while closing connection"); }
DBCP
- Connection Pool
- 동시 접속자가 가질 수 있는 connection을 하나로 모아놓고 관리하는 개념
- Connection을 미리 만들어 pool속에 저장해 두고 필요할 때 pool에서 사용, 사용후 다시 pool로 반납함
- 특징
- 미리 connection이 생성되어 있으므로 Connection을 생성하는 데 드는 연결 시간이 소비되지 않고, 닫는 시간이 소비되지 않음 → 어플리케이션의 속도가 빨라짐
- Connection은 계속 재사용 되므로 생성되는 connection의 수가 많지 않음
- Connection 풀 내부의 connection의 개수는 한정적이므로 동시 접속자가 많아지면 대기해야함
- Connection이 미리 생성되므로 Connection pool의 크기를 크게 설정하면 메모리 소모가 큼
- DataSource
- java에서 제공하는 Connection pool을 관리하는 목적으로 사용되는 인터페이스
- Connection pool의 각각의 객체를 직접적으로 이용하면 체계적으로 관리하기 어렵기 때문에 사용
- DB와 관계된 Connection 정보를 담고 있으며, bean으로 등록하여 인자로 넘겨준다.
- java에서 제공하는 Connection pool을 관리하는 목적으로 사용되는 인터페이스
- HikariCP
- Spring Boot에서 기본적으로 사용하는 Connection Pool
var dataSource = DataSourceBuilder.create()
.url("jdbc:mysql://localhost/order_mgmt")
.username("root")
.password("password")
.type(HikariDataSource.class)
.build();
// hikariCP를 Connection Pool로 사용도록 dataSource 인스턴스를 가져옴
// dataSource는 인터페이스로 사용되므로 해당 인터페이스의 기능을 사용할 수 있다
// setMaximumPoolSize : 최대 Connection 개수
// setMinimumIdle : 최소 Connection 개수
var connection = dataSource.getConnection();
// hikariCP에서 Connection을 받아오는 코드
디자인 패턴
- 전략 패턴
- 클라이언트가 Context에게 문맥에 맞는 Strategy를 주입해주는 것
- ex) 인터페이스로 여러 전략을 구현해 놓고, 클라이언트가 context 객체에 전략 주입
- 템플릿 콜백 패턴
- 전략 패턴에서 주입되는 전략이 익명 내부 클래스인 패턴으로 람다식이 주입 가능하다.
- 템플릿 : 정해져 있는 틀, 전략 패턴에서 context를 템플릿이라 한다.
- 콜백 : 익명 내부 클래스로 만들어지는 오브젝트를 콜백이라고 한다.
- JDBC Template에서 사용되는 패턴
JDBC Template
- 기존의 JDBC API 보다 간결한 사용법을 제공해주고, 반복되는 코드를 줄이기 위해 사용
- Connection 객체, PreparedStatement 객체를 생성하고 ResultSet, PreparedStatement, Connection을 close 하는 반복을 줄여줌
- 생성할 때 DataSource가 필요함
- query 메소드
- List<T> query(String sql, RowMapper<T> rowMapper)
- sql 파라미터로 쿼리문을 전달받고, RowMapper을 이용하여 ResultSet 결과를 반환
- RowMapper는 함수형 인터페이스로 람다식으로 전달 가능함
- → RowMapper로 ResultSet 객체를 원하는 객체로 매핑 가능함
- queryForObject 메소드
- 결과를 리스트가 아닌 오브젝트로 받는 메소드
- 결과가 한 행인 경우에만 사용 가능함 (아닐 경우 예외 발생)
- update 메소드
- int update(String sql) 또는 int update(String sql, Object … args)
- sql문의 결과로 업데이트 되는 행의 개수를 반환함
- 내부적으로 PreparedStatement를 생성하여 set메소드로 인자 치환