JavaBookStudy / JavaBook

책읽기 스터디
https://javabookstudy.github.io/
Apache License 2.0
19 stars 2 forks source link

[토비의 스프링] 7.4.2_확장된 기능을 받는 DI #122

Closed taxol1203 closed 3 years ago

taxol1203 commented 3 years ago

622 p.의 마지막 문단에서,

`BaseSqlService`는 초기화를 통한 SQL 등록과 조회만을 목적으로 SQL 레지스트리 오브젝트를 사용할 것이므로, 
기존의 SqlRegistry 인터페이스를 통해 접근하면 충분하다

이 뜻은, 새로운 기능(메스드)을 확장한 interface UpdatableSqlRegisry가 아닌 기존의 SqlRegistry만 사용하면 된다고 되어있습니다.

그런데, 그림 7-11을 보면, SqlRegistry를 구현한 클래스를 DI 받는 것이 아닌 UpdatableSqlRegisry를 구현한 MyUpdatableSqlRegistry를 DI를 받고있습니다.
UpdatableSqlRegisry를 구현한 클래스이면, BaseSqlService의 관심사에 필요없는 기능(메서드)들이 있을 것인데 왜 이런 방식을 사용하였는지 궁금합니다.

kjsu0209 commented 3 years ago

같은 MyUpdatableSqlRegistry를 DI 받더라도 관심사에 따라 다른 인터페이스에 의존할 수 있다고 합니다. 리스트 7-63의 의존관계 설정을 보면 BaseSqlServiceSqlAdminService 모두 같은 빈을 참조하도록 설정됩니다. 하지만 코드로는 다르게 표현될 수 있습니다.

말씀하신 것처럼 BaseSqlService는 자기 관심사에 해당하는 기능만 쓸 수 있게 DI 받을 때 다음과 같이 받을 것입니다.

private SqlRegistry registry;

이렇게 되면 SqlRegistry의 기능만 쓸 수 있게 되고, 결국 그림과 같이 SqlRegistry에 의존하는 관계가 만들어집니다. SqlAdminService같은 경우 UpdatableSqlRegistry로 DI될 인스턴스 변수를 선언하겠죠.