관심사의 분리
항상 변경이 일어날 것을 염두해 두고 설계를 진행
관심이 같은 것들 끼리 한곳에 모으면 변화가 일어났을시 변화한 관심만을 수정할 수 있다.(관심의 분리)
-
중복 코드의 메소드 추출
-
상속을 통한 확장
-
클래스의 분리
-
인터페이스의 도입
-
관계설정 책임의 분리
중복 코드의 메소드 추출 : 중복된 코드를 분리하는 과정
public class UserDao{
public void add(User user){
Connection c = getConnection();
....
}
public User get(String id){
Connection c = getConnection();
}
public Connection getConnection(){
//DB 연결 코드 작성
return //Connection 타입
}
}
DB 연결 부분의 중복된 코드를 메소드로 묶어서 한데 작성
상속을 통한 확장 : 기존의 코드를 한단계 더 분리
- 추상클래스, 추상메소드 로의 변경
UserDao에 있던 메소드를 추상클래스로 변경하여 실질적인 구현을 하위 클래스인 NUsereDao, DUserDao에서 구현
public abstract class UserDao{
public void add(User user){
Connection c = getConnection();
....
}
public User get(String id){
Connection c = getConnection();
}
public abstract Connection getConnection();
}
public class NUserDao extends UserDao{
public Connection getConnection(){
//구현
}
}
public class DUserDao extends UserDao{
public Connection getConnection(){
//구현
}
}
템플릿 메서드 패턴
: 기능의 일부를 추상메소드, protected 로 설정하여 해당 기능을 하위 클래스에서 구현하는 방법
팩토리 메서드 패턴
: 하위 클래스에서 구체적인 오브젝트 생성 방법을 결정하게 하는 방법
하위클래스에서 어떤 클래스의 오브젝트를 사용할 것인가를 결정한다.
NUserDao, DuserDao에서 어떤 Connection 클래스의 오브젝트를 어떻게 생성할 것인가를 결정한다.
*단점 : 자바는 클래스의 다중상속을 지원하지 않기 때문에 상속할 것이 정해지면
다른목적의 상속을 사용할수가 없다.
클래스의 분리: 완전히 독립된 클래스로(서브 클래스가 아닌) 만듬
public class UserDao{
private SimpleConnectionMaker simpleConnectionMaker;
public UserDao(){
simpleConnectionMaker = new simpleConnectionMaker();
}
public void add(User user){
Connection c = simpleConnectionMaker.MakeNewConnection();
....
}
public User get(String id){
Connection c = simpleConnectionMaker.MakeNewConnection();
}
}
public class SimpleConnectionMaker {
public Connection makNewConnection(){
//DB 연결 코드 작성
}
}
SimpleConnectionMaker이라는 클래스를 따로 만들어서 완전하게 분리
단점 : UserDao 가 SimpleConnectionMaker라는 클래스에 종속적이게 되므로 향상된 방법이 아님
인터페이스의 도입 : 서로 긴말하게 연결할 수 있는 연결고리를 생성 (연결고리 : 인터페이스)
인터페이스를 사용한다면 UserDao는 connectionMaker 인터페이스가 makeConnection()이라는 기능을 가지고 있다는 것에만 관심을 갖지 해당 기능이 어떻게 구현되는지는 관심을 갖지않는다.
public interface ConnectionMaker{
public Connection makeConnection();
}
public class DConnectionMaker implements ConnectionMaker{
public Connection makeConnection(){
//DConnectionMaker가 독자적인 방법으로 makeConnection 생성
}
}
public class UserDao{
private ConnectionMaker connectionMaker;
//인터페이스를 통해서 필요한 오브젝트에 접근
public UserDao(){
connectionMaker = new DConnectionMaker();
//이부분이 단점! 클래스 이름이 나오므로 완전히 분리되지는 않음을 알 수 있다.
}
public void add(User user){
Connection c = connectionMaker.makeConnection();
....
}
public User get(String id){
Connection c = connectionMaker.makeConnection();
}
}
단점 : connectionMaker = new DConnectionMaker();
여전히 구현 클래스를 사용할지를 결정하는 코드가 남아있다.
관계설정 책임의 분리 : 클라이언트 오브젝트를 만들어서 인터페이스와 클래스와의 관계를 엮어준다.
런타인 오브젝트 관계 만들기 :외부에서 만든 오브젝트를 전달받아서 메소드의 파라미터로 전달받는다.
public UserDao {
public UserDao(ConnectionMaker connectionMaker){
this.connectionMaker = connectionMaker;
}
}
public class UserDaoTest {
public static void main(String[] args){
ConnectionMaker connectionMaker = new DConnectionMaker();
ConnectionMaker connectionMaker = new NConnectionMaker();
UserDao dao = new UserDao(connectionMaker);
}
}
UserDaoTest는 UsesrDao와 런타임 오브젝트관계를 유지시켜준다.
팩토리의 등장 : Factory - 객체를 생성 후 돌려준다.
public class UserDaoFactory {
UserDao UserDao() {
ConnectionMaker connection = new DConnectionMaker();
UserDao userdao = new UserDao(connection);
return userdao;
}
}
public class UserDaoTest {
public static void main(String args[]){
UserDao userdao = new UserDaoFactory().UserDao();
}
}
|
'Spring > Spring' 카테고리의 다른 글
(SPRING) 스프링 AOP : 프록시 기반 AOP (0) | 2019.12.25 |
---|---|
(SPRING) 스프링 웹 애플리케이션 제거방법 (0) | 2019.12.25 |
(SPRING) AOP(Aspect-Oriented-Programming) (0) | 2019.12.24 |
(SPRING) 오브젝트와 의존관계 (스프링에 IOC) (0) | 2019.12.09 |
(SPRING) 오브젝트와 의존관계 (일반적인 IOC version02) (0) | 2019.12.09 |