본문 바로가기
👨‍💻 개발/spring boot

[개념 및 기초] #1. 스프링이란?

by 말랑한곰탱이 2021. 10. 13.

백엔드 스택 중 스프링을 공부하고 싶어 강의를 찾던 중 유튜브에서 괜찮은 무료 강의를 발견해서 들었다. 

데어 프로그래밍 님의 강의로 기본 개념 정리를 여러 사례를 들어 쉽게 설명해주시는 게 좋았고 이해도 잘 됐다.

https://www.youtube.com/watch?v=XBG6CUtVCIg&list=PL93mKxaRDidG_OIfRQ4nztPQ13y74lCYg&index=3 

 

강의 내용을 바탕으로 내가 보기 위해 정리하는 글이다.

 

1. 스프링은 프레임워크다.

 프레임워크 : 틀 안에서 동작한다! 틀에서 벗어나지 마라! 너 맘대로 만들지 말고 환경을 갖춰줄 테니 틀에 맞춰 개발해라! 그렇게 하면 너도 좋은 프로그램 만들 수 있을 거야!

 

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

오픈소스란 소스코드가 공개되어 있는 것이다. 스프링이 어떻게 만들어졌는지 코드를 볼 수 있다. 그 말은 즉, 내부를 뜯어고칠 수도 있다는 것! 공부를 너무 많이 해서 스프링의 깊숙한 것까지 알게 되어 불편한 게 생겼을 때, 직접 고친 후 contribute도 가능하다!

 

3. 스프링은 IoC 컨테이너를 가진다.

IoC(Inversion of Control) : 제어의 역전. 주도권이 스프링에게 있다!

 

내가 오브젝트를 직접 new를 해서 heap이라는 공간에 올리게 되면, 오브젝트를 내(메서드 내부)가 관리한다. 그러나 이걸 다른 메서드에서 사용할 때 다시 new를 통해 불러오면 복잡한 로직이 발생하게 된다. 그래서 Spring은 내가 만든 class들을 스캔해서 객체들을 직접 heap 메모리에서 관리해주어 사용하기 편리하게 해 준다. 이것을 제어의 역전이라고 한다.

 

4. 스프링은 DI를 지원한다.

DI(Dependency Injection) : 의존성 주입. 스프링이 스캔한 나의 객체들을 다른 곳에서 사용하는 것. 

IoC와 DI에 의해 프로그래밍이 편해진다.

 

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

필터 : 검열해주는 것.

스프링 자체 필터 사용 or 스프링의 많은 필터 중 사용되지 않았던 필터를 사용 or  필터 직접 생성하여 사용할 수 있다.

 

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

// (주석) - 컴파일러가 무시함.

어노테이션(주석 + 힌트) : 컴파일러가 무시하지 않음.

Animal이란 객체에 run()이라는 메서드가 있다고 가정.

Dog가 Animal을 상속하고 run()을 재정의 하고 싶을 때, 윗 줄에 @override (어노테이션)을 사용하면 컴파일 체킹 할 때 좋음.

 

또한 스프링은 어노테이션 객체를 생성하여 사용함.

@Component -> 클래스를 메모리에 로딩

@Autowired -> 로딩된 객체를 해당 변수에 집어넣어

 

@Component

Class A {

 

}

 

-> 스프링이 class를 스캔해서 heap 메모리에 로딩함. 어노테이션으로 약속했기 때문에!

 

클래스 A를 클래스 B에서 사용하고 싶은 상황

어노테이션을 사용하면 편하게 불러올 수 있다.

 

Class B {

  @Autowired

  A a;

}

이때 B 클래스 내부에 어떤 애(메서드, 필드, 어노테이션)가 있는지 분석하고 동작시키는 걸 리플렉션이라고 한다. 리플렉션은 런타임 시 발생한다.

 

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

자바 오브젝트와 파이썬 오브젝트가 서로 통신(request or response)하거나 주고받을 때 언어가 다르므로 힘들다. 그래서 그 중간에 Json오브젝트로 바꾸어 서로 주고받는다. 둘 다 중간 언어로 이해하기 쉬움.

자바 프로그램 -> JSON (request) -> 파이썬 프로그램

자바 프로그램 <- JSON (request) <- 파이썬 프로그램

 

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

통신(영어권) 

한문자 -> 8bit = 2^8 = 256. 256가지의 문자 전송 가능!

8bit(1byte)씩 끊어 읽으면 영어권에서는 한 문자씩 받을 수 있다.

한국은 2byte, 중국은 3byte. 나라마다 다르다.

 

전 세계에서 인터넷으로 커뮤니케이션하는 시대에, 자기 나라 만의 방식으로 글을 인코딩하게 되면 전 세계적인 데이터 통신은 불가능! 따라서 유니코드에서 utf-8이라는 캐릭터 인코딩을 제공함. 3byte 통신.

 

자바에서 데이터를 통신할 때 Byte Stream을 통해서 InputStreamReader(바이트를 문자로 바꿔서 전달)로 여러 개의 문자를 배열 형태로 받아왔는데, 배열은 길이가 정해져 있으므로 많이 설정하면 낭비가 되고, 적게 설정하면 문자가 버려지는 문제 발생.

따라서 BufferedReader사용. 가변 길이의 문자를 받을 수 있다.

JSP에선 데이터를 받을 때 request.getReader() 함수를 사용하면 BufferedReader 일을 해줌.

데이터를 쓸 때는 PrintWriter 함수를 사용하면 BufferedWriter 일을 해줌. 문자열로 가변 길이의 데이터를 쓸 수 있다.

 

어노테이션으로 사용 가능.

@ResponseBody -> BufferedWriter

@RequestBody -> BufferedReader