인프런 커뮤니티 질문&답변

lets_go님의 프로필 이미지
lets_go

작성한 질문수

스프링 핵심 원리 - 기본편

빈 등록 초기화, 소멸 메서드

스프링 빈이 스프링에 의존하지 않는다는 것의 의미

해결된 질문

작성

·

330

1

안녕하세요! 강의에서 설정 정보를 사용하면 "스프링 빈이 스프링 코드에 의존하지 않는다"라고 말씀해주셨는데요.

@Bean이 있어 스프링 코드를 사용해야 하는 환경인데, 스프링에 의존하지 않는다는 게 어떤 의미인지 한 번에 잘 이해가 가지 않습니다.

import org.springframework.beans.factory.annotation.Autowire;

@Bean에 들어가보면 위와 같이 springframework를 임포트하는데, 이래도 스프링 코드가 아닐 수 있나요? 아니면 이 정도 코드는 스프링이 없어도 작동하는 건가요?

추가 설명 부탁드립니다! 감사합니다.

답변 4

2

안녕하세요. lets_go님, 공식 서포터즈 David입니다.

스프링 빈이 스프링 코드에 의존하지 않는다에서 설정 정보 클래스는 제외하여 생각하시면 됩니다.

설정 정보 클래스는 어쩔 수 없이 스프링 코드가 들어가야 하는 부분이라서요.

 

class NoSpringCode { }

 

@Configuration

class ConfigurationForNoSpringCode {

@Bean

NoSpringCode noSpringCode() { return new NoSpringCode(); }

}

 

@Component

class YesSpringCode {

  @Autowired ...

}

 

위처럼 3개의 클래스가 있습니다.

YesSpringCode는 @Component, @Autowired 애노테이션을 가집니다. 이 애노테이션들은 스프링에 종속적인 코드입니다. 그리고 설정 정보 클래스 없이도 빈으로 등록됩니다.

그에 반해 NoSpringCode에는 스프링에 종속적인 코드가 없습니다. 그러나 해당 클래스를 빈으로 등록하려면 별도의 설정 정보(ConfigurationForNoSpringCode)가 필요합니다.

즉, 스프링에 빈으로 등록할 때 사용되는 부분과 그렇지 않은 부분을 분리한 것입니다.

따라서, NoSpringCode는 스프링 코드에 의존하지 않는다고 말할 수 있습니다.

당연히 ConfigurationForNoSpringCode는 어쩔 수 없이 스프링 코드에 의존적으로 작성될 수 밖에 없고요.

감사합니다.

lets_go님의 프로필 이미지
lets_go
질문자

David님 안녕하세요! 의존적인 것과 그렇지 않은 것을 비교해주셔서 더 쉽게 이해가 되네요 ㅎㅎ 예제 코드까지 들어가며 친절히 설명해주셔서 감사합니다!

0

이해한 부분 틀린 포인트 있으면 피드백 부탁드립니다. 감사합니다. 

lets_go님의 프로필 이미지
lets_go
질문자

안녕하세요. 같은 수강생으로서 궁금증이 해결될 때까지 다시 질문하시는 태도가 굉장히 멋지다고 생각합니다.

다만 여기는 제 질문 글이라, 글을 쓰실 때마다 저에게 이메일과 인프런 사이트에서 알림이 뜨고 있습니다.

질문 글을 따로 작성해주시면 taeu kim님도 더 정확한 답변을, 더 편하게 받으실 수 있을 것 같습니다. 괜찮으시다면 따로 작성해주시길 부탁드립니다. 감사합니다 :)

답글 달아주시는 David님도 고생 많으세요!

아 정말요? 몰랐습니다..ㅠㅠ 죄송해요

lets_go님의 프로필 이미지
lets_go
질문자

괜찮습니다 감사해요! 로드맵 완강까지 힘내봐요💪🏻

0

ConfigurationForNoSpringCode(설정 정보 클래스)가 정확히 무엇인가요?

"별도의 설정 정보"라고 알려주셨는데, 저희 예제 에선 무엇을 나타내나요? @Bean 인가요? @Bean옆의 "initMethod = "init" 인가요? 

본 강의 관심사의 분리편을 참고해주세요.

설정 정보 클래스 = ConfigurationClass 

(예를들어, 관심사 분리 편의 AppConfig.class)

같은 맥락에서 이번 회차의 configurationClass인 LifeCycleConfig는 별도의 설정 정보인 NetworkClient를 성정해주어야 하는데, 이를 위해선 @Bean 이라는 설정정보 어노테이션이 필요할 수 밖에 없다. 따라서 의존한다는 것을 이야기하신 부분에 "설정 정보" 부분은 제외하고 이해하면 된다.

김영한님께서 말씀하신 "의존 하지 않는 다"의 의미는 bean으로 등록된 NetworkClient 안에서 초기화, 종료 메소드가 initalizingBean과 같은 "스프링에 의존하는 코드(implement 해야하므로)"가 아닌 init(), close()를 사용하므로 의존하지 않는다는 것이다.

0

그에 반해 NoSpringCode에는 스프링에 종속적인 코드가 없습니다. 그러나 해당 클래스를 빈으로 등록하려면 별도의 설정 정보(ConfigurationForNoSpringCode)가 필요합니다. 에서 (ConfigurationForNoSpringCode) == @Bean 을 의미하는 건가요?? 

말 그대로 ConfigurationForNoSpringCode(클래스)입니다.

이번 경우에는  NetworkClient.class를 의미하는건가요?

질문이 이해되지 않는데 더 풀어서 설명해주시겠어요?

lets_go님의 프로필 이미지
lets_go

작성한 질문수

질문하기