개발/Spring

[Spring] 제어의 역전(Inversion of Control)

hojak99 2018. 7. 24. 10:29

제어의 역전(Inversion of Control)

성격이 다른 책임이나 관심사는 분리해버려야 한다.

팩토리 : 객체의 생성 방법을 결정하고 그렇게 만들어진 오브젝트를 돌려주는 것

public Class DaoFactory {
    public UserDao userDao() {

        // 팩토리의 메소드는 UserDao 타입의 오브젝트를 어떻게 만들고, 어떻게 준비시킬지를 결정함
        ConnectionMaker connectionMaker = new DConnectionMaker();
        UserDao userDao = new UserDao(connectionMaker);
        return userDao;
    }
}

위와 같은 코드를 작성해주었기에 Test 클래스에서는 이제 해당 팩토리 클래스의 메소드만 호출하면 되도록 바뀌었다.

public class UserDaoTest {
    public static void main(String[] args) {
        UserDao dao = new DaoFactory().userDao();
    }
}

여기서 만약 DaoFactory 에 UserDao 가 아닌 다른 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());
    }
}

이렇게 코드를 작성하면 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 DConnectionMaker();
    }
}

이렇게 되면 ConnectionMaker 의 구현 클래스가 변경이 되어도 메소드 하나만 변경해주면 된다.


제어의 역전 : 간단히 프로그램의 제어 흐름 구조가 뒤바뀐 것

즉, 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않는다. 오직 위임받은 제어 권한을 갖는 특별한 오브젝트에 의해 결정되고 만들어진다.

반응형