제이제이
article thumbnail

 

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


❓ 프레임 워크란?

🔥 Frame Work = Frame(틀) + work(동작한다) = 틀 안에서 동작함을 의미합니다.

2. 스프링은 오픈소스입니다.


❓ 오픈 소스란?

🔥 무료이며 소스코드가 모두 공개된 코드를 의미합니다.

 

따라서 스프링 부트는 오픈 소스를 뜯어서 내부가 어떻게 생겼는지 열어 볼 수 있습니다.

즉, 이 의미는 사용하다가 나중에 불편한 점들을 직접 뜯어 고쳐 오픈소스에 기여 할 수 있음을 의미합니다.

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


❓IOC이란?

🔥 제어의 역전을 의미하며 프로그램의 주도권이 스프링에게 있다는 것을 의미합니다.

 

 

이를 이해하기 위해서는 자바의 Class, Object,Instance에 대한 개념의 이해가 필요합니다.

 

위의 예시를 살펴보면 가구는 실체화가 가능하지 않으므로 Object가 아니라고 소개했습니다.

가구는 의자, 책상 등등 여러 가지로 분류할 수 있고 이 모든 것을 포함하는 가구라는 단어는 추상적인 개념이기 때문입니다.

 

❓ 프로그램의 제어가 스프링에게 있다는 의미는 무슨 의미일까요?

다음의 그림을 살펴봅시다.

 

이를 보다 더 자세하게 이해하기 위해 자바 코드로 살펴봅시다.

 

❓ 위의 코드에서 의자 S와 의자 V는 동일한 Object일까요?

🔥 서로 각각 다른 의자입니다.(의자 s ≠ 의자 v)

 

또한 각 인스턴스의 주소는 각각의 메소드가 관리합니다.

(의자 S 는 make 메소드가 관리, 의자 v는 use메소드가 관리)

 

메모리의 heap 부분

 

반면에 스프링은 다음과 같이 Object를 관리합니다.

 

정리

🔥 스프링이 코드를 스캔하면 딱 1번만 heap 메모리에 올려지게 되고 의자 인스턴스를 어디에서 쓰든 해당 인스턴스를 공유해서 사용할 수 있습니다.

4. 스프링은 DI를 지원합니다.


❓DI란?

DI = Dependency Injecton(의존성 주입)을 의미합니다.

 

이전에 스프링이 코드를 스캔해서 모든 Object를 heap메모리에 띄운다는 점을 알아봤습니다.(IOC = 스프링이 인스턴스들을 관리함)

 

❓그럼 DI란 무엇일까요?

🔥 스프링이 관리하는 Object를 스캔해서 만든 인스턴스를 내가 원하는 모든 곳에서 가져와 사용할 수 있음을 의미합니다.

 

  • 해당 인스턴스는 싱글톤으로 오게 됩니다.

5. 스프링은 엄청나게 많은 필터들을 가지고 있습니다.


다음의 그림을 통해 살펴봅시다.

 

그림과 같이 A나라와 B나라가 전쟁중이라고 가정을 해봅시다.

이 때 A나라의 성의 입구에서는 문지기가 다음과 같은 역할을 진행할 것 입니다.

A나라의 백성이 맞다면 성 안에 들어가게 될 것이며,
만약 B나라의 사람이라면 첩자라고 판단하고 쫒아낼 것입니다.

이처럼 문지기의 역할을 하는 것이 톰캣의 필터(Filter)이며 이 역할을 하는 파일은 web.xml입니다.

 

또한 A나라 성 안의 왕궁에 들어가는데를 살펴봅시다.

A나라의 왕궁 입구에서는 입장할 권한을 체크하는 호위대가 있을 것입니다.

만약 A나라 왕궁에 들어갈 권한이 있다면 들여보낼 것이고 아니면 들여보내지 않을 것입니다.

이처럼 왕궁(스프링 컨테이너)에 들어갈 권한이 있는지 체크하는 것 인터셉터라고 합니다.

이처럼 스프링은 수 많은 필터들을 가지고 있으며 수 많은 정보들을 필터링을 합니다.

우리는 이 필터들을 사용할 수도 있고, 사용하지 않은 필터들을 설정하여 사용하게끔 변경할 수 도 있고, 심지어 사용자가 직접 필터를 생성할 수도 있습니다.

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


❓ 어노테이션이란?

//글 ~~~ (주석) = 컴파일러가 무시합니다.
//@어노테이션(주석 + 컴파일러에게 힌트를 줌) = 컴파일러가 무시하지 못합니다.

 

다음의 예를 통해 살펴봅시다.

먼저 다음과 같이 Animal클래스와 Dog클래스가 있다고 가정하겠습니다.

class Animal{
	run();
}
class Dog extends Animal{
	@override
	run();
}

 

이 경우 Dog클래스를 컴파일 할 때 Animal 클래스에 가서 run메소드가 있는지 확인합니다.

 

만약 Dog클래스가 다음과 같이 있다고 가정합시다.

class Dog extends Animal{
	@Override
	fly();
}

 

위의 Dog클래스 코드의 경우 컴파일 체킹시 Animal 클래스에 fly메소드가 없으므로 에러가 발생합니다.

 

❓ 스프링은 어노테이션을 어떻게 사용할까?

🔥 스프링은 어노테이션을 사용해 주로 객체 및 특정 기능을 실행하도록 정보를 제공합니다.

 

@Component = 이 어노테이션이 붙어 있는 클래스는 메모리에 로딩을 해!
@Autowired = 로딩된 객체를 해당 변수에 집어 넣어!
@Controller = 이것은 Controller입니다.

 

다음의 코드를 살펴봅시다.

@Component
class A{

}

 

스프링은 클래스 A를 스캔해서 heap메모리에 다음과 같이 인스턴스를 로딩합니다.

 

그리고 다음과 같이 B 클래스가 있습니다.

class B{
	@Autowired //로딩된 객체를 해당 변수에 집어 넣어!
	A a;
}

 

평소 자바를 이용했을 때의 B 인스턴스의 생성 스프링에서 B 인스턴스를 생성했을 때의 코드를 보면 다음과 같습니다.

 

이처럼 스프링에서 클래스를 스캔할 때 내부에 어떤 요소가 있는지 분석하는 것을 리플렉션이라고 합니다.

❓리플렉션이란?

 🔥 스프링에서 클래스를 스캔할 때 내부에 어떤 요소들이 있는지 분석하는 것을 의미합니다.

 

❓ 그럼 리플렉션의 역할은 뭐야?

🔥 스프링 내부에 있는 메소드,필드, 어노테이션을 체킹할 수 있습니다.

 

❓ 만약 heap메모리에 A 인스턴스가 없다면?

heap메모리에 A인스턴스가 없다고 가정해봅시다.

그럼 다음과 같이 변수 a에는 null이 입력되게 됩니다.

 

정리

❓어노테이션이란?

🔥 주석과 컴파일에게 힌트를 줌으로써 컴파일러가 무시하지 못하게 합니다.

 

❓ 리플렉션이란?

🔥 해당 클래스에 어떤 필드, 어떤 어노테이션이 있는지를 확인하고 스프링이 Object를 로딩하여 heap메모리에 만든 인스턴스 중 해당 인스턴스가 있는지 다시한번 확인(체킹)하는 기법입니다.

 

  • 런타임시 분석을 진행합니다.

7. 스프링은 MessageConverter를 가지고 있습니다. 기본 값은 Json입니다.


다음의 그림을 살펴봅시다.

 

영어권 사람 A 한국말을 하는 사람 B가 있다고 가정해봅시다.

이 때 서로의 언어를 이해하지 못한다면 의사소통을 할 수 없게 될 것입니다.

때문에 이 둘 사이에는 서로 이해할 수 있는 언어가 필요합니다.

 

때문에 다음 그림과 같이 중간 언어라는 것을 사용합니다.

 

과거에는 Xml을 사용하였으나 현재는 주로 Json을 사용하고 있습니다.

 

위의 그림을 프로그래밍 관점에서 보면 다음과 같습니다.

 

예를 들어 자바 Object가 있다면 MessageConverter 파이썬 Object로 변환을 해주게 됩니다.

반대로 파이썬 Object가 있다면 이는 MessgeConverter를 통해 자바 Object로 변환할 수 있습니다.

 

다음과 같이 스프링에 자바 코드로 Animal이 있다고 가정합시다.

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

 

위의 코드에 대한 요청이 있을 때 스프링(서버)에서는 클라이언트로 전송될 때 다음과 같이 Json형식으로 변환되어 전송되어 집니다.

(현재 스프링과 스프링 부트에서는 MessageConverter의 역할을 하고 있는 Jackson이라는 라이브러리가 내부에 있습니다.)

"num" : 10
"name" : "사자"

 

8. 스프링은 BufferedReader와 Buffered Wirter를 쉽게 사용할 수 있습니다.


먼저 이를 이해하기 위해서는 통신에 대한 개념을 이해해야 합니다.

현재 통신의 논리적인 단위는 byte라는 개념을 사용하고 있습니다.

 

 

이와 더불어 영어, 한국어, 중국어의 글자 표현은 다음과 같은 Byte를 이용해 표현하고 있습니다.

 

영어의 한 문자를 표현하기 위해서는 1Byte(8bit)가 필요하고,

한국어의 한 문자를 표현하기 위해서는 2Byte(16bit),

중국어의 한 문자를 표현하기 위해서는 3Byte(24bit)가 필요합니다.

 

이처럼 세상의 문자 표현이 각각 다른 Byte가 필요하는데 현재에는 유니코드를 이용하여 모든 글자를 표현하고 있습니다.(3Byte 통신)

 

그리고 자바에서 바이트가 통신 및 수신하는 개념은 다음 그림과 같습니다.

 

과정

 1. A에서 자바 프로그램에게 데이터를 보낼때 Byte단위로 보내게 됩니다.

❓ 바이트 스트림이란?

🔥 1 Byte를 입 출력할 수 있는 스트림을 의미합니다.

 

🔎 스트림 = 데이터의 흐름을 의미합니다.

 

2. 자바 프로그램을 InputStream이나 InputSteramReader, BufferedReader, writter를 통해 데이터를 읽게 됩니다.

❓ InputStreamReader란?

🔥 입력받은 데이터 or 문자를 char로 Casting을 대신하는 클래스입니다.

 

  • 입력된 데이터를 배열을 통해서 받습니다.

 배열을 이용하기에 크기가 미리 정해져 있어야 한다는 단점이 있습니다.

 

❓BufferedReader와 Writer란?

🔥 데이터를 받는 공간이 정해질 필요가 없어 가변 길이의 문자를 받을 수 있습니다.

 

  • 데이터를 받는 공간이 정해질 필요가 없어 자주 사용합니다.

정리

이를 정리하면 자바에서의 주요 데이터를 주고 받을 때는 다음 그림과 같이 사용하게 됩니다.

 

이것을 jsp에서는 다음 그림과 같이 데이터를 주고 받습니다.

jsp

 

요청을 받을 때

  • request.getReader( )를 통해 A로 부터 보내진 데이터를 받습니다.

 

응답할 때

  • out이라는 내장 객체를 통해 A에게 데이터를 응답합니다.

스프링

 

요청을 받았을 때

🔥 @Requset Body 어노테이션을 붙입니다.
  • Buffered Reader가 작동합니다.

 

응답할 때

🔥 @Response Body 어노테이션을 붙입니다.
  • Buffered Writer가 작동합니다.

9. 스프링은 계속 발전하는 중입니다.


스프링은 계속해서 최신 버전이 나오고 있습니다.

 

📒 Reference(참고자료)


 

 

[무료] 스프링부트 개념정리(이론) - 인프런 | 강의

스프링부트를 공부하며 헷갈리는 개념이 많았던 분 스프링부트에 대해 공부하고 싶었던 모든 분, - 강의 소개 | 인프런...

www.inflearn.com

 

profile

제이제이

@아사비치즈스틱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!