IT이론 2018. 2. 17. 21:53


스프링의 오브젝트와 의존관계에 관한 용어 정리



1. 관심사의 분리


책임이 다른 코드를 분리해서 두 개의 클래스로 만드는 것.

ex) 보통의 DAO 클래스에서 DB커넥션 관련 코드와 DB에서 실제로 수행되는 statement, resultset 등의 코드가 혼재되어있다. 즉, db커넥션관련 책임과 db에서 실제로 수행되는 코드의 책임은 엄연히 다른 책임을 가진다. 이런 코드를 관심사의 분리로써 db커넥션관리 코드를 별도의 class로 분리하여 DAO내에서는 DB커넥션과 관련된 코드자체를 분리해내는 작업(리팩토링)을 한다.


결론적으로 관심이 같은 것은 한 객체 또는 친한 객체로 관심이 다른 것은 가능한 멀리 떨어져 서로 영향을 주지 않게 코드를 분리&확장하는 이론이다.




2. 전략패턴


자신의 기능 맥락에서, 필요에 따라 변경이 필요한 기능은 인터페이스를 통해 통째로 외부로 분리시키고, 이를 구현한 구체적인 클래스를 필요에 따라 바꿔서 사용 할 수 있게 하는 디자인패턴을 말한다.

ex) DAO(컨텍스트), DaoTest(클라이언트,DAO테스트를 위해 DAO클래스를 사용하는 클라이언트), DBConnection(전략, Connection인터페이스를 사용할 db종류에 따라 구현한 클래스)

컨텍스트(dao)를 사용하는 클라이언트(daotest)는 컨텍스트가 사용하는 전략(connection 구현 클래스)을 컨텍스트의 생성자에 인터페이스 타입으로 제공해주는 것이 일반적이다.


즉, db의 종류가 바뀌어서 connection구현 클래스가 바뀌더라도 그 connection을 사용하는 dao클래스의 코드변경은 필요가 없다.




3. 개방폐쇄원칙


위의 전략패턴을 이용해 자신의 책임 자체가 변경되는 경우 외에는 불필요한 변화가 발생하지 않도록 막아주고, 자신이 사용하는 외부 오브젝트(connection구현클래스)의 기능은 자유롭게 확장하거나 변경할 수 있게 만든다.




4. 제어의 역전/IoC


오브젝트가 생성되고 여타 오브젝트와 관계를 맺는 작업의 제어권을 별도의 오브젝트 팩토리에게 책임을 넘긴다. 그 말은 오브젝트가 자신이 사용할 오브젝트(connection구현 클래스)를 스스로 선택하지 않는다. 또 자신(dao)도 어떻게 만들어지고 어디서 사용되는지 알 수 없다. 왜냐면 모든 제어의 권한을 자신이 아닌 다른 대상(프레임워크, 스프링컨테이너)에게 위임하기 때문이다.




5.  싱글톤 레지스트리


우선은 전통적인 싱글톤은 private 생성자를 가지기 때문에 상속이 불가능하다. 그리고 서버 환경에서 여러 JVM에 분산되서 설치가 되는 경우, 하나의 오브젝트만 생성된다는 보장이 없고, 전역 상태로 빠질 수 있기에 바람직하지 않다. 그래서 많은 학자들도 싱글톤 디자인패턴을 꺼려하는 디자인패턴 혹은 주의해서 사용해야하는 디자인패턴으로 생각하고 있다. 이런 단점을 해결하고 스프링에서 적용하기 위해 애플리케이션 컨텍스트는 싱글톤 레지스트리로 되어있다. 스프링이 직접 싱글톤 오브젝트를 생성하고 관리하는 기능을 제공하는 데, 그때 생성되는 오브젝트는 스태틱 메소드와 private 생성자를 사용하지 않는 일반 클래스를 싱글톤으로 활용하게 해주기 때문에 싱글톤의 단점을 보완한 싱글톤으로 사용할 수 있게 해준다. 즉, 서버에서 사용되는 서비스 오브젝트로서의 장점을 살릴 수 있는 싱글톤을 사용하면서도 전통 싱글톤 패턴의 단점을 극복할 수 있도록 설계된 컨테이너를 활용할 수 있게 되었다.( 빈 클래스는 싱글톤으로 생성되기 때문에 인스턴스 변수가 존재해서는 안된다. 여러 사용자 스레드에 의해서 인스턴스 변수가 변경되어 잘못된 인스턴스 변수가 다른 스레드가 사용할 수 있기 때문이다. 하지만 의존주입을 위한 읽기전용 변수는 사용이 가능하다. 왜냐하면 컨테이너에 의해 싱글톤 오브젝트로 의존주입되기 때문이다.)



6. 의존관계 주입/DI


설계 시점과 코드에는 클래스와 인터페이스 사이의 느슨한 의존관계(낮은 결합도)만 만들어놓고, 구체적인 클래스 의존관계를 알수 없게 하며 런타임시에 실제 사용할 구체적인 의존 오브젝트를 제 3자(컨테이너)의 외부도움으로 내부에 주입받아서 다이나믹한 의존관계를 갖게 해주는 IoC의 특별한 케이스이다. 즉, IoC와 DI는 엄연히 다른 용어이다. 스프링의 IoC의 대표적인 동작원리가 의존관계주입(DI)인 것이다.



posted by 여성게
: