작성
·
470
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오) 네
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)네
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네
[질문 내용]
안녕하세요? 생성자 주입에 대해서 질문이 있습니다.
앞서서 영한님의 강의에서, bean을 통해서 역할과 책임을 구분한다는 이야기를 많이 해주셨습니다.
app config에서 배우를 정하고, 각 클래스들은 그냥 자신의 역할에만 집중한다는 비유를 들어서 말씀해주셨는데요
생성자를 직접 주입하는 방식은 사실 기존의 말씀과 상반되는 내용같아서, 제가 제대로 이해한 게 맞는지 싶어서 질문드립니다.
비유를 사용하여 그대로 말씀을 드리자면, '불변, 필수'의 관계에서는 앞서 말씀과 다르긴하지만, 생성자 주입을 통해 그냥 하나의 클래스에서 배우도 정하고 역할도 스스로 하는 게 맞을까요?
추가로, 만약 생성자를 주입해주는 방식만 사용한다고 하면, (싱글톤이라는 기능을 제외할 때)사실 빈을 왜 사용하는지?도 의문이 자연스럽게 듭니다..!
답변 1
1
안녕하세요. 김영빈님, 공식 서포터즈 y2gcoder입니다.
저도 한 번 비유를 통해 영빈님께 답을 드려보고자 합니다.
애플리케이션 == 연극 / 빈들을 주입받아 어떤 중요한 기능을 수행하는 객체(이것도 빈입니다.) == 장면 / 주입하는 인터페이스 == 역할 / 주입하는 실제 구현체(빈) == 실제 배우 / 캐스팅 디렉터 == AppConfig
이렇게 가정해보겠습니다.
어떤 한 연극을 만들기로 했습니다. 해당 연극은 가족 간의 사랑을 주제로 한 연극입니다. 극 중 한 장면에서는 퇴근길에 아빠와 딸이 우연히 만나 같이 얘기하면서 집으로 돌아가는 장면이 있습니다. 해당 장면을 찍기 위해서는 아빠 역을 할 배우 한 명과 딸 역을 할 배우 한 명이 필요하고 장면을 위해서는 아빠 역은 50대 정도의 남성 배우, 딸 역은 20대 정도의 여성 배우가 적합합니다. 이 장면을 찍기 위해서 캐스팅 디렉터는 50대 남성 배우들 중 A라는 배우를 캐스팅 해왔고, 20대 여성 배우들 중 B라는 배우를 캐스팅했습니다. 캐스팅 된 A와 B가 연기를 잘해서 해당 장면은 멋지게 뽑혔고 연극의 소중한 장면이 되었습니다.
위의 비유에서 장면은 어떤 역할이 필요한지만 결정할 뿐 배우 자체를 정하지는 않습니다. 장면 입장에서는(객체 지향적인 관점에서는 현실 세계에서 능동적일 수 없는 대상도 능동적으로 행동할 수 있습니다.) A, B 배우가 필요한 것이 아니라 그냥 아빠 역을 할 50대 남성 배우, 딸 역을 할 20대 여성 배우가 필요하고 어떤 배우가 올 지는 장면의 책임이 아닙니다. 실제 배우를 찾아내는 것은 캐스팅 디렉터가 할 일입니다. 의존성 주입이라는 것은 결국 장면이 자신의 장면에 맞는 특정 배우를 직접 뽑는 것이 아니라, 어떤 역할들이 필요한지 알려주는 작업이라고 저는 생각했습니다.
기능을 하기 위해서는 결국 해당 기능에 필요한 객체를 주입받고 의존하는 것은 필요합니다. 이것은 생성자 주입이든, setter 주입이든, 필드 주입이든 마찬가지라고 생각합니다. 다만 "해당 장면의 아빠 역할은 A만 할 수 있어!" 라고 한정짓지 않고, "이 장면은 아빠 역을 할 50대 남성 배우가 필요해" 라고 느슨하게 가져감으로서 실제 배우 할당이라는 역할과 책임을 캐스팅 디렉터에 넘겨줬다고 생각합니다. 그러한 점에서 다형성을 통한 의존성 주입이 중요하다고 생각했습니다. 장면이 직접 배우를 선택하지는 않기 때문입니다.
생성자를 직접 주입하는 방식은 사실 기존의 말씀과 상반되는 내용같아서, 제가 제대로 이해한 게 맞는지 싶어서 질문드립니다.
=> 어떤 점에서 생성자 주입 방식이 다른 주입방식과 달리 기존의 역할과 책임 분리와 상반되는 개념이라고 생각하셨는지 궁금합니다!
감사합니다.
답변 감사합니다..! 그냥 혼자서 헷갈렸네요..
깔끔한 비유 덕분에 잘 이해했습니다. 감사합니다!