▶스프링은 IoC컨테이너를 가진다.
IoC(Inversion of Controll) = 제어의 역전
IoC컨테이너는 애플리케이션의 제어 흐름이 개발자가 아닌 외부의 컨테이너에 의해 결정되는 디자인 패턴이다.
스프링 프레임워크는 IoC를 실현하는 컨테이너를 제공한다.
IoC컨테이너는 객체의 생명주기를 관리하고, 객체간의 의존성을 주입해주는 역할을 한다.
일반적으로 스프링에서 사용되는 IoC컨테이너는 BeanFactory 및 ApplicationContext 인터페이스를 구현한 클래스들이다.
BeanFactory
스프링에서 제공하는 가장 기본적인 IoC컨테이너.
빈(bean) 객체의 생성, DI, 빈의 생명주기 등을 담당한다.
게으른 초기화를 지원하여 필요한 시점에 빈을 생성한다.
ApplicationContext
BeanFactory의 확장 버전.
BeanFactory의 모든 기능을 포함하면서 추가적인 기능을 제공.
클래스패스, 파일시스템, JNDI 등 다양한 리소스에서 빈을 로드할 수 있음.
메시지소스, 이벤트발행, AOP드의 기능도 지원함.
싱글톤 빈을 미리 생성하여 빈의 의존성 주입 및 생명 주기를 더 효과적으로 관리함.
IoC컨테이너의 핵심 기능
객체 생성 및 소멸 관리 : 빈 객체의 생성, 초기화 ,소멸과 같은 생명주기를 관리
의존성주입 : 빈 객체간의 의존성을 자동으로 주입해줌. 객체가 필요로하는 의존성을 직접 생성하는것이 아니라 외부에서 주입받아서 사용할 수 있도록 함.
설정 정보 제공 : XML, Annotation, JavaConfig 등 다양한 방식으로 설정 정보를 제공받아 빈을 관리함.
싱글톤관리 : 스프링IoC 컨테이너는 기본적으로 싱글톤스코프를 지원하며, 빈은 싱글톤으로 관리하고 재사용한다.
▶ 스프링은 DI를 지원한다.
DI = Dependency Injection
의존성 주입
스프링이 관리하는 객체를 내가 원하는 모든곳에 가져와서 사용할 수 있다.
이렇게 필요한 곳에 의존성을 주입해 주는 것을 DI라고 한다.
▶ 스프링은 엄청나게 많은 필터를 가지고있다.
필터 = 문지기
스프링 자체 필터도 사용가능하고 직접 필터를 생성해서도 사용 가능하다.
위 그림에서 성 = Tomcat이고 왕의 성 = 스프링 컨테이너라고 생각하면 된다.
Tomcat이 들고있는 필터 = 필터
스프링컨테이너가 들고있는 필터 = 인터셉터
라고 불린다.
권한이 있으면 들어오게해주고, 없으면 못들어오게한다.
▶ 스프링은 엄청나게 많은 어노테이션을 가지고있다.
Annotation = 주석이긴한데 컴파일러가 무언가를 체킹할 수 있게 힌트를 주는 주석이다.
스프링은 어노테이션을 통해서 객체생성을 한다.
@Component→ 이 붙어있는 클래스는 메모리에 로딩해라
@Autowired → 이 붙어있으면 로딩된 객체를 해당 변수에 집어넣어라(DI)
이렇게 약속이 되어있으면
이렇게 Annotation을 통해 객체를 생성했으면
다른 곳에서 A를 쓰고 싶을 때 new를 안써주고 사용 가능하다.
@Autowired 어노테이션으로 스프링 빈으로 등록된 A를 주입받는다.
이것을 DI 의존성주입이라고 한다.
a에 A가 들어감.
@Autowired 어노테이션이 사용되면 스프링은 해당 타입의 빈(bean)을 찾아서 주입해준다.
이때 주입되는 빈은 스프링 컨테이너에서 관리되는 객체이다.
Heap 영역에서 직접 찾는 것이 아니라 스프링 컨테이너가 빈을 생성하고 관리하며, 이를 주입하는 것임.
▶ 스프링은 MessageConverter를 가지고 있다. 기본값을 현재 Json이다.
중간언어는 모든 나라의 사람들이 이해하기 쉬운 언어이다.
프로그램에서는 중간언어가 Json이고 Json은 자바에서도, 파이썬에서도 요청,응답이 가능하다.
이렇게 중간데이터인 Json으로 Converting해주는 것을 MessageConverter라고 한다.
MessageConverter는 스프링에 라이브러리로 존재한다.
▶ 스프링은 BufferedReader와 BufferedWriter를 쉽게 사용할 수 있다.
데이터 통신을 할 때 전기선(전류)를 통해 하게 되는데, 초창기에는 bit 단위로 통신을 하였다.
이 때 영어권 사람들이 "비트 대신 문자(영어)로 통신할 수 없을까?"라는 고민을 하였고, 그 결과 영어 한 문자로 통신하려면 8bit가 필요하다는 것을 알게 되었다
즉, 8bit = 2의8승 = 256 이기 때문에 영어의 알파벳은 256개보다 적기 때문에 8bit으로 통신이 가능하다
8bit씩 끊어 읽으면 한 문자씩 읽을수 있기 때문에 8bit를 논리적인 단위로 1Byte라고 부른다
이후 1Byte는 통신의 최소단위로 쓰이게 되었다하지만, 나라별로 언어가 다르고 이를 모두 각각의 언어로 통신하게 되면 어렵기 때문에, 전세계 통신이 가능하도록 하기 위해 "유니코드(UTF-8)"을 사용하여 통신한다 -> 3Byte 통신
Byte Stream : Byte(1Byte = 8Bit) 단위로 통신을 하는 것
Byte Stream을 통해 전송된 데이터를 Java에서는 InputStream을 통해 읽는데, Byte 통신을 하기 때문에 InputStream이 읽은 데이터 하나의 단위가 Byte이다
이 때 Byte는 문자가 아닌 논리적인 단위에 불과하기 때문에 이를 문자로 변경해야 한다
Java에서는 이를 보다 쉽게 하도록 InputStreamReader라는 클래스를 제공해준다
InputStreamReader를 사용하여 고정길이만큼 문자를 받게 되는데, 이 때 배열로 여러 개의 문자를 받는다
하지만 배열은 크기가 정해져 있어 데이터가 잘리거나 배열의 크기가 남아서 메모리 낭비가 발생할 수 있다!
그 단점을 보완하기 위해서 BufferedReader이 탄생하게 되었다.
BufferedReader로 데이터를 받게되면 가변길이의 문자를 받을 수 있다.
response 응답은 BufferedWriter를 통해 보낸다.
이 때 자바에서는 BufferedReader는 request.getReader()를 사용하고, BufferedWriter는 out 내장 객체를 사용하거나 PrintWriter인 print(), println()을 사용한다
스프링에서는 이걸 따로 쓸 필요없이 Annotation을 제공해준다.
데이터를 쓸 때
@ResponseBody를 써주면
BufferedWriter가 작동하고, 데이터를 전송할 수 있다.
데이터를 받을 때
@RequsetsBody를 써주면
BufferedReader가 작동하고, 전송하는 데이터를 받을 수 있다.
'BackEnd > Spring Boot🍃' 카테고리의 다른 글
[Spring]Spring MVC 요청에서 응답까지의 흐름, @Controller와 @RequestMapping 원리 (0) | 2024.03.24 |
---|---|
[Spring] Servlet과 Spring Web MVC(2) (0) | 2024.03.23 |
[Spring] Servlet과 Spring Web MVC(1) (0) | 2024.03.23 |
[Spring Boot] 코드프레소님 Spring Boot 강의 정리(유데미){2} (1) | 2024.02.24 |
[Spring Boot] 코드프레소님 Spring Boot 강의 정리(유데미){1} (0) | 2024.02.24 |