들어가며
안녕하세요!
이번에 퇴사 후 약 2달간의 휴가를 마치고 돌아온 백엔드 파트 오일우라고 합니다.
백엔드 파트리더 종하가 초기구성한 OASIS 프로젝트를 차근차근히 분석해 나가면서 회원가입/로그인기능을 구현해 나가고 있는데요.
원래는 전에 회사에서는 레거시 형태의 소스들을 많이 다루었었고, 일에 쫓기다 보니 스프링에서 당연하게 사용하는 어노테이션이나 스프링 내부에서 돌아가는 원리들을 크게 생각하지 않고 기능 개발에만 집중했었습니다.
그래서 이번에는 조금 시간이 걸리더라도 이전에는 그냥 지나치고 넘어갔던 궁금증과 모르는 단어와 개념들을 잘게 쪼개나 가면서 파악해 가며 개발을 진행해보려고 합니다.
본론
그래서 처음으로 눈에 들어온 부분이 `BeanConfig` 였는데요.
우선 @Bean을 등록한다는 의미는 스프링에서 관리할 수 있게 선언하는 것
1. BeanConfig는 정해져 있는 명칭은 아니고, 외부 라이브러리들을 수동으로 빈으로 등록하여 정리해 놓은 파일을 BeanConfig로 명명한 것.
(좀 더 찾아보니 비슷한 이유로 AppConfig와 비슷한 구조로 보이는데, AppConfig라는 명칭은 좀 더 애플리케이션의 중심적이고 전체적인 경우에 사용하고, BeanConfig는 특정 유형의 클래스나 외부 모듈을 사용하는 상황에서 사용하는 것 같습니다. (옛날에는 이러한 빈 등록을 XML에 등록해서 사용했습니다.)
2. 외부 라이브러리와 같은 파일들을 @Bean으로 등록하고 스프링 IoC Container에서 관리하게 하기 위해서 사용
그리고 와중에 스프링 IoC Container가 정확히 무슨 역할을 하는지 궁금해져서 조금 더 찾아봤습니다.
우선 IoC(Inversion Of Control)가 무슨 뜻이냐
직역하면 제어 반전. 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미합니다. → 객체관리의 주체가 개발자가 아닌 프레임워크(Container)가 됨.
쉽게 말하면 원래 개발자가 해야 하는 것들(인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리)을 스프링 컨테이너가 해주기 때문에 IoC컨테이너라고 하는 것 같습니다.
그래서 Spring IoC 컨테이너는 이런 역할들과 특징을 가진다고 정리할 수 있겠습니다.
- IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.
- POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다.
- 개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡긴다.
- 개발자는 비즈니스 로직에 집중할 수 있다.
- 객체 생성코드가 없어 TDD에 용이하다.
그래서 스프링에 IoC컨테이너에게 Bean등록하려면 위 방법밖에 없나?
아닙니다. 사실 저도 모르게 Bean을 등록하고 있었더라고요.
@Component 어노테이션입니다. 흔히 사용하는 @Service,@Repository, @Controller 어노테이션도 안에 들어가 보면 @Component 어노테이션을 찾아볼 수 있는데요.
또한 이렇게 AppConfig나 BeanConfig파일을 사용하지 않고 Bean을 등록하는 것을 모두 `자동등록`이라고 합니다.
반대로 말하면 위에서 설명한 파일을 사용하여 직접 Spring Bean을 명시하는 방법은 `수동등록`이 되는 거죠.
이렇게 Bean을 등록하여 개발을 진행하면서 각 객체 별로 필요한 DI나 생명주기를 스프링에서 알아서 관리해 주는 거죠.
(DI + IoC + Bean 은 스프링에서 정말 핵심적인 개념이다 보니까 다음에 파트별로 나눠서 조금 더 깊이 공부해서 포스팅해보려고 합니다.)
그럼 스프링은 어떻게 이러한 Bean들을 찾고 자동 등록해 주는가?
@ComponentScan을 사용함으로써 가능합니다.
그래서 아까 위에서 수동으로 등록했던 Bean들을 자동으로 변경한다고 하면
위와 같이 BeanConfig파일에 탐색을 시작할 패키지명과
사용하는 클래스의 @Component 어노테이션을 사용해서 Bean을 자동으로 등록할 수 있습니다.
마치며
Bean등록을 자동으로 하는 것이 훨씬 편리하나, Bean을 수동으로 등록하는 것이 확실히 개발자가 한 파일에서 등록되어 있는 Bean을 관리하여 코드를 분석하거나 문제가 생겼을 때 더 빠른 대처가 가능하다고 생각이 되었습니다.
마지막으로, 현업에서는 수많은 Bean들을 한파일에서 수동등록 하여 관리하는 것은 어렵기에 대부분 자동등록을 더 많이 사용한다고 합니다.
긴 글 읽어주셔서 감사합니다.
'우리들의 성장일지' 카테고리의 다른 글
고객과의 신뢰도를 높이기 위한 방법. (0) | 2024.08.13 |
---|---|
[팀 껌딱지] 우리 팀은 티켓 주도 개발을 이렇게 사용해요! (0) | 2024.08.01 |
[팀 껌딱지] PWA 만들기 (0) | 2024.07.31 |
[팀 껌딱지] 서비스 블루프린트(Service Blueprint)란? (0) | 2024.07.09 |
[팀 껌딱지] 운영 DB에 변경 쿼리 날릴 땐 꼭 트랜잭션을 사용해 줘요 (0) | 2024.04.29 |