스프링 의존성 주입 시리즈를 만들며
스프링에서의 의존성 주입은 스프링의 기초가 되는 기술 중 하나로, 스프링 애플리케이션을 제대로 만들기 위해서는 의존성 주입에 대한 적절한 이해가 필요하다. 하지만 내가 스프링을 공부하면서 느낀 점은 의존성 주입과 관련된 내용을 체계적으로 정리한 자료를 찾기가 않다는 점이었다. 나는 이미 안드로이드 개발을 하면서 Koin, Dagger, Dagger-Hilt 등의 의존성 주입 프레임워크를 경험한 적이 있기 때문에 내가 알고 있던 다양한 키워드를 동원해 내가 아는 지식들을 찾았지만, 스프링에서 의존성 주입에 대해 처음 접한다면 의존성 주입에 대한 지식을 체계적으로 정리하기 힘들 것 같다 느꼈다. 이에 스프링 의존성 주입에 대한 내용들이 한 번에 쭉 정리할 수 있는 자료가 있으면 좋겠다는 생각을 했고, 그 자료를 내가 만들어보자는 생각을 했다.
이 시리즈에서는 의존성 주입이 무엇인지 부터 시작해, 스프링에서는 의존성 주입을 위해 컨테이너를 어떻게 만들고, 그 내부에 객체를 어떻게 저장하는지, 객체가 생성되고 파괴되는 범위를 어떻게 관리하는지 등을 단계적으로 다룬다. 이를 통해 의존성 주입의 기초를 탄탄히 다질 수 있도록 한다.
이 자료가 많은 분들께 도움이 되기를 바란다.
전체 코드: GitHub
이 프로젝트가 도움이 되셨다면 저장소에 Star⭐️를 눌러주세요! Stargazers는 다음 페이지에서 확인할 수 있습니다.
이 시리즈에서는 특정 모듈(MVC 등)과 관련된 의존성 주입의 범위와 관련된 내용은 다루지 않는다. 이와 관련된 내용은 각 모듈을 다루면서 별도로 다룰 것이다.
글 목록
1. [Kotlin] 의존성이란 무엇인가? 강한 결합과 느슨한 결합을 통해 이해하는 의존성
[Spring] 의존성이란 무엇인가? 강한 결합과 느슨한 결합을 통해 이해하는 의존성
의존성이란?소프트웨어 개발에서 의존성(Dependency)이란 한 모듈이 다른 모듈의 기능을 사용하거나, 하나의 객체가 다른 객체의 기능을 사용하는 것을 뜻한다. 예를 들어 A 객체의 기능을 실행할
kotlinworld.com
2. [Kotlin] 느슨한 결합의 장점과 한계 자세히 알아보기
[Spring] 느슨한 결합의 장점과 한계 자세히 알아보기
느슨한 결합의 장점느슨한 결합을 사용하게 됐을 때의 장점은 크게 다음 두가지가 있다.1. 변경 혹은 리펙토링이 편해진다.2. 컴파일 타임의 최소화 지금부터 각각이 무엇을 뜻하는지 알아보자.
kotlinworld.com
3. [Spring] 의존성 주입이란 무엇인가? IOC Container과 Bean으로 알아보는 의존성 주입
[Spring] 의존성 주입이란 무엇인가? IOC Container과 Bean으로 알아보는 의존성 주입
의존성 주입을 알기 위해 미리 알아야 내용들[Spring] 의존성이란 무엇인가? 강한 결합과 느슨한 결합을 통해 이해하는 의존성[Spring] 느슨한 결합의 장점과 한계 자세히 알아보기 의존
kotlinworld.com
4. [Spring] IOC Container에 등록된 모든 Bean의 이름 가져와 출력하는 방법 알아보기
[Spring] IOC Container에 등록된 모든 Bean의 이름 가져와 출력하는 방법 알아보기
IOC Container에 등록된 모든 Bean의 이름 가져와 출력하기IOC Container에 등록된 모든 Bean의 이름을 가져오기 위해서는 AnnotationConfigApplicationContext의 beanDefinitionNames 프로퍼티를 사용하면 된다. 이를 사
kotlinworld.com
5. [Spring] @Bean의 name 프로퍼티 사용해 Bean의 이름 커스텀하게 설정하기
[Spring] @Bean의 name 프로퍼티 사용해 Bean의 이름 커스텀하게 설정하기
Bean의 이름이 설정되는 방법Bean의 이름은 @Bean 어노테이션이 붙은 함수의 이름으로 자동 설정된다. 예를 들어 다음과 같이 Bean들이 설정되어 있다고 해보자.@Configurationclass DefaultContainerConfiguration
kotlinworld.com
6. [Spring] @Bean 사용해 클래스 초기화 시 의존성 주입하기
[Spring] @Bean 사용해 클래스 초기화 시 의존성 주입하기
클래스 초기화 시 의존성을 주입하는 것이 필요한 이유이전 시간까지 우리는 String 타입이나 Int 같은 간단한 타입의 Bean만 만들었다. 하지만, 실제 애플리케이션을 만들 때는 클래스들이 다른 클
kotlinworld.com
7. [Spring] @Primary와 @Qualifier 사용해 하나의 인터페이스에 둘 이상의 구현체가 있을 때 의존성 주입 우선 순위 관리하기
[Spring] @Primary와 @Qualifier 사용해 하나의 인터페이스에 둘 이상의 구현체가 있을 때 의존성 주입
Bean의 의존성 주입 우선 순위 관리가 필요한 이유다음과 같은 모양의 UserRepository와 두 개의 구현체 InMemoryUserRepository, DbUserRepository 가 있다고 해보자.interface UserRepository { fun createUser(id: String, user:
kotlinworld.com
8. [Spring] @Component와 @ComponentScan 사용해 자동으로 의존성 주입하기
[Spring] @Component와 @ComponentScan 사용해 자동으로 의존성 주입하기
@Bean 어노테이션 사용해 Bean 등록하기이전 글에서 유저 정보를 조작하는 UserRepository 인터페이스를 구현하는 객체가 InMemoryUserRepository와 DbUserRepository 두개가 있고, 이 중 하나를 UserCreator 클래스에
kotlinworld.com
9. [Spring] @Component와 @Bean의 차이는 무엇이고 언제 사용해야 할까?
[Spring] @Component와 @Bean의 차이는 무엇이고 언제 사용해야 할까?
@Component를 사용하지 못하고 @Bean을 사용해야 하는 경우@Component 어노테이션은 클래스 위에 붙는다. 즉, 내가 클래스를 만들 수 있을 때만 사용할 수 있다. 예를 들어 외부 라이브러리의 클래스를 B
kotlinworld.com
10. [Spring] @ComponentScan 사용해 특정 패키지 하위의 의존성을 스캔하는 방법 알아보기
[Spring] @ComponentScan 사용해 특정 패키지 하위의 의존성을 스캔하는 방법 알아보기
@ComponentScan의 기본 동작클래스에 @Configuration 어노테이션과 함께 @ComponentScan 어노테이션이 붙어 있으면, 해당 Configuration 은 해당 패키지 하위의 모든 클래스를 스캔해 @Component 어노테이션이 붙은
kotlinworld.com
11. [Spring] @Lazy 사용해 의존성 주입 시 Bean 지연 초기화 설정하기
[Spring] @Lazy 사용해 의존성 주입 시 Bean 지연 초기화 설정하기
지연 초기화가 필요한 이유@Component 어노테이션이나 @Bean 어노테이션을 통해 IOC Container에 Bean을 등록하면 스프링 애플리케이션 시작 시 등록된다. 예를 들어 다음과 같이 초기화 시 InitTestUseCase I
kotlinworld.com
12. [Spring] @Autowired를 사용해 의존성 주입하기 : 생성자 주입, 필드 주입, 세터 주입
[Spring] @Autowired를 사용해 의존성 주입하기 : 생성자 주입, 필드 주입, 세터 주입
@AutoWired란?스프링은 생성자 주입(Constructor Injection), 세터 주입(Setter Injection), 필드 주입(Field Injection) 이라 불리는 의존성을 주입하기 위한 세가지 방법을 제공한다. 그리고 이들은 @AutoWired란 어노
kotlinworld.com
13. [Spring] @Scope 사용해 Bean을 싱글톤일지 필요할 때마다 새로 만들지 결정하기
[Spring] @Scope 사용해 Bean을 싱글톤일지 필요할 때마다 새로 만들지 결정하기
@Scope 어노테이션이 필요한 이유우리가 Bean을 만들 때 기본적으로 싱글톤으로 만들어진다. 즉, 한 번 생성되면 해당 Bean이 필요한 곳 모두에서 재사용된다. 만약 순수 함수로만 구성된 Bean이거나
kotlinworld.com
14. [Spring] ObjectProvider 사용해 Bean 생성하고 언제 사용돼야 하는지 알아보기
[Spring] ObjectProvider 사용해 Bean 생성하고 언제 사용돼야 하는지 알아보기
ObjectProvider가 필요한 이유앞서 우리는 다음과 같이 ShoppingCart를 프로토 타입 Bean으로 만들고, 이를 싱글톤으로 선언된 CartController에서 사용하고자 했다. @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)@Compon
kotlinworld.com
15. [Spring] @PostContruct 사용해 Bean이 초기화된 이후에 특정 작업 하도록 만들기
[Spring] @PostContruct 사용해 Bean이 초기화된 이후에 특정 작업 하도록 만들기
@PostContruct 란 무엇인가?@PostConstruct는 함수에 붙는 어노테이션으로, 해당 어노테이션이 붙은 함수는 Bean이 만들어질 때 한 번 실행된다. Bean이 초기화된 이후에 데이터를 로딩해야 한다거나, 로깅
kotlinworld.com
스프링 의존성 주입 시리즈를 만들며
스프링에서의 의존성 주입은 스프링의 기초가 되는 기술 중 하나로, 스프링 애플리케이션을 제대로 만들기 위해서는 의존성 주입에 대한 적절한 이해가 필요하다. 하지만 내가 스프링을 공부하면서 느낀 점은 의존성 주입과 관련된 내용을 체계적으로 정리한 자료를 찾기가 않다는 점이었다. 나는 이미 안드로이드 개발을 하면서 Koin, Dagger, Dagger-Hilt 등의 의존성 주입 프레임워크를 경험한 적이 있기 때문에 내가 알고 있던 다양한 키워드를 동원해 내가 아는 지식들을 찾았지만, 스프링에서 의존성 주입에 대해 처음 접한다면 의존성 주입에 대한 지식을 체계적으로 정리하기 힘들 것 같다 느꼈다. 이에 스프링 의존성 주입에 대한 내용들이 한 번에 쭉 정리할 수 있는 자료가 있으면 좋겠다는 생각을 했고, 그 자료를 내가 만들어보자는 생각을 했다.
이 시리즈에서는 의존성 주입이 무엇인지 부터 시작해, 스프링에서는 의존성 주입을 위해 컨테이너를 어떻게 만들고, 그 내부에 객체를 어떻게 저장하는지, 객체가 생성되고 파괴되는 범위를 어떻게 관리하는지 등을 단계적으로 다룬다. 이를 통해 의존성 주입의 기초를 탄탄히 다질 수 있도록 한다.
이 자료가 많은 분들께 도움이 되기를 바란다.
전체 코드: GitHub
이 프로젝트가 도움이 되셨다면 저장소에 Star⭐️를 눌러주세요! Stargazers는 다음 페이지에서 확인할 수 있습니다.
이 시리즈에서는 특정 모듈(MVC 등)과 관련된 의존성 주입의 범위와 관련된 내용은 다루지 않는다. 이와 관련된 내용은 각 모듈을 다루면서 별도로 다룰 것이다.
글 목록
1. [Kotlin] 의존성이란 무엇인가? 강한 결합과 느슨한 결합을 통해 이해하는 의존성
[Spring] 의존성이란 무엇인가? 강한 결합과 느슨한 결합을 통해 이해하는 의존성
의존성이란?소프트웨어 개발에서 의존성(Dependency)이란 한 모듈이 다른 모듈의 기능을 사용하거나, 하나의 객체가 다른 객체의 기능을 사용하는 것을 뜻한다. 예를 들어 A 객체의 기능을 실행할
kotlinworld.com
2. [Kotlin] 느슨한 결합의 장점과 한계 자세히 알아보기
[Spring] 느슨한 결합의 장점과 한계 자세히 알아보기
느슨한 결합의 장점느슨한 결합을 사용하게 됐을 때의 장점은 크게 다음 두가지가 있다.1. 변경 혹은 리펙토링이 편해진다.2. 컴파일 타임의 최소화 지금부터 각각이 무엇을 뜻하는지 알아보자.
kotlinworld.com
3. [Spring] 의존성 주입이란 무엇인가? IOC Container과 Bean으로 알아보는 의존성 주입
[Spring] 의존성 주입이란 무엇인가? IOC Container과 Bean으로 알아보는 의존성 주입
의존성 주입을 알기 위해 미리 알아야 내용들[Spring] 의존성이란 무엇인가? 강한 결합과 느슨한 결합을 통해 이해하는 의존성[Spring] 느슨한 결합의 장점과 한계 자세히 알아보기 의존
kotlinworld.com
4. [Spring] IOC Container에 등록된 모든 Bean의 이름 가져와 출력하는 방법 알아보기
[Spring] IOC Container에 등록된 모든 Bean의 이름 가져와 출력하는 방법 알아보기
IOC Container에 등록된 모든 Bean의 이름 가져와 출력하기IOC Container에 등록된 모든 Bean의 이름을 가져오기 위해서는 AnnotationConfigApplicationContext의 beanDefinitionNames 프로퍼티를 사용하면 된다. 이를 사
kotlinworld.com
5. [Spring] @Bean의 name 프로퍼티 사용해 Bean의 이름 커스텀하게 설정하기
[Spring] @Bean의 name 프로퍼티 사용해 Bean의 이름 커스텀하게 설정하기
Bean의 이름이 설정되는 방법Bean의 이름은 @Bean 어노테이션이 붙은 함수의 이름으로 자동 설정된다. 예를 들어 다음과 같이 Bean들이 설정되어 있다고 해보자.@Configurationclass DefaultContainerConfiguration
kotlinworld.com
6. [Spring] @Bean 사용해 클래스 초기화 시 의존성 주입하기
[Spring] @Bean 사용해 클래스 초기화 시 의존성 주입하기
클래스 초기화 시 의존성을 주입하는 것이 필요한 이유이전 시간까지 우리는 String 타입이나 Int 같은 간단한 타입의 Bean만 만들었다. 하지만, 실제 애플리케이션을 만들 때는 클래스들이 다른 클
kotlinworld.com
7. [Spring] @Primary와 @Qualifier 사용해 하나의 인터페이스에 둘 이상의 구현체가 있을 때 의존성 주입 우선 순위 관리하기
[Spring] @Primary와 @Qualifier 사용해 하나의 인터페이스에 둘 이상의 구현체가 있을 때 의존성 주입
Bean의 의존성 주입 우선 순위 관리가 필요한 이유다음과 같은 모양의 UserRepository와 두 개의 구현체 InMemoryUserRepository, DbUserRepository 가 있다고 해보자.interface UserRepository { fun createUser(id: String, user:
kotlinworld.com
8. [Spring] @Component와 @ComponentScan 사용해 자동으로 의존성 주입하기
[Spring] @Component와 @ComponentScan 사용해 자동으로 의존성 주입하기
@Bean 어노테이션 사용해 Bean 등록하기이전 글에서 유저 정보를 조작하는 UserRepository 인터페이스를 구현하는 객체가 InMemoryUserRepository와 DbUserRepository 두개가 있고, 이 중 하나를 UserCreator 클래스에
kotlinworld.com
9. [Spring] @Component와 @Bean의 차이는 무엇이고 언제 사용해야 할까?
[Spring] @Component와 @Bean의 차이는 무엇이고 언제 사용해야 할까?
@Component를 사용하지 못하고 @Bean을 사용해야 하는 경우@Component 어노테이션은 클래스 위에 붙는다. 즉, 내가 클래스를 만들 수 있을 때만 사용할 수 있다. 예를 들어 외부 라이브러리의 클래스를 B
kotlinworld.com
10. [Spring] @ComponentScan 사용해 특정 패키지 하위의 의존성을 스캔하는 방법 알아보기
[Spring] @ComponentScan 사용해 특정 패키지 하위의 의존성을 스캔하는 방법 알아보기
@ComponentScan의 기본 동작클래스에 @Configuration 어노테이션과 함께 @ComponentScan 어노테이션이 붙어 있으면, 해당 Configuration 은 해당 패키지 하위의 모든 클래스를 스캔해 @Component 어노테이션이 붙은
kotlinworld.com
11. [Spring] @Lazy 사용해 의존성 주입 시 Bean 지연 초기화 설정하기
[Spring] @Lazy 사용해 의존성 주입 시 Bean 지연 초기화 설정하기
지연 초기화가 필요한 이유@Component 어노테이션이나 @Bean 어노테이션을 통해 IOC Container에 Bean을 등록하면 스프링 애플리케이션 시작 시 등록된다. 예를 들어 다음과 같이 초기화 시 InitTestUseCase I
kotlinworld.com
12. [Spring] @Autowired를 사용해 의존성 주입하기 : 생성자 주입, 필드 주입, 세터 주입
[Spring] @Autowired를 사용해 의존성 주입하기 : 생성자 주입, 필드 주입, 세터 주입
@AutoWired란?스프링은 생성자 주입(Constructor Injection), 세터 주입(Setter Injection), 필드 주입(Field Injection) 이라 불리는 의존성을 주입하기 위한 세가지 방법을 제공한다. 그리고 이들은 @AutoWired란 어노
kotlinworld.com
13. [Spring] @Scope 사용해 Bean을 싱글톤일지 필요할 때마다 새로 만들지 결정하기
[Spring] @Scope 사용해 Bean을 싱글톤일지 필요할 때마다 새로 만들지 결정하기
@Scope 어노테이션이 필요한 이유우리가 Bean을 만들 때 기본적으로 싱글톤으로 만들어진다. 즉, 한 번 생성되면 해당 Bean이 필요한 곳 모두에서 재사용된다. 만약 순수 함수로만 구성된 Bean이거나
kotlinworld.com
14. [Spring] ObjectProvider 사용해 Bean 생성하고 언제 사용돼야 하는지 알아보기
[Spring] ObjectProvider 사용해 Bean 생성하고 언제 사용돼야 하는지 알아보기
ObjectProvider가 필요한 이유앞서 우리는 다음과 같이 ShoppingCart를 프로토 타입 Bean으로 만들고, 이를 싱글톤으로 선언된 CartController에서 사용하고자 했다. @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)@Compon
kotlinworld.com
15. [Spring] @PostContruct 사용해 Bean이 초기화된 이후에 특정 작업 하도록 만들기
[Spring] @PostContruct 사용해 Bean이 초기화된 이후에 특정 작업 하도록 만들기
@PostContruct 란 무엇인가?@PostConstruct는 함수에 붙는 어노테이션으로, 해당 어노테이션이 붙은 함수는 Bean이 만들어질 때 한 번 실행된다. Bean이 초기화된 이후에 데이터를 로딩해야 한다거나, 로깅
kotlinworld.com