IoC(Inversion of Control)
1.4.1 오브젝트 팩토리
UserDaoTest는 UserDao의 기능이 잘 동작하는지 테스트하는 클래스
현재는 ConnectionMaker 구현 클래스를 사용할지를 결정하는 기능이 들어있다.
UserDao와 ConnectionMaker 구현 클래스의 오브젝트를 만드는 것
그렇게 만들어진 두 개의 오브젝트가 연결돼서 사용할 수 있도록 관계를 맺는 두 기능을 분리하자.
팩토리
객체의 생성 방법을 결정하고 그렇게 만들어진 오브젝트를 돌려주는 기능을 하는 오브젝트를 뜻함
오브젝트 생성, 오브젝트 사용의 역할과 책임을 깔끔하게 분리하는 목적으로 사용
Example Code
UserDao의 생성 책임을 맡은 팩토리 클래스
package springbook.user.dao;
import springbook.user.domain.ConnectionMaker;
import springbook.user.domain.DConnectionMaker;
import springbook.user.domain.UserDao;
public class DaoFactory {
public UserDao userDao() {
ConnectionMaker connectionMaker = new DConnectionMaker();
UserDao userDao = new UserDao(connectionMaker);
return userDao;
}
}
팩토리를 사용하도록 수정한 UserDaoTest
public class UserDaoTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException{
UserDao dao = new DaoFactory().userDao();
...
}
}
설계도로서의 팩토리
UserDao와 ConnectionMaker는 각각 애플리케이션의 핵심적인 데이터 로직과 기술 로직을 담당,
DaoFactory는 이런 애플리케이션의 오브젝트들을 구성하고 그 관계를 정의하는 책임을 맡음
DaoFactory 분리로 애플리케이션 컴포넌트 역할을 하는 오브젝트와 애플리케이션 구조를 결정하는 오브젝트를 분리에 의의
1.4.2 오브젝트 팩토리의 활용
DaoFactory를 UserDao에 한정하지말고 AccountDao, MessageDao등을 만들었다고 가정
ConnectionMaker 구현 클래스의 오브젝트를 생성하는 코드가 메소드마다 반복된다. -> 중복발생
Example Code
DAO 생성 메소드의 추가로 인해 발생하는 중복
public class DaoFactory {
public UserDao userDao() {
return new UserDao(new DConnectionMaker());
}
public AccountDao accountDao() {
return new AccountDao(new DConnectionMaker());
}
public MessageDao messageDao() {
return new MessageDao(new DConnectionMaker());
}
}
생성 오브젝트 코드 수정
public class DaoFactory {
public UserDao userDao() {
return new UserDao(connectionMaker());
}
public AccountDao accountDao() {
return new AccountDao(connectionMaker());
}
public MessageDao messageDao() {
return new MessageDao(connectionMaker());
}
public ConnectionMaker connectionMaker() {
return new DCoonectionMaker();
}
}
1.4.3 제어권 이전을 통한 제어관계 역전
제어의 역전이란 간단히 프로그램의 제어 흐름 구조가 뒤바뀌는것
일반적인 프로그램의 흐름
main() -> 오브젝트 결정 -> 오브젝트 생성 -> 오브젝트 메소드 호출 -> 결정 -> 호출 ...
역전된 프로그램의 흐름
오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않고, 생성하지 않는다.
프로그램의 시작을 담당하는 main()과 같은 엔트리 포인트를 제외하면
모든 오브젝트는 위임받은 제어 권한을 갖는 특별한 오브젝트에 의해 결정되고 만들어진다.
ex) UserDao와 DaoFactory -> 구현 클래스 결정 및 오브젝트 생성 제어권의 이전
'BackEnd > Spring & Springboot Study' 카테고리의 다른 글
[토비의 스프링] 1.6 싱글톤 레지스트리와 오브젝트 스코프 (0) | 2022.12.03 |
---|---|
[토비의 스프링] 1.5 스프링의 Ioc (0) | 2022.12.02 |
[토비의 스프링] 1.3 DAO의 확장 (0) | 2022.11.29 |
[토비의 스프링] 1.2 DAO의 분리 (0) | 2022.11.28 |
[토비의 스프링] 1.1 초난감 DAO (0) | 2022.11.24 |