개발 서적 기록/오브젝트_조영호

23일차 - 의존성 주입

밍 끄적 2023. 8. 25. 17:48
728x90

2023.08.25 FRI

289p ~ 304p

 

22일차 내용 ⬇️

2023.08.24 - [개발 서적 기록/오브젝트_조영호] - 22일차 - OCP 적용하기

 

22일차 - OCP 적용하기

2023.08.24 THU 276p ~ 290p 21일차 내용 ⬇️ 2023.08.23 - [개발 서적 기록/오브젝트_조영호] - 21일차 - 바람직한 의존성 21일차 - 바람직한 의존성 2023.08.23 WED 261p ~ 276p 20일차 내용⬇️ 2023.08.22 - [개발 서적

magenta-ming.tistory.com


시스템을 객체로 분리하기 : 표현적 분해와 행위적 분해

표현적 분해는 도메인제 존재하는 사물 또는 개념을 표현하는 객체들을 이용해 시스템을 분해하는 것이다.

도메인 모델에 담겨 있는 개념과 관계를 따른다.

 

행위적 분해는 도메인 개념을 표현한 객체가 아닌, 설계자가 편의를 위해서 임의로 만들어낸 가공의 객체를 이용해 시스템을 분해하는 것이다.

이러한 책임을 할당하기 위해서 생성하는, 도메인과 무관한 인공적인 객체는 순수한 가공물 PURE FABRICATION 이라고 부른다.

어떤 행동을 추가하려고 하는데 이 행동을 책임질 마땅한 도메인 개념이 존재하지 않을 때, 이 책임 할당을 위한 인공적인 객체를 만들어 할당해야한다.

 

만약, 이런 순수한 가공물 객체를 만들지 않고, 도메인 객체에 할당한다면 재사용성이 떨어지고 결합도는 높아지고 응집도는 낮아질 수 있다.

어떤 객체가 책임을 수행하는데 필요한 많은 정보를 가졌지만, 해당 책임을 할당 경우 응집도가 낮아지고 결합도가 높아진다면 가공의 객체를 추가해서 책임을 옮기는 것이 좋다.

 

의존성 주입

사용하는 객체가 아닌 외부의 독립적인 객체가 인스턴스를 생성한 후 이를 전달해서 의존성을 해결하는 방법이다.

이러한 의존성 주입은 생성자 주입, setter 주입, 메서드 주입 방법(메서드 실행 시 인자를 이용한 의존성 해결)이 있다.

Spring에서는 필드 주입 방법도 있다. @Autowired를 이용한 방법이다.

 

하지만 setter 주입이나 메서드 주입이나 필드 주입 방법은 객체가 생성된 후에 의존성을 주입한다.

 

객체를 생성한 뒤에 의존성을 주입하면 순환 참조 현상이 발생할 수 있다.

순환 참조 문제가 발생하면 서로를 계속 호출하고, 서로를 기다리면서 런타임 환경에서 서버가 죽는다.

 

또, 객체를 생성한 뒤에 의존성을 주입해야하므로 의존성에 대한 필드가 final로 선언할 수 없어 변경에 취약해진다. 객체의 불변성을 보장할 수 없는 것이다.

 

그리고 테스트를 작성하기 어려워진다.

특히 필드 주입 방법은 외부에서 접근이 불가능하기 때문에 반드시 DI 프레임워크가 필요해 DI 프레임워크에 의존해야한다.

생성자 주입 방법을 사용하면, 외부에서 컴파일 시점에 객체를 주입받도록 테스트 코드를 작성할 수 있고, 의존성 주입에 이슈가 있을 때에도 컴파일 시점에 파악할 수 있다.

 

더불어, @Autowired를 이용하면 스프링에 의존적인 코드가 된다. 

 

따라서 생성자 주입 방법을 사용하는 것이 올바르다.

 

728x90