스프링에서는 빈 등록 과정이 어떻게 발전되어 왔을까?
📌 서론
Spring Framework에서의 빈(bean) 설정 방식은 시간이 지나면서 점차 발전해 왔다.
초기에는 XML 기반 설정이 주로 사용되었으나, 자바 기반 설정이 도입되면서 설정 관리가 더욱 간편해졌다.
이후, 컴포넌트 기반 설정이 등장하면서 빈 관리의 자동화와 모듈화가 크게 개선되었다.
이번 글에서는 이러한 빈 설정 방식의 발전 과정을 예시와 함께 단계별로 알아보자.
참고로 저는 구버전의 springFramework로 개발할 일이 있었는데 xml로 빈 등록하는 과정은 생각보다 복잡했습니다. ㅠㅠ 그래서 이렇게 발전된 것이 너무나도 감사합니다.
1. XML 기반 설정
초기 스프링의 빈 설정 방식
- Spring Framework의 초기 버전에서는 애플리케이션의 모든 설정이 XML 파일을 통해 이루어졌다. 개발자는 XML 파일에서 빈을 정의하고, 각 빈 사이의 의존성을 설정했다. 이 방식은 강력하고 유연했지만, XML 파일이 길어지면서 관리하기 어려워지는 문제가 있었다.
<bean id="myService" class="com.example.MyService">
<property name="repository" ref="myRepository"/>
</bean>
<bean id="myRepository" class="com.example.MyRepository"/>
- 지금 위의 예시코드는 2개의 빈을 이렇게 등록하지만 만약 빈 등록할 객체가 수십~수백 개라면? 모두 다 xml로 관리해야 하는 것이다. 하나의 변경이 있으면 의존하는 모든 빈을 수정해야 한다.
2. 자바 기반 설정 (Java-based Configuration)
자바 기반 설정의 도입
- Spring 3.0부터 자바 기반 설정이 도입되었으며, 이는 XML 대신 자바 클래스를 통해 애플리케이션 설정을 수행할 수 있도록 해주었다. 자바 기반 설정은 타입 안전성을 제공하며, 코드를 더 읽기 쉽고 유지보수하기 쉽게 만들어줬다.
- 이 방식은 @Configuration 어노테이션으로 설정 클래스를 정의하고, @Bean 어노테이션으로 빈을 등록한다. XML 기반 설정에 비해 간결하며, 코드와 설정이 통합된다는 장점이 있다. (지금도 이 방식은 많이 사용한다. ex) security 설정)
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService(myRepository());
}
@Bean
public MyRepository myRepository() {
return new MyRepository();
}
}
3. 컴포넌트 기반 설정 (Component-based Configuration)
컴포넌트 기반 설정 방식
- 컴포넌트 기반 설정은 자바 기반 설정의 자연스러운 발전으로, 스프링 컨테이너가 자동으로 빈을 탐지하고 등록하도록 하여 개발 생산성을 더욱 높였다.
- @Component, @Service, @Repository, @Controller와 같은 어노테이션과 함께, @ComponentScan 어노테이션을 사용하여 특정 패키지를 스캔하고 필요한 빈을 자동으로 등록할 수 있다.
- 참고로, @Service, @Repository, @Controller는 모두 내부적으로 @Component를 확장한 어노테이션이다. 즉, 이 어노테이션들은 @Component를 기반으로 하여 역할에 따라 이름만 변경된 것이다. 예를 들어, @Service는 서비스 계층을 나타내기 위해, @Repository는 데이터 접근 계층을 나타내기 위해, @Controller는 웹 계층을 나타내기 위해 사용된다.
@Service
public class MyService {
private final MyRepository myRepository;
@Autowired
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
}
@Repository
public class MyRepository {
// Repository implementation
}
@ComponentScan 어노테이션으로 빈 등록하기
- 아래와 같이 @ComponentScan 어노테이션을 사용하면 지정된 패키지 내의 @Component를 사용하고 있는 클래스들을 스캔하여 스프링 빈으로 자동 등록할 수 있다.
@Configuration
@ComponentScan(basePackages = "com.example.project")
public class AppConfig {
// 스프링이 자동으로 스캔하여 빈으로 등록합니다.
}
4. 결론: 스프링 빈 설정의 진화
Spring Framework의 빈 설정 방식은 단순한 XML 파일 기반의 설정에서 자바 기반 설정을 거쳐 컴포넌트 기반 설정으로 진화해 왔다. 이러한 발전은 코드의 가독성, 유지보수성, 그리고 개발 생산성을 크게 향상시키기 위한 것이었다.
먼저 XML 기반 설정은 초기 스프링 애플리케이션 개발의 근간을 이루었지만, 복잡한 애플리케이션에서 관리하기 어려워지는 단점이 있었다.
다음으로 자바 기반 설정은 스프링 3.0부터 도입되었으며, XML의 복잡성을 줄이기 위해 자바 코드를 활용하여 설정을 정의하는 방식을 제안했다. 이를 통해 타입 안전성을 보장하고, 설정과 비즈니스 로직을 더 가깝게 통합할 수 있었다.
마지막으로 컴포넌트 기반 설정은 자바 기반 설정의 발전된 형태로, 빈 등록을 더욱 자동화하고 모듈화 하여 개발자들이 설정을 직접 관리할 필요 없이, 어노테이션만으로 스프링이 빈을 관리하도록 했다.
참고자료
'Spring 기초 > Spring 설정' 카테고리의 다른 글
Gradle: Implementation과 RuntimeOnly의 차이점 및 활용 방법 (0) | 2023.12.11 |
---|---|
[Spring] Gradle 이해하기 (0) | 2023.11.08 |
[Spring] yml vs properties 설정파일 비교 (1) | 2023.11.08 |
[Spring] Maven이란? (0) | 2023.11.08 |
Spring Boot: Gradle 버전 확인하기 (0) | 2023.10.26 |