본문 바로가기

백/spring boot

스프링부트 1. 기본개념정리

스프링부트 1.기본개념정리

 

스프링부트 강좌 개념 정리

  • 스프링은 프레임워크이다.
    • 프레임워크이므로 우리가 아무리 내용을 바꿔도 스프링이 만든 틀안에 속하게된다.
    • 틀 안에서 개발을 하면 아무리 이상하게 해도 최소한 틀 밖에 튀어나가지는 않는다!
  • 스프링은 오픈소스이다.
    • 오픈소스이기에 스프링의 내부 구조를 사용자가 볼 수 있으며, 불편한 부분을 내가 고칠수도 있다.
  • 스프링은 IoC 컨테이너를 가진다.
  • 스프링은 DI 를 지원한다.
  • 스프링은 엄청나게 많은 필터를 가지고 있다.
  • 스프링은 엄청나게 많은 어노테이션을 가지고 있다. (리플렉션, 컴파일체킹)
  • 스프링은 MessageConverter를 가지고 있다. 기본값은 현재 Json이다.
  • 스프링은 BufferedReader와 BufferedWriter를 쉽게 사용할 수 있다.
  • 스프링은 계속 발전중이다.

1. 스프링의 핵심?

  1. Inversion of Controll 제어의 역전 : 주도권을 스프링이 갖는 것!

'스프링이 주도권을 가지고 있다'라는 건

객체의 주소를 Spring이 관리한다는 뜻

 

이제부터 예시를

class ⇒ 설계도

object ⇒ 실체화가 가능한 것

instance ⇒ 실체화가 된것

 

의자 클래스> 오브젝트

가구 클래스> 추상적인 의미, 즉 오브젝트가 아니다.

 

스프링이 없으면?

내가 필요한 곳마다

의자 s = new 의자();

해서 힙 영역에 객체를 만들어서 썼지만

스프링의 ioc 컨테이너는?

오브젝트들을 스프링이 전부 스캔해서 객체로 만든다

⇒ 내가 이 인스턴스들을 관리하는 것이 아닌, 스프링이 이 인스턴스를 관리한다.

⇒ 스프링이 직접 메모리에 객체들을 띄웠으므로 객체의 주소도 스프링이 관리하게됨.

⇒ 이게 바로 제어의 역전

⇒ ioc 컨테이너

 

 

  1. Dependency Injection, 의존성주입

원래 내가 의자라는 객체를 관리했지만, 스프링의 ioc는 객체를 대신 관리해준다.

⇒이 스프링이 관리하는 객체를 내가 원하는 모든 곳, (모든 클래스의 메소드)에서

같은 객체로 (싱글톤) 쓸 수 있게됨

이 필요한 객체를 내가 가져가서 쓰는것

⇒di

이 두가지가 바로 스프링의 핵심이다.

2. 필터란?

특별한 권한을 가진 사람들만 왕의 집에 들어갈 수 있게 하는것

⇒ 필터(문지기)!

 

유저는

  1. 스프링 자체의 필터를 사용할수도 있고,
  2. 스프링 자체의 사용되지 않고 있는 필터를 사용하겠다고 설정할 수도 있고
  3. 유저가 직접 필터를 생성해서 사용할 수도 있다.

톰캣에도 필터(web.xml)가 있고, 스프링 컨테이너에도 필터가 있다

스프링 컨테이너의 필터는 인터셉터라고 불린다.(톰캣은 그냥 이름이 필터임)

필터는 문지기이므로 권한이 있는 애는 들어오게 해주고, 아니면 못들어오게한다.

 

 

스프링의 컴파일 체킹이란?

어노테이션에 대한 이해가 있어야한다.

자바의 주석 ⇒ 컴파일러가 무시

어노테이션 ⇒ 컴파일러가 뭔가를 체킹할 수 있도록 힌트를 준다⇒ 무시 x

 

스프링은 어노테이션을 통해서 주로 객체를 생성함.

ex ) @Component: 이 클래스를 메모리에 로딩해라.

, @Autowired: 로딩된 객체를 해당 변수에 집어넣어라,

⇒ 이게 아까 ioc와 연결

되는거임.

개발자가 직접 객체를 생성하지 않고 스프링과의 약속인 저 어노테이션을 붙여서

스프링이 객체를 생성하게함 (어노테이션 기법)

 

메모리에 올라간 싱글톤인 A 말고, A타입의 새로운 객체를 힙 영역에 만들고 싶다면?

스프링이 없었다면 그 클래스에서 A a = new a();로 만들겠지만, 스프링은 어노테이션이 있음.

  1. 클래스에 A a; 라고만 쓴 후 Autowired를 걸어줌
  2. 스프링이 해당 클래스를 분석(리플렉션) 할때 어떤 메서드, 필드, 어노테이션이 무엇이 들어있는지 체킹.(이 과정은 런타임시 일어남)
  3. 리플렉션 중 이 클래스에 @Autowired가 있다면?
  4. 스프링이 heap 영역, 즉 메모리에 올렸던 객체를 스캔 후 A라는 타입이 있으면 새로운 객체를 만들어준다.

이게 바로 DI.

3.MessageConverter 란?

한국어 ⇒ 외계인어 를 통역하기는 어렵지만

한국어 ⇒ 영어 ⇒ 외계인어를 통역하기는 쉽다

 

즉 서로 바로바로 통역을 하는 것이 아니라

둘 다 이해 할 수 있는 중간 언어를 만든다.

 

이 중간언어가 스프링에서는 xml임.

요즘은 거의 다 json으로 대체됨

 

자바 object - 파이썬 object

이렇게 가는건 매우 어렵다

그러나 json을 거치면 서로 교환하는게 어렵지 않음

이 object를 json으로 바꿔주는 것이 MessageConverter(스프링 라이브러리에 존재)임.

이건 내가 요청할때만 일어나는게 아니라 응답할때도 똑같이 일어남.


 

한글은 16비트가 필요하므로. 2바이트 필요

중국은 3바이트

⇒ 이걸 전세계에서 다 따로 인코딩할 수 없으므로 나온 것이 UTF-8

 

이 바이트스트림이 오면 자바에서 읽어들이는 것이

바로?

inputStream이다.

 

근데 바이트를 문자로 읽기가 힘드니끼

그걸 다시 문자(char)로 바꾸는 것이 바로?

inputStreamReader. 문자를 배열로 받아온다.

 

근데 배열은 크기가 정해져 잇어야되므로 최대크기를 설정해 놓아야하는데,, 그럼 그보다 작은 크기가 들어오면 계속 공간이 낭비된다.

그래서 나온 것이? BufferdReader ⇒가변길이의 문자를 받을 수 있다.

  • 스프링은 BufferedReader와 BufferedWriter를 쉽게 사용할 수 있다.

데이터를 담아서 요청을 주면, 받는 쪽에서는 BufferedReader로 데이터를 읽어들임

jsp에서는 request.getReader();가 BufferedReader의 역할 함.

마찬가지로 내보낼때도

BufferedWriter를 통해서 내보내는데, 이게 내려쓰기가 안되서 PrintWriter의 print(), println()을 많이 사용.

jsp에서는 내장객체 out의 메소드 사용.

 

즉, 정리하자면 ByteStream을 통해서 통신할때 전송단위를 가변길이의 문자열을 쓸 수 있게 해주는 것이 BufferedReader와 BufferedWriter이다.

 

근데 스프링에서는 이걸 우리가 다 적을 필요 없다.

@RequestBody ⇒ BufferedReader

@ResponseBody ⇒ BufferedWriter

로 손쉽게 사용 가능하다.

자료 출처 : 스프링부트 강좌 with JPA -메타코딩