Wanna be Brilliant Full-Stack Developer

I have no idea What the Spring is & 스프링 개념 잡기! 본문

Some Memos/Spring 개념

I have no idea What the Spring is & 스프링 개념 잡기!

Flashpacker 2022. 2. 11. 15:30

나의 Bestie가 되어줘 제발!!


목표

스프링에 익숙해지기 위해 개념을 처음부터 잡아보려고한다!! 

 

Spring은 Framework이다

틀안에서 동작한다는것인데..! 

어떠한 틀이 있으면 그안에 구슬이 있으면 이 틀을 좌우로 상하로 움직이면 구슬은 그 틀 안에서만 결국 움직인다

그 틀을 벗어날수 없다.

이것이 프레임워크이다!!

그러면 프레임워크는 왜나온것인가? 이틀을 벗어나지 말라는것이다! 

신입 개발자가 마음대로 만들지 말고 이 틀을 벗어나지 않고 만들수 있도록 틀을 제공할테니가 이 틀에 맞춰서 만들라는것이다. 이렇게 하면 선임 개발자처럼 좋은 프로그램을 만들수 있을거야! 이것이 프레임워크이다. 

 

Spring은 오픈소스이다. (무료)

이 소스 코드가 공개되어있다는것인데! 스프링이 어떻게 만들어져있는데 우리는 내부를 확인할 수 있다. 

이 말은 내부를 뜯어 고칠 수 있다는 것이다! 

우리가 만약에 스프링을 공부하다가 정말 깊숙한곳까지 알게 되면 불편한점들이 보이는것들을 고칠 수 있고 기여할 수 있다. 

 

Spring은 IOC 컨테이너를 가진다. IOC( Inversion of Controll) 제어의 역전!

IOC 컨테이너는 무엇인가? 이것은 스프링의 핵심이다!

제어를 역전한다는것은 무슨 뜻인가?  주도권을 빼앗겼다는것이다 주도권이 스프링에게 있다는것인데!

이게 무슨말인가?

Class : 설계도이다. 

Class 에는 일반적인 클래스도 있지만 abstract 클래스 ( 추상클래스) 도 있다. 

Object : 실체화가 가능한 것을 말한다!

Instance : 실체화 된것

 

ex) 게임 LoL에 있는 누누 라는 클래스가 있는데 

그안에는 많은 변수들이 있을것이다. 누누를 만들기 위한 클래스니까 누누를 만들기 위한 설계도이다.

누누는 실제로 게임할떄 나오는 것이니까 누누는 Object이다. 

롤에서는 캐릭터라는것도 있다. 

캐릭터라는것은 많은것을 포함하고 있는데 굉장히 추상적인 의미를 가지고 있다. 

캐릭터에는 누누가 올수 있고 티모도 올수도 있고 케이틀링도 올수 있고 이 들을 다 캐릭터로 부를수 있다. 

캐릭터는 추상적인 의미이기 때문에 실체화가 불가능하다. 

애들은 게임속에 존재할 수 없는것들이기 때문인데 

 

실체화 됬다는것은?  누누가 전장의 협곡에서 돌아다니고 있으면 게임속에서 존재하고 있는거이기 떄문에 실체화가 된것이다. 

ex2) 가구라는것이 있으면 가구는 오브젝트 일까요? 가구는 실체화가 불가능하다 .

우리가 가구를 본것이 아니기 때문 가구는 추상적인것이다.

실체화가 가능한것은 의자, 침대 그래서 이들을 object라고 부른다.

이러한것들이 Object로 존재하다가 이세상에 튀어 나오는 순간 실체화가 되었기 때문에 Instance라고 부르게 된다!

 

이 세가지가 이해가 되면 IOC 설명으로 넘어갈수 있다.

 

주도권이 스프링에 있다는것은 내가 오브젝트를 직접 new를 해서 heap이라는 메모리 공간에 올리게 되면  
이건 내가 직접 new를 하는것인데 예를 들자면
Ex) 의자 S = new 의자 () ; 를 보면 개발자가 직접 new를 하게 되면 heap공간에 올리게 되면 그 주소는 레퍼런스 변수 s이다. 이 S를 누가 관리하게 되면 new를 만든 해당 메서드 내부 에서 관리하게 된다. 

ex)  Public void make() {
의자 s = new 의자();
} 라는 함수가 있을때 의자를 new했기 떄문에 의자라는 object를 실체화 시켜 메모리에 띄운것이다. 
그 주소를 s 가 가지고 있고 s가 주소를 가리키고 있다. 
하지만 이  s는  메서드가 실행하는 순간에만 메모리에 떠있다. 
만약에 다른 메서드에서 
Public void make() {
의자 s = new 의자();

public void use() {
의자 s = new 의자();      // 새로 new를 한것이기 떄문에 heap영역에 새로운 의자가 만들어지는것이다. 위에 make 와 
}                               // use의 s는 같다고 말할 수 없다. 다른것이다 
이 주소는 각각의 메서드가 관리하게되는데 나중에 공유하는게 힘들어진다.
무엇을 공유하는것이 힘드냐면 make 메서드의 의자를 use 메서드에서 사용하고 싶었는데 지금 이방법으로는 불가능하다.

 

make메서드의 의자를 use메서드 안에 넘겨줘야한다

이러한 로직을 짜는것이 힘들기 떄문에 스프링이 IOC를 통해 도와줄수 있다는것인데

우리가 가지고 있는 수많은 오브젝트들을 클래스로 다만든 상태에서 스프링이 다 스캔을 하고 

자기가 직접 이 객체들을 띄운다. 당연히 모든 객체들은 Heap에 있다. 

그러면 Spring이 가지고 있는 것들은 내가 만든것이 아니기떄문에 Spring이 만들었는데 어떻게 주소를 찾을까? 이렇게 물어볼수있지만 그것은 지금은 신경쓸필요없다

중요한것은 IOC이다. 스프링이 읽어서 메모리에 올려준다는것이다. 

모든 클래스들을 스캔해서 Spring IOC 컨테이너 Heap 메모리에 저장하는것이 IOC이다.

스프링이 DI를 지원한다는것은 무엇인가? 

Dependency Injection 의존성 주입!

의존성 주입은 언제 사용하는것인가?

예전에는 내가 new를 해서 그객체의 주소를 내가 원하는곳에서 관리하였다면

이제는 Spring이 스캔을 하여서 오브젝트를 메모리에 띄웠기 떄문에 이제는 내가 관리하는것이 아니라 스프링이 관리하는것인데 이것을 제어의 역전 (IOC)라고 부르는것이다.

 

이제는 스프링이 관리하는 이 객체를 내가 원하는 모든곳에서 (어떤 클래스의 메서드에서) 스프링이 스캔하거 저장하고 있는 곳에서 다 가져와서 사용할수 있다. 

만약에 의자를 사용하고 싶으면 다른곳에서 의자를 사용하면 각각 클래스마다 이용하고 있는 의자는 다 같은 의자이다. 

한마디로 싱글톤으로 관리 된다. 스캔을 하면 이의자가 한번만 스프링에 저장이 되고 그 한번만 뜬 의자를 공유해서 사용할수 있다.  

변수들이 묶여 있으면 수정하거나 추가할때 모든것 하나하나를 건드려야한다는것은  서로 의존성이 결합이 잘되어있고 높은것인데

DI로 의존성을 줄이고 서로다른 객체를 만들어서 Service, DTO , Controller를 이렇게 따로 만들어서 필요할때마다 

그 써야하는 기능들을 어노테이션을 통해 사용함을 통해 의존성을 줄이는것

 

이렇게 필요한곳에서 가져와서 사용하는것을 DI 라고 말한다!

Spring은 IOC와 DI를 잘하면 된다!