자바/스프링(Spring)

스프링(Spring):관심사의 분리

류창 2021. 8. 25. 21:08
반응형

 

이전 포스팅에 다형성만으로는, OCP(개방 폐쇄의 원리), DIP(의존 주입 원리)를 지키지 못한다.

 

이를 지키기위해서 관심사의 분리라는 테크닉이 등장한다!

 

우선 왜 OCP, DIP를 지키지 못하는걸까?

 

 

코드를 봐보자,  MemberRepository는 Interface고, MemoryMemberRepository는 구현 클래스다.

 

지금 MemberServiceImpl 클래스는 MemberRepository 인터페이스와 MemoryMemberRepository클래스 둘다 의존하고있다.

 

이건 DIP에 위반된다. DIP는 구현체에 의존하지말고 인터페이스에 의존해야되는 원리이다.

 

또한, 나중에 Memory저장소가 아닌, 다른 저장소로 변경될시에 수정할때 MemberRepository클래스를 수정해야한다.

 

이러면 OCP도 위반된다. OCP는 확장할땐 열려있어야하지만, 변경할땐 닫혀있어야한다.

 

이 2가지를 해결할수잇는 방법이 있다. 그것이 바로 생성자 주입을통한 의존 관계 주입이다.

 

 

아래 코드와 비교해보자.

 

코드를 봐보자, 메소드 MemberServiceImpl은 인터페이스인 MemberRepository만 의존하고있다!

 

근데 당연히 이대로 실행하면 문제가된다. 인터페이스만 의존하면 구현체가 없어 오류가 생성된다!

 

그래서 생성자를 생성하여 정의한뒤, 또 다른 설정 클래스에서 의존관계를 주입시킨다!

 

설정 클래스 AppConfig를 보자.

 

설정 클래스 AppConfig에서 MemberServiceImpl 클래스 생성자에 MemoryMemberRepository 구현클래스를 주입햇다.

 

이렇게 분리해놓은 이유는 SRP원칙에 의거한다. 

(SRP: 클래스는 단 , 하나의 책임을 가져야한다)

 

우리가 AppConfig를 생성하기 전에는, MemberServiceImpl은 

인터페이스에서 구현체를 연결하는 행위+ 멤버서비스 기능을 제공하는 역할 2가지를 가지고있었다.

 

이는, SRP를 위반하므로 AppConfig를 생성하여 인터페이스에서 구현체를 연결하는 행위만을 해주는

설정 클래스를 하나 생성해줄 필요가있다.

 

이렇게 구현을하면 수정할때도 AppConfig에서만 수정하고, MemberServiceImpl클래스를 손을 안대도된다.

 

OCP와 DIP모두 지키면서 좋은 객체지향프로그래밍을 할수 있는것이다!

 

이걸 스프링에선 관심사의 분리라고 한다

반응형