3 minute read

1.1~1.3

1. DAO

DAO (Data Access Object)

  • DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트

빈(자바빈, JavaBean)

  • 디폴트 생성자: 자바빈은 파라미터가 없는 디폴트 생성자를 소유, 툴이나 프레임워크에서 리플렉션을 이용한 오브젝트 생성에 필요
  • 프로퍼티: 자바빈이 노출하는 이름을 가진 속성, 프로퍼티는 set으로 시작하는 수정자 메서드(setter)와 get으로 시작하는 접근자 메서드(getter)를 이용해 수정 및 조회 가능

JDBC를 이용하는 작업의 일반적인 순서

  1. DB 연결을 위한 Connection 가져옴
  2. SQL을 담은 Statement(또는 PreparedStatement)생성
  3. 만들어진 Statement 실행
  4. 조회의 경우 SQL 쿼리의 실행 결과를 ResultSet으로 받아서 정보를 저장할 오브젝트로 옮김
  5. 작업 중에 생성된 COnnection, Statement, ResultSet 같은 리소스는 작업을 마친 후 반드시 닫기
  6. JDBC API가 만드는 예외를 잡아서 직접 처리하거나, 메서드에 throws를 선언해서 예외가 발생하면 메서드 밖으로 던지게 구현

2. DAO의 분리

객체지향에서의 관심사의 분리

  • 관심이 같은 것은 하나의 객체로, 또는 가까운 객체로 통합
  • 관심이 다른 것은 가능한 한 서로 영향을 주지 않도록 분리

보편적인 DAO의 관심 사항

  • DB connection 가져오기
  • DB에 보낼 SQL 생성
  • DB에 SQL 송신
  • 작업이 끝나면 공유 리소스 반환

리팩토링(Refactoring)

  • 기존의 코드를 외부의 동작 방식에는 변화 없이 내부 구조를 변경해서 재구성하는 작업 혹은 기술
  • 코드 내부의 설계가 개선되어 코드 품질 및 생산성 향상
  • 코드 스멜
    • 코드의 문제가 일어날 수 있는 부분
    • 리팩토링으로 해결 가능함
    • 코드 중복은 흔하고 대표적인 코드 스멜

상속을 통한 분리

  • DAO의 DB connection 기능은 DB에 따라서 구현이 달라 질 수 있음
  • DB Connection을 슈퍼 클래스의 추상 메서드로 구현하고 서브클래스에서 상속받아 구현하면 DB가 달라져도 슈퍼 클래스 재사용 가능

DAO의 확장

클래스의 분리

  1. DB Connection을 새로운 클래스(이하 ConnectionMaker)의 메서드에 구현
  2. DAO클래스에 ConnectionMaker타입 멤버 필드 생성
  3. 초기화 할 때 멤버필드에 ConnectionMaker 객체 생성
  4. DAO클래스의 메서드에서 사용

관계 설정 책임의 분리

  1. DB Connection을 인터페이스로 구현
  2. DB Connection 인터페이스를 구현한 CDBConnection 클래스 구현
  3. DAO클래스의 생성자의 파라미터로 DB Connection 설정
  4. DAO클래스를 생성할 때 CDBConnection의 인스턴스로 호출
  5. DB Connection을 구현한 클래스가 DAO클래스 외부에 없음 → 관계 설정 책임의 분리

객체지향 설계 원칙(SOLID)

  • SRP(the Single Responsibility Principle): 단일 책임 원칙
  • OCP(the Open Closed Principle): 개방 폐쇄 원칙
  • LSP(the Liskov Substitution Principle): 리스코프 치환 원칙
  • ISP(the Interface Segregation Principle): 인터페이스 분리 원칙
  • DIP(the Dependency Inversion Principle): 의존관계 역전 원칙

개방 폐쇄 원칙

  • 클래스나 모듈은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 함
  • 예시

    DAO구현에서 외부 리소스인 DB와의 연결은 생성자에서 DB연결을 구현한 클래스의 인스턴스를 가져와 처리함으로써 어떤 DB를 사용하더라도 호환 가능하고(확장에 열림), DAO의 핵심 기능을 구현한 코드는 확장에 영향을 받지 않는다(변경에 닫힘)

Leave a comment