오브젝트와 의존관계

스프링은 오브젝트에 관한 설계와 동작 검증, 구조를 지속적으로 개선하는 테스트등의 여러가지 지식이 요구되는 프레임워크로써 오브젝트에 대한 관심과 객체지향 기술 이 제공하는 혜택과 목적성을 강조한다.

난감한 DAO

데이터 베이스를 이용해 데이터를 조회하거나 조작하는 기능을 전담하는 오브젝트이다. 자바 빈 객체를 DB라고 봤을때 그 객체에 관한 CRUD같은 DB관련 기능들을 정의해 사용하는 오브젝트이다.

✔️ JavaBean 디폴트 생성자를 가지고있고, getter/setter 프로퍼티를 소유한 오브젝트

###🔌 JDBC

  1. 드라이버 로딩 (JDBC Load)
    • Class.forName(“드라이버 Path”)
      • Class 클래스가 클래스의 정보(필드, 메서드 클래스의 종류)를 담는 메타 클래스이고 JVM은 해당 클래스의 정보를 로드한다.
  2. DB 연결 Connection
    • DriverManager.getConnection(url, ID, PWD)
      • Connection 객체를 생성한후
      • DriverManager에서 시스템 프로퍼티 “jdbc.drivers"에 참조된 드라이버 클래스를 로드한다.
      • 이후 Connection 객체에 할당
  3. 쿼리 생성 및 질의
    
    PreparedStatement psmt = null;
    psmt = conn.prepareStatement("SQL문");
    
    
    Statement stmt = null;
    stmt = conn.createStatement("SQL문");
    

    ✔️ PreparedStatement`는 쿼리에 ?로 매개변수를 받아 실행 가능

  4. 쿼리 실행
    • psmt.executeUpdate()
      • INSERT UPDATE DELETE 같은 값을 받아오지 않는 쿼리문은 psmt.executeUpdate()로 실행
    • psmt.executeQuery()
      • SELECT 처럼 결과 테이블이 필요한 쿼리문은 쿼리 실행 이전에 ResultSet객체를 생성한후 psmt.executeQuery()를 할당한다.
  5. ResultSet 처리
    while(rs.next()) {
        int i=1;
        int id = rs.getInt(i++);
        String name = rs.getString(i++);
        String addr = rs.getString(i++);
     }
    

    `

  1. Close()
    if (rs!=null) {
       try {
          rs.close();
       } catch (SQLException e) {
       }
    }
    
    if(stmt!=null) {
       try {
          stmt.close();
       } catch (SQLException e) {
       }
    }
    
    if(conn!=null) {
       try {
          conn.close();
       } catch (SQLException e) {
       }
    }
    

    ` ✔️ Open한 객체들의 역순으로 close 시킨다.

DAO의 분리

위의 6단계를 거친 DAO객체의 메서드 처리 과정은 객체지향의 특징과는 어긋나있는 점이 많다. 개발에게는 객체지향의 확장성과 유연함 을 고려한 설계가 요구되며 각각의 객체들에 대한 관심사의 구분 이 적절하게 나누어 질 수 있도록 설계해야 한다.

  • Connection 생성 과정의 중복 👉 독립적인 메소드를 만들어 분리 : 공통의 기능을 담당하는 메소드로 중복을 제거하는 것을 리팩토링에서는 메소드 추출이라 한다.

공통기능을 독립시키기

위에서 리팩토링한 DAO를 사용할 경우 Connection의 중복은 제거되었지만 객체지향의 유연한 특징은 발휘되지 않았다. DAO를 다른 환경에서 이용할때의 부분적인 수정이 이루어 지도록 하는 방법도 존재한다.

상속을 통한 확장

구현해놓은 메소드를 추상화 시키고 DAO 클래스를 상속받는 서브클래스를 만든다. 즉, 클래스의 계층구조를 나누어 분리시키는 것이다.

✔️ 위와같이 클래스를 추상화 시킨후 각각의 서브클래스들로부터 부분적인 부분을 각각 구현하는 방법을 ‘템플릿 메소드 패턴’ 이라고 한다.

❗ 상속을 이용한 확장은 간단하면서도 효과적이지만 다른 객체를 상속받을 수 없다는 점 ❗ 부모 클래스의 변경이 이루어 질 경우 적합성이 보장되지 않는다는 단점이 존재한다.

DAO의 확장

위에서 언급한 데이터 접근 로직과 DB연결 방법을 고려하는것은 다른 변화의 성격을 띄고있다. 앞서 언급한 각각의 방법 외에 다른 방법으로는 완전한 독립적인 클래스로 만드는것이 있다.

새로운 객체를 생성하는 경우

새로운 객체를 생성하여 사용하는것은 다시 유연성 확보에 관한 문제점을 야기한다.

인터페이스의 도입은 이러한 문제점을 해결할 수 있는 해결책으로 제시된다.

인터페이스를 이용한 추상화 방법은 클래스와 함께 인터페이스도 전달하여

개발자에게 전달된 인터페이스의 구현을 행하도록 하는것이다.