TIL

[24.08.09]Spring Framework의 Spring Core Container 나만의 용어 정리

DongHo 2024. 8. 9. 20:41

서문

오늘 Spring을 나갔다. 근데,, 뭐이리 새로운 용어들이 마구잡이로 엄청 쏟아져 나와서 용어 정리를 오후가 되기전에 얼추 하느라 힘들어 죽는줄 알았다. 근데, 용어 정리를 얼추 하고 나서 수업을 들으니 다시 금방 수업을 따라 갈 수 있었다.

그래서 하는 말

아래 적어 놓은 정보는 부정확할 확률이 매우 높습니다.
부정확한 정보 일 수도 있는 정보를 얻고 싶지 않으면 '뒤로가기' 버튼을 누르세요~

 

본문

1. Spring Framework가 왜 나왔을까?

일단 진짜 이유

1. Java 엔터프라이즈 애플리케이션을 쉽게 만들 수 있다.
2. 프레임워크의 기본 원칙에 충실하다.

근데!! 나는 아직 요 내용을 이해하지 못하였다. 그래서 내가 현재 하루밖에 안됐지만 생각하는 Spring Framework의 이유

1. 객체를 생성할 때 변수 옆에 'new 뭐시기'를 안쓸 수 있어서 이다.
2. 여러 파일 및 데이터들을 간편하게 Annotaion이나 XML 파일을 통해 쉽게 관리할 수 있어서 아닐까?

라는 생각이다. 그래서!!

https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/overview.html

첫 날인 오늘 Spring Core에 대해서 입장했다.

Spring Core Container

Core Container는 Core, Beans, Contexts, 그리고 Expression Language 모듈로 구성되어있다.
근데, 나는 여기서 Core, Beans, Contexts까지 나가서 이 부분만 좀 정리해 보려한다.

 

Core and Beans

core와 beans 모듈은 프레임워크의 근본적인 부분을 제공한다.(IoC & DI)
BeanFactory는 프로그래밍할 때 싱글톤의 필요성을 제거하고, 실제 프로그램 로직에서 configuration과 dependencies를 분리하게끔 도와준다.

Context

Context는 Core와 Beans 모듈이 제공하는 Solid한 기반을 제공하는 것이다.
즉, Context 모듈은 Beans 모듈에서 해당 기능을 상속하여 사용한다.
(ex. Servlet 컨테이너)

 

 


근데, 위 내용(공식 문서)들은 너무 딱딱하고 어렵지 아니한가..

그래서 내가 수업듣는데 필요한 용어들을 정리해 보겠다.

 

흐름 공식문서 순서대로 맞춰 보도록 하겠다?

IoC Container

 

IoC = Inversion of Control

IoC라는게 생성된 이유
http://martinfowler.com/articles/injection.html

 

Inversion of Control Containers and the Dependency Injection pattern

Explaining the Dependency Injection pattern, by contrasting it with Service Locator. The choice between them is less important than the principle of separating configuration from use.

martinfowler.com

 

궁금하면 확인해 보세요

 

IoC(제어의 역전)은 일반 프로그래밍에서, 프로그램의 제어 흐름 구조가 뒤바뀌는 것을 의미한다.
-> 객체의 생성관리, 객체 간의 의존성 처리 등을 프레임워크에서 대신 처리(자동)해주는 것이 IoC의 대표적인 예이다.

고걸 Spring Framework에서는 ApplicationContext가 한다.
(참고, ApplicationContext 인터페이스는 Context 모듈을 초점으로 한다.)

 

Bean

Spring IoC Container에서 관리하는 객체

스프링은 Bean을 생성, 초기화, 의존성 주입(DI), 제거하는 일을 IoC Container를 통해 알아서 진행시킨다.

Bean Factory

IoC Container의 가장 기본적인 형태로, Bean의 생성, 초기화, 연결, 제거 등의 라이프사이클을 관리한다.

Configuration Metadata를 사용한다.

Configuration Metadata

Bean Factory가 IoC를 적용하기 위한 설정 정보

POJO

'Plain Old Java Objects'(오래된 방식의 자바 오브젝트)

객체 지향적인 원리에 충실하면서 환경과 기술에 종속되지 않고, 필요에 따라 재활용 될 수있는 방식으로 설계된 오브젝트

 

Application Context

Bean Factory에서 확장된 개념으로 IoC 컨테이너에 Bean을 등록하고 관리하는 기능을 수행
Bean Factory와 같지만, 각종 부가 기능이 더 있다.

 

 


DI(Dependancy Injection)(의존성 주입)

의존성 주입은 객체 간의 의존 관계를 Configuration Metadata(Bean 설정 정보)를 바탕으로 컨테이너가 자동으로 연결 해주는 것
그래서, 객체가의 낮은 결합도를 기대할 수 있으며, 유지보수성유연성이 좋다.
즉, 맨 처음에 말했던 'new'를 안써도 된다고 했던 이유이기도 하다.
외부에서 객체간의 관계(의존성)를 결정해 준다. 그래서 객체를 직접 생성하는 것이 아니라 외부에서 생성 후 주입 시켜주는 방식

 

근데!!

의존성 주입에는 3가지 방법이 있다.

Construct Injection(생성자 주입(안정적, 권장))

하나의 생성자가 존재할 때 필드 주입의 대부분의 단점을 커버한다고 한다.
오직 생성자 주입만이 final 키워드를 사용할 수 있고, 생성자를 통해 주입되는 방식
final 키워드를 사용하여 생성자를 만들기에 인스턴스가 생성될 때 1번만 할당된다.(객체의 불변성(Immutability) 보장!)

Field Injection(필드 주입)

사실 생성자 주입을 뺀 나머지(필드 주입, Setter 주입)은 모두 생성자 이후에 호출되었으므로, 필드에 final 키워드를 사용할 수 없다.

장점

코드 간결

단점

final 키워드를 사용할 수 없다.(불변성 보장 X)

Setter Injection(세터 주입)

사실 생성자 주입을 뺀 나머지(필드 주입, Setter 주입)은 모두 생성자 이후에 호출되었으므로, 필드에 final 키워드를 사용할 수 없다.

 


Bean Scope

Bean은 위에서 한번 말했지만, 이번엔 Bean Scope에 대해 알아보자.

Bean이 생성될 때 생성되는 인스턴스의 범위

1. Singleton

Bean의 Default Scope는 singletone이다.

2. Prototype

Prototype Scope를 갖는 Bean은 매번 새로운 인스턴스를 생성한다.
(즉, 의존성 주입 등의 작업에서 객체 생성에 대한 부담을 줄일 수 있다.)

 


MVC 패턴 구조

전체적인 web 흐름도

일단 현재 전체적인 흐름 파악을 위함이다.

User -> DispatcherServlet -> HandlerMapping -> DispatcherServlet -> Controller -> DispatcherServlet -> View -> User

위와 같은 형태로 진행된다고 일단 이해했다. 이를 더 잘 관리하기 위해 CQRS 패턴이라는게 있다.(아마?)

 

 


추가 정리

DTO(Data Transfer Object)

데이터를 전송하는 역할, 주로 Controller와 Service 계층 사이에서 사용된다.

DAO(Data Access Object)

데이터베이스와 상호작용하는 객체로, 주로 Repository 계층에서 사용하여 데이터베이스 접근 로직을 캡슐화한다.
(ex. maybe Help CRUD?)

VO(Value Object)

Read-Only, setter X, 데이터 불변성 보장이다. 즉, 상수 느낌(ex. final)

 

Spring Annotation

@Controller

컨트롤러 계층을 나타내며, 사용자의 요청을 처리하고 적절한 뷰를 반환

@Service

서비스 계층을 나타내며, 비즈니스 로직을 담당하는 클래스에 사용

@Repository

데이터 액세스 계층을 나타내며, DAO 클래스에서 주로 사용(DB와 상호작용)

@Bean

스프링 컨테이너가 관리하는 객체를 정의할 때 사용, 주로 메소드 수준에서 사용되며, 해당 메소드가 반환하는 객체를 빈으로 사용.

@Component

직접 작성한 클래스를 스프링 Bean으로 만들 때 사용

@Configuration

설정 클래스를 정의하는데 사용,
@Bean 메소드를 통해 스프링 컨테이너가 관리하는 있는 객체들을 구성

@Autowired

DI(Dependency Injection)방식을 사용하여 스프링 컨테이너로부터 필요한 의존성을 자동으로 주입받을 수 있도록하는 것.
주입 대상이 되는 객체를 생성자, 세터 필드에 자동으로 주입해준다.

'TIL' 카테고리의 다른 글

[24.08.15] java, spring Annotation 정리  (0) 2024.08.15
[24.08.12] AOP, Filter, interceptor 차이가 뭐지?  (0) 2024.08.13
[24.08.08] CQRS  (0) 2024.08.11
[24.08.02] 생각 정리  (0) 2024.08.02
[24.07.31] Controller의 존재 발견!  (0) 2024.08.01