해결된 질문
작성
·
505
1
Binder.get(evn).bind("",bean.getClass());
Binder.get(evn).bindOrCreate("",bean.getClass());
해당 클래스 타입으로 Environment 빈 정보를 읽어서
값을 바인딩해주고 null이 될경우 새 빈 오브젝트로 만들어준다고 하셨는데
1.여기서 바인딩 결과가 null이 될경우라는게 무슨 의 미인지 잘 이해가 안갑니다.
그리고 저희가 만든
@MyConfigurationProperties 어노테이션에는
@Component가 메타어노테이션이 들어있고
실제 스프링이 사용하는
@ConfigurationProperties 에는
@Component가 없더라구요
@EnableConfigurationProperties에서는
직접 레지스트리에 저장하는거같은데
제가 이해한게 맞을까요?
답변 1
3
이번 강의는 스프링 부트가 스프링의 기술을 어떻게 활용하는지를 보여드리려고 했습니다. 이때 설명하는 스프링의 기술은 개발자가 애플리케이션을 개발하면서 한번쯤 활용해볼만한 수준의 스프링 기술이면 좋겠다고 생각했고요. 그래서 너무 로우레벨의 복잡한 작업은 최대한 피하려고 노력을 해봤습니다.
다른 영역은 대체로 괜찮았는데 문제는 프로퍼티 바인딩이더라고요. 이게 원래 스프링 부트는 스프링의 ImportBeanDefinitionRegistrar 인터페이스를 구현한 오브젝트를 @Import하는 방식으로 프로퍼티 처리를 진행합니다. 그런데 이 방식은 빈 정의를 담은 로우레벨의 구현을 사용해야하기 때문에 강의에서 설명하면 너무 난이도가 올라가고 이해하기 힘들지 않을까 하는 우려를 했죠. 그래서 최대한 그 이전에 설명했던 스프링의 여러가지 기법을 이용해서 프로퍼티 처리를 하는 구현을 만들어서 보여드리려고 했습니다. 결과적으로 프로퍼티를 다루는 예제의 코드는 스프링 부트와 다른 방식으로 진행이 됩니다.
강의에서 설명하려고 했던 핵심은 yml 등에 정의된 프로퍼티 값들이 결국 하나의 프로퍼티 클래스의 오브젝트로 변환되고, 이를 자동 구성 클래스가 받아서 사용한다는 것입니다. 그래서 프로퍼티 각각을 따로 기억하기 보다는 이게 어떤 프로퍼티 클래스로 묶이고, 그걸 사용하는 자동 구성 빈은 어떤 것인가를 추적해서 살펴보는 것을 권장드리고 싶었습니다.
그래서 살펴보신 것처럼 스프링 부트의 구현이랑 비교하면 프로퍼티 구현과 관련된 소스는 차이가 납니다. 이 부분은 이해하고 보셨으면 좋겠습니다. 언젠가 시간이 나면 스프링 부트가 사용한 것과 동일한 방법으로 프로퍼티를 다루는 방식의 예제 구현방법을 강의에 넣어볼 생각입니다.
부트에서 지원하는 Binder는 외부에서 가져온 프로퍼티 값을 오브젝의 프로퍼티에 하나씩 세팅하는 대신 자동으로 이름을 비교해서 새로운 오브젝트를 만들어서 세팅까지 해주는 편리한 기능을 제공하는 유틸리티 클래스입니다. 이걸 안 쓰면 프로퍼티 값을 하나하나 체크해서 set 해주는 코드를 만들어야해서 가능한 단순하게 예제에 적용해본 것이고요. 처음엔 bind를 썼다가 나중에 bindOrCreate로도 바꿔봤습니다. null이 리턴되는 케이스는 코드를 살펴보면 source가 없는 경우라고 합니다. 아마도 프로퍼티 값이 전혀 없는 경우에는 바인딩 결과를 생성하는 코드가 동작하지 않으니 결과가 null이 되는게 기본 bind()의 구조인 듯하고요. 이 경우에 빈 프로퍼티 오브젝트라도 리턴을 해줘야 자동 구성 빈에서 일일히 null체크를 하지 않고 프로퍼티 값을 읽으려는 시도를 할 수 있을테니 인스턴스를 생성하는 create 작업을 수행하도록 한 것 같습니다. 사실 이 Binder를 개발할 때 직접 사용할 일은 없을 것 같아서 더 자세한 설명을 하지는 않았습니다. 부트 내부에서 이런식으로 프로퍼티 클래스의 오브젝트를 만든다는 정도로 이해하고 넘어가면 좋을 듯합니다.
강사님 매번 답변 감사합니다.
자동 구성 정보에 대해서 어려웠는데 강사님 덕분에 스프링 코드를 보는 게 재미있어요
감사합니다 !!