@Component
컴포넌트 스캔에 속해있는 특정 클래스에 @Component를 추가하는 경우, 특정 클래스의 인스턴스는 SpringFramework가 관리합니다.
Dependency
Game은 ProgramRunner의 dependency입니다.
Component Scan
Component Scan을 정의하여 Spring이 Component의 위치를 파악할 수 있습니다.
패키지 명을 명시하거나, 명시하지 않을 수 있습니다.
@ComponentScan("com.example")
@ComponentScan
명시하지 않으면 해당 ComponentScan이 정의된 패키지 및 하위 패키지가 Scan됩니다.
Dependency Injection
Spring이 컴포넌트의 의존성이 무엇인지 식별하고 와이어링 하는 프로세스를 Dependency Injection(의존성 주입)이라고 합니다.
(Bean과 의존성을 식별하고 모두 와이어링 하는 작업)
IoC(Inversion of Control, 제어의 역전)를 제공합니다.
IoC
개발자는 (의존성을 통해 객체를 생성하는) 코드를 작성합니다.
(컴포넌트 스캔을 정의하고 몇 개의 @Component를 정의)
그리고 Spring Framework가 이 모든 작업을 수행합니다.
IoC는 제어권이 개발자(코드 작성)에서 Spring Framework로 넘어간 것을 말합니다.
IoC container
제어의 역전 컨테이너는 Bean의 생명주기와 의존성을 관리하는 Spring Framework의 컴포넌트입니다.
ApplicationContext와 BeanFactory는 Spring IoC Container의 구현체입니다.
ApplicationContext(complex) 많은 복잡한 기능을 제공
BeanFactory(simple features - rarely used) 더 간단한 기능을 제공, 잘 안쓰임
Spring Beans
Spring Framework가 관리하는 모든 객체입니다.
Autowiring
Spring Bean에 대한 의존성의 와이어링 프로세스를 말합니다.
Spring이 특정 Bean을 만나면 Bean이 필요한 의존성이 무엇인지 식별하려고 합니다.
필요한 의존성을 찾아서 주입하는 것입니다.
@Component 와 @Bean
Heading@Component@Bean
Where? 어디에서? |
Can be used on any Java class 모든 자바 클래스에서 사용 가능 |
Typically used on methods in Spring Configuration classes 일반적으로 Spring Configuration클래스의 메소드에서 사용 |
Ease of use 용이성 |
Very easy. Just add an annotation 매우 쉬움, 어노테이션만 추가하면 됨 |
You write all the code 관련된 코드를 작성해야함 |
Autowiring | Yes - Field, Setter or Constructor Injection 필드, 수정자, 생성자 |
Yes - method call or method parameters 특정 메소드를 호출, 매개변수를 사용 |
Who creates beans? 무엇이 Bean을 생성? |
Spring Framework 컴포넌트 스캔을 수행하여 존재하는 컴포넌트 클래스를 식별 해당 의존성을 식별하면 Bean이 생성되고 의존성의 Autowiring이 완료되었는지 확인 |
You write bean creation code 직접 Bean 생성 코드를 작성 |
Recommended For 권장 |
Instantiating Beans for Your Own Application Code: @Component 일반적으로 대부분 권장됨 애플리케이션을 생성하는 경우, 내부에서 컴포넌트 클래스에 대한 코드를 작성하고, 컴포넌트 클래스에 대한 Bean을 생성하는 상황. 소스 코드에 들어가서 @Component를 적용하면 Spring이 무척 쉽게 Bean을 생성하고 해당 의존성을 관리하게 됨 |
1: Custom Business Logic 2: Instantiating Beans for 3rd-party libraries :@Bean Bean을 생성하기 전에 여러 사용자 정의 비즈니스 로직을 수행하는 경우, 제3자 라이브러리 Bean을 인스턴스화 하는 경우 |
애플리케이션에 대한 컴포넌트를 작성하고 있고, 해당 Bean을 생성하고 있다면
@Component가 일반적인 상황에서 권장되지만,
Bean을 생성하기 전에 수행해야 하는 비즈니스 로직이 많거나
Spring Securirty와 같은 제3자 라이브러리에 대한 Bean을 인스턴스화하고 있다면
@Bean을 사용하는 것이 권장됩니다.
1. 의존성 주입 Dependency Injection
Spring Framework에서는 Bean을 확인해야 하고,
의존성을 확인해야 하며,
의존성을 Bean에 연결해야 합니다.
이 전체 과정을 의존성 주입이라고 합니다.
(또는 제어의 역전이라고도 합니다, IoC Inversion of Control)
예전에는 객체와 객체를 연결하는 코드를 프로그래머가 작성했지만,
이제는 Spring Framework가 객체를 만들고 작성합니다.
그래서 제어의 역전(IoC Inversion of Control)이라고 부르기도 합니다
2. 의존성 주입의 종류
생성자 주입, 수정자 주입, 필드 주입
생성자 주입 Constr. injection
의존성을 주입하려고 생성자를 호출한다면 생성자 주입이라고 합니다.
수정자 주입 Setter injection
Setter Method를 사용해 Bean에 의존성을 주입한다면 수정자 주입이라고 합니다.
필드 주입 Field injection
Setter나 Constructor가 없을 때 Spring Framework에서는 리플렉션을 사용해 의존성을 주입하는데,
이를 필드 주입이라고 합니다.
3. 제어의 역전 컨테이너 IoC(Inversion of Control) Container
IoC Container는 Spring Bean과 Bean의 수명을 책임지는 Spring IoC Context입니다.
Bean 생성, 전체 수명, 종료를 담당합니다.
4. Spring IoC Container의 유형
빈 팩토리(Bean Factory)와 애플리케이션 컨텍스트(Application Context)
빈 팩토리 Bean Factory
기본 Spring IoC Container입니다.
애플리케이션 컨텍스트 Application Context
엔터프라이즈급 기능이 있는 고급 Spring IoC Container로 가장 자주 사용되고 거의 항상 사용됩니다.
웹 애플리케이션에서 사용하기 쉽습니다.
국제화 기능을 제공하며 Spring AOP와도 잘 통합됩니다.
5. 스프링 빈 Spring Beans
스프링에서 관리하는 객체입니다.
Spring에서 관리하는 모든 객체를 Spring Bean이라고 합니다.
6. 자동 연결 Autowired
Spring Bean이 있는 곳에는 의존성이 있습니다.
Autowired은 Spring이 올바른 의존성을 찾아 Bean에 연결하는 과정을 말합니다.
스프링의 이러한 개념들은
웹 애플리케이션을 만들거나,
REST API를 생성하거나,
인증 및 권한 부여를 구현하거나,
DB와 통신하거나,
다른 시스템과 통합하거나,
단위테스트를 수행하려할 때 필요한 요소입니다.
Spring 구조
Spring Framework, Spring Modules ,Spring Projects
Spring Framework & Modules
SpringFramework에는 Spring Modules가 포함되어 있습니다
Spring Core : Fundamental Features
핵심 기능이 코어모듈에 속하며, IoC Container, Dependency Injection, Autowiring 등이 있습니다.
Spring MVC : Web
웹 기능이 Spring MVC 모듈에 속하며, 웹 애플리케이션이나 REST API를 빌드할 때 사용할 수 있습니다.
Spring WebFlux : Web Reactive
웹 리액티브 애플리케이션을 빌드하려고 할 때 사용할 수 있습니다.
Spring JDBC : Data Access
DB에서 데이터에 액세스할 때 사용할 수 있습니다.
Spring JMS : Integration
다른 애플리케이션과 통합할 때 사용합니다.
Spring Test : Testing
Mock Objects, Spring MVC Test 등이 포함되어 있으며, 단위테스트를 작성할 때 사용합니다.
이처럼 Spring Framework에는 다양한 모듈이 있으며,
빌드하려는 애플리케이션 유형에 적합한 모듈을 활용할 수 있다는 것이
Spring Framework의 유연성을 보여줍니다.
Spring Projects
애플리케이션 아키텍처는 계속해서 발전하고 있으며,
웹 애플리케이션에서 REST API, 마이크로서비스, 클라우드로 발전했습니다.
스프링 또한 Spring Projects를 통해 계속해서 발전하며, 자주 사용되는 프레임워크로 자리잡았습니다.
Spring Framework: First Project
Spring Security
웹 애플리케이션이나 REST API에 보안을 추가할 때,
마이크로서비스에 인증, 권한 부여를 추가하려는 경우에 사용합니다.
Spring Data
동일한 방식으로, 여러 DB와 통합할 때 사용합니다.
이전에는 관계형 DB를 주로 사용했으며 요즘은 NoSQL DB를 자주 사용하는 추세입니다.
Spring Data는 다른 타입(NoSQL 및 관계형 DB)의 DB를 통합할 수 있는 방법 중 하나입니다.
Spring Integrartion
대부분의 애플리케이션은 다른 애플리케이션과 통신하기 때문에,
애플리케이션 통합 관련 문제를 겪을 수 있습니다.
Spring Integration은 다른 애플리케이션과 통합하는 데 유용한 Spring 프로젝트입니다.
Spring Boot
마이크로서비스를 빠르게 빌드하는 데 자주 사용되는 framework
Spring Cloud
Spring 네이티브 애플리케이션을 빌드하는데 사용됩니다.
아키텍처는 지속적으로 발전했고 Spring도 다양한 Project를 통해 계속 발전했습니다.
Spring이 인기있는 이유는,
Losse Coupling, 느슨한 결합
Spring은 Bean 생성, Bean과 의존성 연결을 관리합니다.
느슨하게 결합하여 유지보수가 가능한 애플리케이션을 아주 쉽게 만들 수 있습니다.
따라서, 단위 테스트 작성 역시 수월합니다.
Reduced Boilerplate Code, 감소된 보일러플레이트 코드
Spring을 이용하면 비즈니스 로직에 집중할 수 있습니다.
메서드마다 예외 처리를 작성할 필요가 없습니다.
(확인된 모든 예외는 Runtime 또는 Unckecked 예외로 전환됩니다)
Architectural Flexibility, 아키텍처 유연성
Spring이 여러 개의 모듈로 나뉘었고, 다양한 프로젝트가 있습니다.
전부 사용하지 않고, 애플리케이션에 적합한 것만 선택할 수 있습니다.
Evolution with Time, 시간에 따라 발전
Spring Framework는 첫 번째 프로젝트였지만, 시간이 지나며 아키텍처가 진화하고
애플리케이션에 새로운 요구사항이 생기자 다양한 프로젝트가 도입되며 Spring 생태계도 함께 발전했습니다.
'Java' 카테고리의 다른 글
[SpringBoot] Spring Boot 목적, 프로젝트 생성(spring.io) (0) | 2023.12.21 |
---|---|
[SpringBoot] Spring Boot 등장 배경 (1) | 2023.12.21 |
[SpringFramework] Spring Annotations (1) | 2023.12.20 |
[SpringFramework] PostConstruct & PreDestroy, CDI Jakart Contexts & Dependency Injection (0) | 2023.12.18 |
[SpringFramework] Lazy Initialization vs. Eager Initialization, Bean Scopes (0) | 2023.12.17 |