• 카테고리

    질문 & 답변
  • 세부 분야

    기타 (개발 · 프로그래밍)

  • 해결 여부

    해결됨

의존 주입 예제 관련 질문입니다.

22.02.07 01:00 작성 조회수 124

1

의존 주입 관련 질문입니다. (동영상 5:13초)
코드 예제에서 오른쪽 하단에 schSvc.setCalculator(cal); 코드가 존재하고 있습니다.

Q1. 왜 SchSvc.setCalculcator(cal);은 굳이 생성자를 통해서 의존 주입을 하지 않나요? 

Q2. 혹시 SchSvc.setCalculator(cal);의 이유가 생성된 이후에도 여러 번 setCalculator을 통해 ScheduleService의 cal 필드 변경이 필요해서 일까요?

Q3.  Q2의 질문의 답변이 만약 맞는 경우(생성된 이후 여러 번 setCalculator를 통해 계산법 변경이 필요하다) setter는 지양해야 된다는 한 블로그를 보게 되었습니다.(출처:  https://velog.io/@sezeom/Getter-Setter-%EC%A7%80%EC%96%91%ED%95%98%EA%B8%B0) 
혹시 setCalculator 방식 말고 ScheduleService 객체가 이미 생성된 이후에도 private Calculator cal을 변경 시킬 수 있는 다른 방법이 있을까요? 

지금 떠오르는 것은 setter로 cal을 갱신하는 것이 아닌 계산과 관련된 메소드를 만들고, 메소드의 파라미터를  계산 기능과 관련된 추상화를 통한 객체 다형성을 통해 해결하는 방법 밖에 생각이 나지 않습니다. 
그 외 다른 방법이 존재할까요?

Q4. Q3과 연관된 질문인데 만일 조립을 통해 생성된 객체가 생성된 이후 특정 상황에 따라 조립을 통해 생성된 객체가 다른 객체로 변경이 필요한 경우에는 setter(조립된 객체를 저장한 특정 필드를 변경) 말고 다른 방법을 통해 조립을 통해 이미 생성된 객체를 변경이 가능할까요?
기존 강의의 여러 내용을 훑어보았지만 마땅한 해결책이 떠오르지 않습니다. 이 경우는 조립을 쓰지 않는 게 답일까요? 아니면 다른 좋은 해결 방법이 존재하는 지 궁금합니다.

 

Q5. 어떤 특정한 경우에는 새로운 객체를 생성하지 않고 기존 생성한 객체를 계속 사용하면서 setter 등을 통해서 기능을 바꾸어야 할 때가 있을 것 같습니다.

(억지 예시로 생성에 비용이 큰 객체는 매번 재생산 시 비용의 부담이 있을수도 있어서 static을 통해 한번만 생성하고 여러 상황에 맞게 setter 등을 통해 기능을 바꾼다. 기능 기능과 책임의 분리 측면에서는 맞지 않지만 아주 억지적인 가정을 한다면요...)

이 때 setter 방식보다는 메소드의 파라미터를 통해서 기능을 메소드 내에서만 사용하도록 하는 방식이 객체지향에 알맞지 않을까 싶습니다.

근데 위 내용의 반론으로 만약 동일한 기능을 여러 메소드에게 공통적으로 전달하여 사용하고 setter 변경 주기가 짧은 편이 아니라면 어쩌면 setter 한번 쓰고 메소드의 파라미터로 기능을 전달하지 않고 메소드를 사용하는 게 옳을수도 있겠다는 생각이 듭니다. 

하지만 또 생각해보면 setter를 통해 객체를 전달한 것 자체가 setter로 전달된 객체는 private일지라도 캡슐화 된 객체 내에서 다른 메소드가 접근이 가능해서 오류가 발생하지 않을까 싶기도 합니다.

혹시 강사님이 생각하시는 좋은 해결법이 존재할까요?

이상입니다.
감사합니다.

[기타 잡소리]
강의 잘 보고 있습니다. 벌써 마지막에 강의에 가까워지네요.
객체지향이 이렇게 신기한 건지 몰랐습니다.
강사님 책 중 개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 책을 오늘 서점에서 구매했습니다.
해당 강의 다 보고 책 다시 정독하고 싶네요.
좋은 하루 되세요

답변 1

답변을 작성해보세요.

1

영상에서는 생성자 방식과 set 메서드 방식을 둘 다 보여주기 위한 예제를 작성한 것으로, 개인적으로 생성자를 통한 의존 객체 주입을 선호합니다.

의존 객체를 런타임에 변경할 일은 거의 없고, 만약 그런 상황이 자주 벌어진다면 말씀하신 것처럼 메서드 파라미터로 전달받아야 합니다. 전략 패턴이 이에 해당합니다.

간혹 테스트 코드에서 의존 객체를 변경해야 할 때가 있어 set 메서드를 추가할 때가 있습니다. 예를 들어 아래 코드처럼 validator 필드에 기본으로 사용하는 객체가 있는데 테스트 코드에서는 대역으로 대신해야 할 때 set 메서드를 이용해서 대역 객체를 주입합니다.

public class AService {
    private Validator validator = new DefaultValidate();
    ...
    void setValidator(Validator validator) { this.validator = validator; }
}

 

 

김규태님의 프로필

김규태

질문자

2022.02.08

답변 이해 됬습니다. 

답변 감사합니다! 너무 좋은 강의 올려주셔서 감사합니다. 프론트엔드 개발자로 함수형 기반을 쪼오금 아는 상태 였는데 이제는 객체지향도 쪼오금 아는 것 같아서 뿌듯합니다.

정말 감사합니다!