본문 바로가기

IT 이야기

[한글화 프로젝트] 스프링 부트 101 : 스프링 빈이 진짜 뭘까?








대표 번역가 : 백재영


실리콘밸리를 꿈꾸는 개발자.
현재 LF 플랫폼 개발팀에서 있으며 요즘은 번역의 어려움과 재미를 한창 느끼는 중이다. 


원문 링크





스프링 빈이 진짜 뭘까?


오늘 Spring Boot Application 내부에서 무슨 일이 벌어지고 있는지 이해하려고 하는 중 멘붕이 왔다.


스프링을 처음 접하면서 꽤 많은 시간을 구글링과 문서 읽기에 쏟아부었지만 ‘빈'과 같은 기본적인 개념에 관해서는 사전지식을 전제로 한다고 알고 있었다.


Pivotal의 스프링 팀에 있는 내 친구이자 동료인 Mark Fisher가 내게 찾아와 설명해주는 대신 나는 이것에 대해 글을 쓰기로 약속했다.


그 결과는 지금 보고 있는 이 블로그와 여기에 있다. https://github.com/markfisher/spring-boot-hello-world


태초에 XML이 있었다

스프링은 자바 애플리케이션이 종속된 메인 클래스를 구성하는 데에 J2EE보다 더 간단한 XML 기반의 방식을 제공한다.


단순히 모든 것을 자바의 new를 이용하여 인스턴스화하는 것은 이상적인 것이 아니었다. 이는 모든 종속성을 코드에 기술해야하므로 로컬 테스트를 위한 데이터베이스와 CI 또는 프로덕션을 위한 다른 데이터베이스를 쉽게 사용할 수 없었기 때문이다.


데이터베이스 커넥션같은 것들을 추상화한 자신만의 팩토리를 만드는 대신, 스프링은 이 모든 것들을 XML 하나로 제공한다.


스프링은 구동시 환경에 특정한 XML을 읽어들이고 XML에 있는 것들을 기반으로 해당 클래스의 인스턴스를 생성한다.

 

그리고 이런 인스턴스들은... 이런 식의 (beans)이다.

 

ApplicationContext.getBean()

 

지금은 @Annotation이다

세월이 흘러 XML은 @Configuration @ConfigurationProperties 같은 주석이 달린 자바 코드로 대체되었다.

 

Screen Shot 2017-10-11 at 10.11.48 PM.png


팩토리 메소드에 @Bean이 달린 것에 주목하라.


설정 클래스가 META-INF/spring.factories에 포함되어 있으면, 스프링 부트 애플리케이션은 시작시 자동으로 팩토리 메소드를 호출하여 해당 클래스의 싱글턴 인스턴스를 생성한다.


이건 마법이다

그리고 이런 인스턴스는 여전히 이라 불린다


Spring Initializr와 모든 starter들은 다 뭐냐고?

이제 configuration scanning이 뭔지 알았으니 스프링 부트 스타터의 역할은 더 이해하기 쉬울 것이다.


스프링 부트 애플리케이션의 종속성에 스타터를 포함시킴으로써 스프링은 스타터 내부의 설정 클래스를 검색하여 해당 스타터에 대한 을 자동으로 생성하게 된다.

 

Initializr injection

짠!