Springboot with JPA - 데어 프로그래밍 유튜브 (1~3강)

치즈말랑이·2021년 10월 19일
0

스프링부트 with JPA

목록 보기
1/9

예전에 어느 강의에서, 같은 내용이라도 여러 사람에게 배우는게 좋다는 말을 듣고 강의를 여러개 들어보려고 한다.

게다가 인프런에서 들었던 스프링 강의는 gradle에 대한내용은 없고, 전체적인 흐름만 파악하여 세세한 개념을 잡기는 힘들어서 김영한님의 강의를 추가로 들어보려고 하는데, 그건 다음주에 맥북 사면 시작할 예정이다. 지금은 개념을 다른 방식으로 이해하기 위해 데어 프로그래밍 유튜브 강의를 보려고 한다.

1. 스프링이란?

  • 프레임워크이다.
    frame = 틀, work = 동작. 틀안에서 동작하는것
    프로그램을 정해진 틀 안에서 만들어라.

2. 스프링은 오픈소스이다.

  • 소스 코드 공개
    내부 볼 수 있다 -> 내가 뜯어 고칠 수 있다.

3. IoC 컨테이너를 가진다. (Inversion of Control)

  • 스프리의 핵심 내용
    제어의 역전 (주도권이 스프링한테 있다)
    Class -> 설계도
    Object -> 실체화가 가능한 아이
    Instance -> 실체화가 된 것. 게임속에서 눈덩이를 굴리고 다니는 누누

Class -> object라고 부를 수 있다.
누누: ~변수~로 이루어져 있음 -> 실제로 게임 안에서 나오는애니까 실체화가 가능
Abstract class -> object라고 부를 수 없다.
캐릭터: 케이틀린,신지드 등등이 포함됨. -> 추상적인것이라서 실체화가 불가능. "캐릭터"가 게임 안에서 존재하지는 않음

가구는 추상적인 개념이라서 object가 아니다.
의자, 침대같은 것들이 object이고, 이 세상에 실체화가 되어 존재하기 때문에 instance이다.

IoC:
내가 object를 직접 new를 해서 heap이라는 메모리 공간에 올리게 되면 ->
s = new 의자(); 라고 하면 heap 안에 의자의 주소는 reference 주소 s이다.

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

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

이 s는 make() 메소드가 실행될때만 메모리공간에 떠있다. 즉, s는 메소드가 관리한다.
이렇게 되면 use메소드의 s와 make메소드의 s가 다르다.

그래서 스프링은 object들을 읽어서 자기가 직접 heap 메모리 공간에 띄운다.
의자, 붕어빵, 사자, 기린

4. DI를 지원한다. (Dependency Injection)

옛날에는 내가 new를 해서 그 객체의 주소를 내가 관리했다면, 이제는 스프링이 object를 스캔해서 메모리에 띄웠기 때문에 내가 관리하는게 아니라 스프링이 관리하는 것이다. -> IoC
스프링이 관리하는 이 객체를 내가 원하는 모든 곳으로(ex. 메소드) 가져와서 사용할 수 있다. -> 싱글톤으로 관리가 된다.
싱글톤: 하나를 가지고 여기저기서 공유해서 사용한다.
이렇게 필요한곳에서 가져가서 쓰는것을 DI라고 한다.

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

  • 입구에서 검열 역할을 해줌
    권한있는것만 통과.
    필터 ≈ 문지기
    필터에게 임무를 줄 수도 있고 스프링 자체가 가지고 있는 필터를 사용해도 된다. 직접 필터를 생성할 수도 있다.
    왕이 살고 있는 성을 예로 들면, 성문은 톰켓, 왕이 사는 집의 문은 스프링컨테이너 라고 볼 수 있다.
    톰켓이 들고 있는 필터는 필터라고 불린다. 필터의 기능을 하는 파일을 web.xml이라고 한다.
    스프링컨테이너가 들고있는 필터는 인터셉터라고 불린다.(AOP) 누가 들어올때 권한체크한다.

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

  • 컴파일 체킹
    어노테이션 : 주석 + 힌트 <- 컴파일러가 무시하지 않는다.
    // 글 ~ : 주석 <- 컴파일러가 무시함

    Animal 클래스에 Run()메소드
    Dog클래스가 Animal을 상속받을때 run()을 재정의할 수 있다.
    이때 run();위에 @Override를 붙이면 자바가 실행될때 컴파일(Dog)하면 Animal클래스가 run()을 가지고 있겠지 라고 예상하고 가서 확인을 한다. 있으면 정상. 없으면 컴파일 체킹할때 에러가 난다.

    스프링-> 어노테이션을 통해서 주로 객체생성을 한다.
    @Component -> 클래스를 메모리에 로딩
    @Autowired -> 로딩된 객체를 해당 변수에 집어 넣어
    @Bean
    @Controller
    이런 어노테이션을 직접 생성하고 이 어노테이션이 어떤 역할을 하는지 미리 약속을 한다.

 @Component
 class A {
 
 }

굳이 new를 안해도 스프링이 스캔, 읽어서(IoC) heap에 A를 저장한다.

 class B {
 
	A a = new A;
}

이렇게 하면 a는 기존에 있던 A가 아니라 새로운 A를 만드는 것이므로 이렇게 사용 안한다.

class B {

	@Autowired
	A a;
}

나중에 스프링이 B 클래스를 스캔할 때 어떤애가 있는지 분석하는 기법을 리플렉션 이라고 한다.
리플렉션을 통해 특정 클래스 안에 있는 메소드, 필드, 어노테이션을 체크할 수 있다.
있는지 체크 하고, 있으면 무엇을 하라고 설정할 수도 있다.
Autowired의 경우 스프링이 ioc를 통해 직접 집어넣은 객체중에 쭉 읽어들여서 A와 동일한 타입의 객체가 떠있는지 확인한다.
만약에 A가 없다면, A a;에는 null이 들어가고 타입을 통해서 찾는데, A가있으면 a안으로 들어간다. -> DI

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

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

한국어만 할 수 있는사람과 영어만 할 수 있는 사람은 서로 의사소통이 불가능하기 때문에
중간언어 (중간데이터)를 만든다. 예전에는 xml을 많이 썼지만 요즘에는 json을 많이쓴다.

자바 object와 파이썬 object의 경우, 파이썬의 object를 자바가 이해할 수는 없다. 그래서 파이썬이 json으로 변환해서 자바에게 넘겨주면 이것은 자바한테 가서 자바의 object로 변하는것은 쉽다.
자바 object -> json -> 파이썬 object

class Animal {
	int num = 10;
    String name = "사자"!

이것을 json으로 바꾸면 {"num" : 10, "name" : "사자"} 처럼 생긴다. Jason object
Message Converter : 자바 object를 누구에게 전송할 때 중간데이터의 json으로 컨버팅 해주는것
요청할때만 일을하는게아니고 상대방한테 응답받을때도 Message converter가 json을 자바 object로 바꿔준다.
자바 프로그램 ->MessageConverter:Jackson(Json 데이터로 변환해주는 library)->Json(request)-> pythonn 프로그램
자바 프로그램 <-MessageConverter:Jackson(Json 데이터로 변환해주는 library)<-Json(request)<- pythonn 프로그램

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

통신할때 전기선(전류)을 사용한다.
통신은 bit 단위 0, 1, 0, 1, 0, 1
영어 한문자로 표현하고 싶은데 보니까 8bit가 필요함 -> 8bit씩 끊어, 그럼 한문자씩 받을 수 있을거야! 해서 나온게 1byte=8bit
-> 2^8 = 256가지의 문자전송 가능
한글은 16bit가 필요함
1byte는 통신의 최소단위
1byte = 하나의 문자
유니코드 UTF-8 : 3byte 통신
---------------------------------------->
통신할때 쓰는 이 선을 Byte Stream이라고 한다. -> 1Byte를 보낸다는거고, 이건 8비트. 이걸 자바에서는 Inputstream으로 읽는다. 읽는 단위가 byte라서 그대로받으면 골치아프기 때문에 문자(Char)로 casting을 해서 처리를 해야 하는데 복잡하니까 InputStreamReader 클래스로 역으로 갑싼다.
InputSteamReader : 바이트를 문자로 바꿔 문자 하나를 준다. 배열로 여러개의 문자를 받을 수도 있음
배열의 단점: 크기가 정해져 있어야 함 -> 배열의 크기를 크기 정해놨다가 작은 데이터를 받게 되면 낭비를 하게 된다.

그래서 InputStreamReader 안쓰고 BufferedReeader로 감싼다.
가변 길이의 문자를 받을 수 있다.

요청(데이터 담아서) 보냈을때 jsp에서는 이걸 request.getReader 함수를 쓰면 BufferedReader 일을 해준다.
반대로 보낼때는 BufferedWriter를 쓰는데, 내려쓰기 기능이 없어서 이거보다는 PrintWriter함수를 쓴다.
PrintWriter는 print(),println()을 제공한다. jsp에서는 out이라는 내장객체가 있는데 이게 bufferedwriter이다.

통신에서 bytestream을 통해서 데이터를 전송할때 전송 단위가 문자열로 가변길이의 데이터를 쓰게 해주는 클래스가 bufferedwriter이다.

@ResponseBody -> BufferedWriter 동작
@RequestBody -> BufferedReader 동작

profile
공부일기

0개의 댓글