2011/11/17 - [웹개발/SPRING3.0] - [SPRING3.0] 2.오브젝트와 의존관계
문제점1. 중복코드
해당 소스를 보면 connection을 얻어오는 부분에서 중복해서 호출을 하게된다. 만약 DB연결에 변경이 생긴다면 해당부분을 다 수정해주어야 하는 불상사가 생길 것이다. 해당 소스를 아래와 같이 리펙토링 할수 있다.
* 리펙토링 : 기존의 코드를 외부의 동작방식에는 변화 없이 내부 구조를 변경해서 재구성하는 작업 또는 기술.
위에 소스와 같이 중복된코드를 뽑아 메소드로 만드는것을 메소드추출기법(extract method)이라고 한다.
------------------------------
다음 DB에 연결되는 부분이 좀더 다양해진다면 어떻게 될까? 매번 getConnection을 수정할수는 없는 노릇.
좀더 유연한 프로그램을 작성해보자.
- 상속을 통한 UserDao 확장방법
getConnection() 부분을 추상Method로 작성하고 NuserDao와 DuserDao클래스를 생성 UserDao를 상속받아 getConnection() 구현
* 템플릿메소드패턴(Template method pattern)
- 슈퍼클래스에 기본적인 로직의 흐름을 만들고 그 기능의 일부를 추상 메소드나 오버라이딩이 가능한 proteted 메소드 등으로 만든 뒤 서브클래스에서 이런 메소드를 필요에 맞게 구현해서 사용하도록 하는 방법. (스프링에서 애용되는 디자인 패턴)
* 팩토리메소드패턴(factory method pattern)
-
-- 계속..
문제점1. 중복코드
해당 소스를 보면 connection을 얻어오는 부분에서 중복해서 호출을 하게된다. 만약 DB연결에 변경이 생긴다면 해당부분을 다 수정해주어야 하는 불상사가 생길 것이다. 해당 소스를 아래와 같이 리펙토링 할수 있다.
package chapter1.obj;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDao1 {
public void add(User user) throws ClassNotFoundException, SQLException {
Connection c = getConnection();
..
}
public User get(String id) throws ClassNotFoundException, SQLException {
Connection c = getConnection();
..
}
private Connection getConnection() throws ClassNotFoundException,
SQLException {
Class.forName("core.log.jdbc.driver.OracleDriver");
Connection c = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.56.101:1521:orcl", "hm", "hm");
return c;
}
public static void main(String[] args) throws ClassNotFoundException, SQLException {
.. 생략 ..
}
} * 리펙토링 : 기존의 코드를 외부의 동작방식에는 변화 없이 내부 구조를 변경해서 재구성하는 작업 또는 기술.
위에 소스와 같이 중복된코드를 뽑아 메소드로 만드는것을 메소드추출기법(extract method)이라고 한다.
------------------------------
다음 DB에 연결되는 부분이 좀더 다양해진다면 어떻게 될까? 매번 getConnection을 수정할수는 없는 노릇.
좀더 유연한 프로그램을 작성해보자.
getConnection() 부분을 추상Method로 작성하고 NuserDao와 DuserDao클래스를 생성 UserDao를 상속받아 getConnection() 구현
package chapter1.obj;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public abstract class UserDao123 {
public void add(User user) throws ClassNotFoundException, SQLException {
Connection c = getConnection();
..
}
public User get(String id) throws ClassNotFoundException, SQLException {
Connection c = getConnection();
..
}
public abstract Connection getConnection() throws ClassNotFoundException,SQLException;
}
class NUserDao extends UserDao123 {
public Connection getConnection() throws ClassNotFoundException,SQLException{
//처리
}
}
class DUserDao extends UserDao123 {
public Connection getConnection() throws ClassNotFoundException,SQLException{
//처리
}}
* 템플릿메소드패턴(Template method pattern)
- 슈퍼클래스에 기본적인 로직의 흐름을 만들고 그 기능의 일부를 추상 메소드나 오버라이딩이 가능한 proteted 메소드 등으로 만든 뒤 서브클래스에서 이런 메소드를 필요에 맞게 구현해서 사용하도록 하는 방법. (스프링에서 애용되는 디자인 패턴)
* 팩토리메소드패턴(factory method pattern)
-
-- 계속..
'개발' 카테고리의 다른 글
| [Spring] 스프링에서 사용되는 웹 프레임워크의 종류 (0) | 2011.12.24 |
|---|---|
| [spring/TIP] STS를 이용하여 순식간에 기본환경 구축하기 (4) | 2011.12.20 |
| [SPRING3.0] 2.오브젝트와 의존관계 (0) | 2011.11.17 |
| [Eclipse/PLUG-IN] SVN 설치 (0) | 2011.11.17 |
| [SPRING3.0/Framework] 1. 시작 (0) | 2011.11.16 |