작성
·
387
0
컨트롤러와 서비스에 MyLogger가 주입받는 것인지 질문드립니다.
컨트롤러는 LogDemoService와 ObjectProvider를 주입받습니다.
public class LogDemoController {
private final LogDemoService logDemoService;
private final ObjectProvider<MyLogger> myLoggerProvider;
// ...
}
서비스는 ObjectProvider를 주입받습니다.
public class LogDemoService {
private final ObjectProvider<MyLogger> myLoggerProvider;
// ...
}
결국 컨트롤러와 서비스에는 MyLogger가 주입받는 것이 아닌 것인지요?
MyLogger는 DI가 아니라 DL의 역할만 해도 충분한 것일까요? 그렇다면 DI와 DL의 차이는 클라이언트에서 getObject()를 한번더 해서 찾아야 한다는 번거로움 말고는 없을까요?
getObject() 이후 생성된 MyLogger는 @Autowired를 받는 것이 없는 것으로 보아 의존성 주입 없이 빈만 생성된 것으로 이해하면 될까요?
질문 읽어주셔서 감사합니다.
답변 2
2
안녕하세요. hi님
여기서는 LogDemoController
와 LogDemoService
가 MyLogger
를 직접 주입받지 않고, 대신 ObjectProvider<MyLogger>
를 통해 MyLogger
를 동적으로 받아오는 것을 확인할 수 있습니다.
ObjectProvider
는 Spring Framework에서 제공하는 인터페이스로서, 특정 빈을 동적으로 주입받기 위해 사용됩니다. 이 인터페이스를 이용하면 getObject()
메서드를 통해 빈을 찾을 수 있습니다. 그래서 여기서는 MyLogger
가 직접 주입되지 않고, ObjectProvider
를 통해 필요할 때마다 MyLogger
인스턴스를 얻어오는 것입니다.
DI(Dependency Injection)와 DL(Dependency Lookup)의 차이는 누가 빈을 관리하느냐에 있습니다. DI는 스프링 컨테이너가 빈의 생성과 의존성을 관리하는 반면, DL은 개발자가 직접 컨테이너에게 필요한 빈을 요청하여 얻어옵니다. 따라서 DI는 코드를 간결하게 만들어 주지만, DL은 더 많은 유연성을 제공합니다.
getObject()
를 통해 반환되는 MyLogger
객체는 @Autowired
를 받지 않았기 때문에, 이 객체에 대한 의존성 주입은 수행되지 않습니다. 이 말은, MyLogger
가 다른 빈에 의존성을 가지고 있지 않다는 뜻입니다. 따라서 이해하신대로 getObject()
는 MyLogger
객체의 빈만 생성해주는 역할을 수행합니다.
마지막으로, ObjectProvider
를 사용하는 이유는, MyLogger
객체가 요청이 시작될 때 마다 새로 생성되기 때문입니다. ObjectProvider
를 사용하면 요청이 시작될 때 마다 MyLogger
의 새 인스턴스를 얻어올 수 있습니다. 이것은 @RequestScope
와 같은 동적인 빈 생명주기를 다루는데 유용합니다.
이 내용을 기반으로 질문에 답을 드리겠습니다.
Q: 결국 컨트롤러와 서비스에는 MyLogger가 주입받는 것이 아닌 것인지요?
네 MyLogger를 직접 주입받는 것이 아닙니다. 대신에 MyLogger 빈을 찾아올 수 있는(DL) ObjectProvider를 주입받습니다.
MyLogger는 DI가 아니라 DL의 역할만 해도 충분한 것일까요? 그렇다면 DI와 DL의 차이는 클라이언트에서 getObject()를 한번더 해서 찾아야 한다는 번거로움 말고는 없을까요?
DI는 스프링이 만들어지는 시점에 발생하는데요. MyLogger는 싱글톤이 아니라 @RequestScope 입니다. 따라서 스프링이 만들어지는 시점에는 MyLogger 자체가 존재하지 않습니다. 이후에 고객의 요청이 들어올 때 MyLogger도 생성됩니다. 따라서 DI가 아니라 고객이 요청하는 시점에 찾아와야 하므로 DL이 필요합니다.
getObject() 이후 생성된 MyLogger는 @Autowired를 받는 것이 없는 것으로 보아 의존성 주입 없이 빈만 생성된 것으로 이해하면 될까요?
MyLogger 내부에 의존관계가 없지만 MyLogger는 내부에서 다른 객체를 의존할 수 있습니다. MyLogger가 만들어지는 시점에 의존관계 주입을 받을 수 있습니다. 물론 지금은 MyLogger가 따로 의존하는 것이 없기 때문에 빈만 만들어집니다.
감사합니다.
1
안녕하세요, 인프런 AI 인턴이에요.
답변드리겠습니다.
컨트롤러와 서비스에서 MyLogger를 주입받는 것이 아닌 ObjectProvider를 주입받고 getObject()를 통해 MyLogger를 가져오는 방식으로 사용하는 것으로 보입니다. 이 경우 MyLogger는 DL(Dependency Lookup)의 역할을 하게 됩니다.
DI와 DL의 차이는, DI는 컨테이너가 객체 생성 및 의존성 주입을 관리하는 반면, DL은 컨테이너의 도움 없이 객체를 생성하고 의존성을 검색하는 방식이라는 점이 차이점입니다.
getObject()를 한번 더 해서 찾아야 하는 번거로움이 있긴 하지만, 이는 컨테이너의 생성과 관리를 받지 않는 독립적인 객체를 사용해야 할 때 사용되며 MyLogger 같은 경우에는 ObjectProvider를 통한 DL 방식으로 사용해도 충분히 유용합니다.
getObject() 이후 생성된 MyLogger는 빈으로 등록되어있고 @Autowired 없이는 사용할 수 없는 것으로 이해하시면 됩니다.
추가적인 질문이 있다면 언제든지 댓글로 질문해주세요.
감사합니다.
DI와 DL의 차이점에 대해 답변주셨는데요
다른 질문과 답변(https://www.inflearn.com/questions/716679/dl-%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84-%EC%A1%B0%ED%9A%8C-%EC%99%80-di-%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84-%EC%A3%BC%EC%9E%85)을 보면
"DL은 클라이언트가 DL 대상을 통해서 컨테이너에 찾을 빈을 요청하게 됩니다."라는 답변이 있습니다.
"DL은 컨테이너의 도움 없이 객체를 생성하고 의존성을 검색하는 방식이라는 점이 차이점입니다."라는 내용과 상충하는 것 같아서 다시 질문드립니다.
DL은 1) get.object() 이후에 컨테이너에 빈이 생성되나요?
2) get.object() 이후에 컨테이너가 아닌 다른 곳에 객체가 생성되고 의존성이 주입된다는 건가요?
그리고 "getObject() 이후 생성된 MyLogger는 빈으로 등록되어있고" 라는 답변에서 빈으로 등록되어 있다는 말 자체가 컨테이너에 빈이 생성된다는 말 아닌가요?