ABOUT ME

Today
Yesterday
Total
  • [모각코 12주차] 결과 13:00 ~ 16:00
    카테고리 없음 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메소드로 인자 치환
Designed by Tistory.