[Spring] 제어의 역전(IoC)

Zoe·2022년 1월 5일
0

Spring

목록 보기
1/9
post-thumbnail

제어의 역전(IoC)


✅ 오브젝트 팩토리

  • factory : 오브젝트를 생성하는 쪽과 생성된 오브젝트를 사용하는 쪽의 역할과 책임을 깔끔하게 분리하려는 목적으로 사용
//UserDao의 생성 책임을 맡은 팩토리 클래스
package springbook.user.dao;
...
public class DaoFactory {
	public UserDao userDao() {
    	ConnectionMaker connectionMaker = new DConnectionMaker(); 
        UserDao userDao = new UserDao(connection); //UserDao 오브젝트 생성
        return userDao
    }
}
  • DaoFactory의 userDao 메소드를 호출하면 DConnectionMaker를 사용해 DB 커넥션을 가져오도록 이미 설정된 UserDao 오브젝트를 돌려줌.
//팩토리를 사용하는 UserDaoTest
public class UserDaoTest {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
    		UserDao dao = new DaoFactory().userDao();
            ...
        }
}

➡️ 오브젝트 팩토리를 활용한 구조

  • UserDao : 애플리케이션의 핵심적인 데이터 로직
  • ConnectionMaker : 기술 로직
  • DaoFactory : 애플리케이션의 오브젝트들을 구성하고 그 관계를 정의하는 책임
  • 만약 직접 개발한 UserDao를 기업 N사 D사에 공급한다고 가정한다면, UserDao, ConnectionMaker, DaoFactory를 함께 제공해야 함
  • 핵심 기술이 담긴 UserDao는 변경이 필요없으므로 안전하게 소스코드를 보관 가능

✅ 오브젝트 팩토리의 활용

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());//반복됨
    	}
}
  • DAO 생성 메소드의 추가로 인해 new DConnectionMaker라는 ConnectionMaker 구현 클래스의 인스턴스를 만드는 부분이 반복됨
  • ConnectionMaker의 구현 클래스를 바꿀 때마다 모든 메소드를 일일이 수정해야 하기 때문에 좋지 않음
//생성 오브젝트 코드 수정
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 DConnectionMaker();
        }
}
  • ConnectionMaker 타입 오브젝트를 생성하는 코드를 따로 분리해서 중복을 제거함

✅ 제어권 이전을 통한 제어관계 역전

  • 일반적인 프로그램의 흐름 : 오브젝트 결정 -> 오브젝트 생성 -> 만들어진 오브젝트에서 메소드 호출 -> 그 오브젝트 메소드에서 다음에 사용할 것을 결정하고 호출
    이런 작업이 반복
  • 제어의 역전 : 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않음. 생성하지도 않음. 자신도 어떻게 만들어지고 어디서 사용되는지를 알 수 없음. 모든 제어 권한을 자신이 아닌 다른 대상에게 위임하기 때문.
  • DaoFactory에게 권한을 넘겨 UserDao는 수동적인 존재가 됨 -> 제어의 역전
profile
iOS 개발자😺

0개의 댓글