DAO의 분리
1. 관심사의 분리
- 관심이 같은 것끼리 하나의 객체 안으로 또는 모이게 하고, 관심이 다른 것은 가능한 따로 떨어져서 서로 영향을 주지 않도록 분리한다.
2. 커넥션 만들기의 추출
- 전편의 DAO 예제를 살펴 보면 메소드 안에 커넥션 정보가 담겨 있기 때문에 수백, 수천 개의 DAO 메소드를 만들게 된다면 코드가 여기저기 중복 될 뿐만 아니라 향후 다른 커넥션 정보를 사용 할 경우 이 모든 DAO 메소드를 수정해야 한다.
즉, 커넥션 가져오는 중복 코드를 분리해야 한다.
중복된 DB 연결 코드를 getConnection() 이라는 메소드로 분리 한다면 커넥션 정보가 변경된다 하더라도 한 메소드의 코드만 수정하면 된다.
리펙토링
리펙토링은 기존의 코드를 외부의 동작방식에는 변화 없이 내부 구조를 변경해서 재구성하는 작업 또는 기술을 말한다. 리펙토링을 하면 코드 내부의 설계가 개선되어 코드를 이해하기가 더 편해지고, 변화에 효율적으로 대응할 수 있다. 결국 생산성은 올라가고, 코드의 품질은 높아지며, 유지보수하기 용이해지고, 견고하면서도 유연한 제품을 개발 할 수 있다. 리펙토링이 절실히 필요한 코드의 특징을 나쁜 냄새라고 부르기도 한다. 대표적으로, 중복된 코드는 매우 흔하게 발견되는 나쁜 냄새다. 이런 코드는 적절한 리펙토링방법을 사용해 나쁜 냄새를 제거 해줘야 한다.
3. 상속을 통한 분리
템플릿 메소드패턴
슈퍼클래스에 기본적인 로직의 흐름(커넥션 가져오기 . SQL 생성. 실행, 반환)을 만들고,그 기능의 일부를 추상 메소드나 오버라이딩이 가능한 protected 메소드 등으로만든 뒤 서브클래스에서 이런 메소드를 펼요에 맞게 구현해서 사용하도록 하는 방법
public abstract class Super{
public void templateMethod(){
// 기본 알고리즘 코드
hookMethod();
abstractMethod();
....
//기본 알고리즘 골격을 담은 메소드를 템플릿 메소드라 부른다.
//템플릿 메소드는 서브클래스에서 오버라이드하거나 구현할 메소드를 사용한다.
}
protected void hookMethod(){} // 선택적으로 오버라이드 가능한 훅 메소드
public abstract void abstractMethod(); // 서브클래스에서 반드시 구현해야 하는 추상메소드
}
public class Sub1 extends Super{ // 슈퍼클래스의 메소드를 오버라이드 하거나 구현해서 기능을
// 확장한다. 다양한 확장 클래스를 만들 수 있다.
protected void hookMethod(){
.........
}
public void abstractMethod(){
.........
}
}
팩토리 메소드 패턴(factory method pattern)
서브클래스에서 구체적인 오브젝트 생성 방법을 결정하게 하는 것
팩토리 메소드 패턴도 템플릿 메소드 패턴과 마찬가지로 상속을 통해 기능을 확장하게 하는 패턴이다. 그래서 구조도 비숫하다. 슈퍼클래스 코드에서는 서브클래스에서 구현할 메소드를 호출해서 필요한 타입의 오브젝트를 가져와 사용한다. 이 메소드는 주로 인터페이스 타입으로 오브잭트를 리턴하므로 서브클래스에서 정확히 어떤 클래스의 오브젝트를 만들어 리턴할지는 슈퍼클래스에서는 알지 못한다. 사실 관심도 없다. 서브클래스는 다양한 방법으로 오브젝트를 생성하는 메소드톨 재정의할 수 있다. 이렇게 서브클래스에서 오브젝트 생성 방법과 클래스를 결정할 수 있도록 미리 정의해둔 메소드ㄹ 팩토리 메소드라고 하고,이 방식을 통해 오브젝트 생성 방법을 나머지 로직. 즉 슈퍼클래스의 기본 코드에서 독립시키는 방법을 팩토리 메소드 패턴이라고 한다. 자바에서는 종종 오브젝트를 생성하는 기능을 가진 메소드를 일반적으로 팩토리 메소드라고 부르기도 한다.이때 말하는 팩토리 메소드와 팩토리 메소드 패턴의 팩토리 메소드는 의미가 다르므로 혼동하지 않도록주의해야 한다.
디자인패턴
디자인 패턴은 소프트웨어 설계 시 특정 상황에서 자주 만나는 문제를 해결하기 위해 시용할 수 있는 재사용 가능한 솔루션을 말한다. 모든 패턴에는 간결한 이름이 있어서 잘 알려진 패턴을 적용하고자 할 때 간단히 패턴 이름을 언급하는 것만으로도 설계의 의도와 해결책을 함께 설명할 수 있다는 장점이 있다. 디자인 패턴은 주로 객체지향 설계에 관한 것이고, 대부분 객체지항적 설계 원칙을 이용해 문제를 해결한다. 패턴의 설계 구조률 보면 대부분 비슷한데. 그 이유는 객체지향적인 설계로부터 문제를 해결하기 위해 적용할 수 있는 확장성 추구 방법이 대부분 두 가지 구조로 정리되기 때문이다.
하나는 클래스 상속이고 다른 하나는 오브젝트 합성이다. 따라서 패턴의 결과로 나온 코드나 설계 구조만 보면 대부분 비슷해 보인다. 패턴에서 가장 중요한 것은 각 패턴의 핵심이 담긴 목적 또는 의도다. 패턴을 적용할 상황. 해결해야 할 문제,솔루션의 구조와 각 요소의 역할과 함께 핵심 의도가 무엇인지률 기억해둬야 한다.
커넥션을 분리한다던지, 템플릿 메소드 패턴 또는 팩토리 메소드 패턴으로 관심사항이 다른 코드를 분리해내는 것은 관심사항을 분리 한다는 점에서 비슷하다고 볼 수 있다.
다만 상속을 사용했다는 단점이 있다. 상속 자체는 간단해 보이고 사용하기도 편리하게 느껴지지만 사실 많은 한계점이 있다.
다음 장에서 DAO의 확장에대해 알아보자.