카테고리 없음

[모각코 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으로 등록하여 인자로 넘겨준다.
  • 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메소드로 인자 치환