Springboot 개념정리 - 스프링의 핵심, 필터, MessageConverter

Yuri Lee·2020년 8월 18일
0

Springboot 개념정리

목록 보기
1/10
post-thumbnail

스프링부트 강좌 with JPA 1강 - 스프링의 핵심은 무엇인가요?

1. framework 이다.

틀 / 동작하다. 틀 안에서 동작하는 것이다. 어떤 틀이 하나 있으면 그 틀을 벗어날 수 없다.

2. 오픈 소스 (무료) 이다.

소스 코드가 공개, 내부를 뜯어 고칠 수도 있다는 의미이다.

3. IOC 컨테이너를 가진다.

스프링의 핵심, (inversion of controll) 역전의 제어, 주도권을 빼았다는 것이다. 주도권은 스프링! class: 설계도 object:실체화가 가능한 것, instance:
class에는 추상 클래스도 존재한다. abstact clas, 롤에서...

누누 클래스 {
    변수
    변수
}

누누를 만들기 위한 클래스니까 설계도이다. 누누는 실제 게임할 때 나오는 거니까(실체화가 가능) 오브젝트이다. 롤에서 캐릭터가 있는데 많은 것들을 포함하고 있다. 굉장히 추상적인 의미이다. 누누가 올 수도 있고, 다른 놈들이 올 수도 있다. 추상적이기 때문에 실체화가 불가능하다. 인스턴스는 실체화 된 것을 말한다. 누누가 전장의 협곡에서 돌아다니면서 눈을 굴리고 있으면 실체화가 된 것이다.

가구는 추상적이다. 실체화가 가능한 것은 의자, 침대이다. 이런 것들은 오브젝트로 존재하다가 이 세상에 튀어나오는 순간 실체화가 되었기 때문에 인스턴스라고 부른다.

내가 오브젝트를 직접 new를 해서 heap이라는 메모리 공간에 올리게 되면..

s = new 의자 (); 
public void make() {
 의자 s = new 의자();
}

public void use() {
 의자 s = new 의자();
}

공유하는 게 힘들다. 이 의자를 여기서 쓰고 싶었는데..넘겨받기가 힘들다. 이런 로직을 짜는게 힘들다. 그래서 스프링이 수많은 오브젝트들을, 의자, 붕어빵, 사자, 기린이라는 오브젝트를 클래스로 다 만들어 났는데, 이것을 스프링이 쫙 스캔해 읽어서 자기가 이 객체들을 직접 띄운다. heap 메모리 공간안에 의자, 붕어빵, 사자, 기린이 뜬다. IoC, 스프링이 얘들을 읽어서 메모리에 올려준다.


4. 스프링은 DI(Dependency Injection, 의존성 주입)를 지원한다.

예전에는 내가 new를 해서 주소를 관리했다면, 이제 스프링이 스캔을 해서 오브젝트를 메모리에 띄었기 이제 이건 내가 (개발자가)관리하는게 아니라 스프링이 관리하는 것이다. 이것을 ioc라고 한다. 그리고 스프링이 관리하는 이 객체를 내가 원하는 모든 클래스 메소드에서 다른 것들을 가져와서 사용할 수 있다. 다른 곳에서도 그대로 사용할 수 있다. 스캔을 하면 딱 한번만 공유해서 사용할 수 있다. 필요한 곳에서 가져가서 쓰는 것을 DI라고 한다. ioc와 di를 하면 프로그램을 짜는 게 굉장히 편해진다.

5. 스프링은 엄청나게 많은 필터를 가지고 있다.

필터: 문지기라고 생각하면 된다. 필터는 임무를 직접 줄 수도 있고, 필터 들 중에 사용하지 않는 필터들을 사용할 수도 있다.

A 나라 성: 톰켓
왕의 집: 스프링 컨테이너
톰켓이 들어있는 첫번째 관문의 필터를 web.xml이라고 한다. 스프링 컨테이너가 들고 있는 컨테이너는 인터셉터라고 부른다. AOP라는 개념이 있다. 추후 설명..(굉장히 중요한 개념) 인터셉터도 필터와 비슷한 역할을 한다. 권한을 체크해준다.

6. 스프링은 엄청나게 많은 어노테이션을 가지고 있다. (리플렉션, 컴파일체킹)

어노테이션은 주석인데..
//글~ (주석)
주석은 컴파일러가 무시하는 것이다. 어노테이션 주석은 컴파일러가 무언가를 체크할 수 있게 체크를 할 수 있게 한다. 컴파일러가 무시하지 않는다.
Animal이라는 클래스에 run이라는 메소드가 있다.

Animal {
run()
}

Dog 이라는 클래스가 Animal를 상속한다. 그럼 run이라는 메소드를 재정의 할 수 있다. 그럼 @override라고 붙인다. 그럼 해당 파일을 dog라는 파일을 컴파일 할때, 어? 여기 어노테이션이 붙어있네? 그럼 animal라는 부모가 run 이라는 메소드를 가지고 있겠지라고 예상하고 확인을 한다. 있으니까 정상! 만약 fly()라는 메소드가 가지고 있으면, animal 안에 fly 가 없으니까 컴파일 체킹시에 에러가 난다.

스프링 -> 어노테이션을 통해 주로 객체 생성을 한다.
어노테이션이 어떤 역할을 하는지 미리 약속을 한다.

@component : 클래스 메모리에 로딩
@Autowired : 로딩된 객체를 해당 변수에 집어 넣어
@Controller

어떤 클래스가 있을 때

@Component
class A {

}

ioc는 스캔해 읽어 자기가 들고 있는 힙메모리 공간에 A라는 클래스를 로딩한다. 그 다음에 메모리에 뜬 A클래스를 어딘가에서 사용하고 싶을 것이다.

class B{
@Autowired
A a -> 선언만 해놓고 위에 어노테이션을 붙인다. @@Autowired
A a = new A(); -> 예전에 java에서 할 때는 이렇게 했을 것이다. 이 a는 새로운 공간에 a라는 객체를 만드는 것이다.
}

나중에 스프링이 B클래스를 스캔할 때, 읽어들일 때 B클래스 내부에 어떤 애들이 있는지 분석하는 것을 리플렉션이라고 한다. 리플렉션을 통해 어떤 메서드, 필드, 어노테이션이 있는지 체킹할 수 있다. 있는지 체킹하고 나서 무엇인가를 하라고 설정할 수도 있다.

<정리>
어노테이션(주석+힌트)
리플렉션(분석하는 기법->런타임시 분석)

7. 스프링은 MessageConverter를 가지고 있다. 기본값은 현재 Json이다.

영어권

한국권

안녕, Hello를 이해하기 힘들다. 이 모순을 어떻게 처리할까? 영어권에서 번역해서 한국어를 보낼 수도 있고...

이를 위해 중간 데이터라는 개념이 존재한다.

한국 -> 영어
영어 -> 한국어

다이렉트로 번역하기 힘들기 때문에 중간언어를 사용한다. 중간언어 xml을 많이 사용했는데 json을 많이 이용한다. 자바 object와 파이썬 object 각자의 오브젝트를 전달하면 어려울 것이다.

java object가 전송되기 전에 json으로 바뀌고 json이 다시 python 오브젝트로 바뀐다.
java object -> json -> python object

java에서
class Animal {
int num = 0;
string name = "사자"
}

라면 json은 {"num: 10, "name": "사자} 가 된다.

MessageConverter가 그 역할을 해준다. 내가 직접 converting할 필요가 없다.

자바 프로그램 ----- request(요청)-----> 파이썬 프로그램
json
MessageConverter: json
스프링에 라이브러리로 존재

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

통신

전기선(전류)
bit단위로 통신이 된다. 0,1,0,1,1,1,0,0, ... 영어권 나라에서 시작
영어 한문자 8bit가 필요하다. 8bit만 있으면 256가지의 문자 전송이 가능하다.
한글은 최소 16bit가 필요하다. (가,갸,거,겨,,등)

8bit씩 끊어 읽어! 8bit = 1byte: 통신의 단위가 된다. 1바이트는 결국 하나의 문자. 만약 한국에서 먼저 발전했으면 분명 1bytpe는 16bit가 되어있었을 것이다.

중국 10만개! 3Byte
미국, 한국, 중국 다 다를 것이다. 필요한 바이트수가..
유니코드: utf-8, 3byte 통신으로 한다. 보통

Byte Stream: 1byte=8bit

---------------------------------------> inputstream, 바이트

데이터를 보낼 때 이렇게 전송하면 프로그램, 자바 프로그램에서 inputstream으로 읽는다. 데이터를 인풋스트림으로 읽으면, 스트림이 바이트 전송을 하고 있으니 읽는 단위가 바이트가 된다. 그럼 처리할 때 머리가 아프다. 바이트는 문자가 아니니까 바이트 그대로 받아 버리니까..그래서 이것을 문자로 번형하기 위해 char 같은 것이 있는데..복잡하니까 InputStreamReader 클래스가 있다. 바이트를 문자로 바꾼다. 배열: 여러개의 문자

배열의 단점: 크기가 정해져있어야 한다. 6Byte(2문자) 로 잡아놓으면 뒤의 단어들이 없어진다.
안녕, 반가워 ~~~ (10문자면) 안녕만 인식, 그렇다고 3byte * 20 를 사용하면, 전송 데이터 크기가 작을 경우 나머지 공간들이 낭비가 된다. 그래서 이것도 안쓴다.
BufferedReader라는 것으로 받는다!!!!. 가변길이의 문자를 받을 수 있다.

상대방이 데이터를 요청할 때, 받는 쪽에서는 이 데이터를 BufferedReader로 받는다. request.getReader를 사용하면 된다. 마찬가지로 내가 데이터를 쓸 때도 BufferedWirtter를 사용해야 한다. 근데 내려쓰기 기능이 없어서, 보통 자바에서는 PrintWritter를 사용한다. 흔히 많이 쓴다. 둘이 같은 것이다.

이런 것들을 직접 구현할 필요 없이 @ResponseBody를 사용하면 Buffered writer이 작동한다.
데이터를 받을 때는 @RequestBody를 사용하면 Buffered Reader이 작동한다.

9. 스프링은 계속 발전중이다.

스프링 부트가 나오면서 스프링을 사용하는 게 굉장히 쉬워졌다.

이 글은 유투버 겟인데어의 스프링 부트 강좌를 바탕으로 정리한 내용입니다.

profile
Step by step goes a long way ✨

0개의 댓글