SSAFY11th-book-study / book-study

SSAFY 11기 6반의 '토비의 스프링 스터디'
0 stars 0 forks source link

[1.7.2]UserDao의 의존관계 주입 #15

Closed sootudio closed 6 months ago

sootudio commented 7 months ago
public UserDao(){
    connectionMaker = new DConnectionMaker();
}

책에서 위와 같은 기존 UserDao에서 사용할 클래스를 직접 호출하는 방식을

public UserDao(){
    private ConnectionMaker connectionMaker;

    public UserDao(ConnectionMaker connectionMaker){
        this.connectionMaker = connectionMaker;
    }
}

다음과 같이 DI를 사용하여 생성자의 파라미터로 DConnectionMaker오브젝트를 전달한다고 설명이 되어 있었습니다.

이때, DI 컨테이너인 DaoFactory 오브젝트의 생성과 초기화, 제공 등의 작업을 수행한다고 나와있어서 위 코드에서 DI 컨테이너가 DConnectionMaker 객체를 만든다고 이해했는데, 정확히 DI컨테이너가 어떤 방식으로 오브젝트를 만드는지 궁금합니다.

이것에 대해 제가 찾아봤을 때는 프로그램이 실행됨과 동시에 DI 컨테이너에서 UserDao와 DConnectionMaker의 빈을 생성해놔서 UserDao 객체가 생성될 때 자동으로 DConnection을 주입하는거라고 이해했는데, 맞게 이해한것인지도 궁금합니다.

a-young-kim commented 7 months ago

1.7 공부하면서 계속 헷갈렸던 점인데 UserDao 빈이 생성되었다는 것이 UserDao 객체가 생성된거랑 다른 건가요?? 저도 UserDao와 DConnectionMaker 빈이 생성될 때 자동으로 DConnection을 주입하는 것으로 이해하기 하였습니다. 하지만 생성 순서 부분에서 궁금한 점이 있습니다.

@Configuration
public class DaoFactory {
    @Bean
    public UserDao userDao() {
        return new UserDao(connectionMaker());
    }

    @Bean
    public ConnectionMaker connectionMaker(){
        return new DConnectionMaker();
    }
}

userDao에서 connectionMaker 메소드를 참조하는데 스프링 컨테이너가 실행될 때 모든 빈이 생성된다면 실행 즉시 userDao 가 실행되고 해당 메소드가 connectionMaker를 참조하고 있기 때문에 connectionMaker 빈 생성하고 다시 UserDao 빈 생성을 완료하는 것일까요? 만약에 userDao와 connectionMaker의 순서가 바뀐다면 conntionMaker가 먼저 실행되고 나서 userDao가 실행될까요?

limjongheok commented 7 months ago

제가 알기로는 빈은 기본 생성자 부터 생성하고 주입을 하는 것으로 알고있습니다. https://creampuffy.tistory.com/177 관련 내용같아 올립니다