본문 바로가기

개발

[SPRING3.0] 2.오브젝트와 의존관계 .. (2)

2011/11/17 - [웹개발/SPRING3.0] - [SPRING3.0] 2.오브젝트와 의존관계

문제점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을 수정할수는 없는 노릇.
좀더 유연한 프로그램을 작성해보자.

- 상속을 통한 UserDao 확장방법

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)
-
-- 계속..