DAO
1.1~1.3
1. DAO
DAO (Data Access Object)
- DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트
빈(자바빈, JavaBean)
- 디폴트 생성자: 자바빈은 파라미터가 없는 디폴트 생성자를 소유, 툴이나 프레임워크에서 리플렉션을 이용한 오브젝트 생성에 필요
- 프로퍼티: 자바빈이 노출하는 이름을 가진 속성, 프로퍼티는 set으로 시작하는 수정자 메서드(setter)와 get으로 시작하는 접근자 메서드(getter)를 이용해 수정 및 조회 가능
JDBC를 이용하는 작업의 일반적인 순서
- DB 연결을 위한 Connection 가져옴
- SQL을 담은 Statement(또는 PreparedStatement)생성
- 만들어진 Statement 실행
- 조회의 경우 SQL 쿼리의 실행 결과를 ResultSet으로 받아서 정보를 저장할 오브젝트로 옮김
- 작업 중에 생성된 COnnection, Statement, ResultSet 같은 리소스는 작업을 마친 후 반드시 닫기
- JDBC API가 만드는 예외를 잡아서 직접 처리하거나, 메서드에 throws를 선언해서 예외가 발생하면 메서드 밖으로 던지게 구현
2. DAO의 분리
객체지향에서의 관심사의 분리
- 관심이 같은 것은 하나의 객체로, 또는 가까운 객체로 통합
- 관심이 다른 것은 가능한 한 서로 영향을 주지 않도록 분리
보편적인 DAO의 관심 사항
- DB connection 가져오기
- DB에 보낼 SQL 생성
- DB에 SQL 송신
- 작업이 끝나면 공유 리소스 반환
리팩토링(Refactoring)
- 기존의 코드를 외부의 동작 방식에는 변화 없이 내부 구조를 변경해서 재구성하는 작업 혹은 기술
- 코드 내부의 설계가 개선되어 코드 품질 및 생산성 향상
- 코드 스멜
- 코드의 문제가 일어날 수 있는 부분
- 리팩토링으로 해결 가능함
- 코드 중복은 흔하고 대표적인 코드 스멜
상속을 통한 분리
- DAO의 DB connection 기능은 DB에 따라서 구현이 달라 질 수 있음
- DB Connection을 슈퍼 클래스의 추상 메서드로 구현하고 서브클래스에서 상속받아 구현하면 DB가 달라져도 슈퍼 클래스 재사용 가능
DAO의 확장
클래스의 분리
- DB Connection을 새로운 클래스(이하 ConnectionMaker)의 메서드에 구현
- DAO클래스에 ConnectionMaker타입 멤버 필드 생성
- 초기화 할 때 멤버필드에 ConnectionMaker 객체 생성
- DAO클래스의 메서드에서 사용
관계 설정 책임의 분리
- DB Connection을 인터페이스로 구현
- DB Connection 인터페이스를 구현한 CDBConnection 클래스 구현
- DAO클래스의 생성자의 파라미터로 DB Connection 설정
- DAO클래스를 생성할 때 CDBConnection의 인스턴스로 호출
- 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