-

[스프링 부트 Step 1] - 스프링 부트 개념 정리 본문

백엔드 기술 정리/스프링 부트

[스프링 부트 Step 1] - 스프링 부트 개념 정리

흣차 2021. 12. 9. 01:10
728x90
반응형

이번 스프링 부트 내용 관련 정리는 JPA와 관련해서 작성합니다.

1. 스프링부트는 일종의 웹,앱 개발을 위한 하나의 "프레임 워크"입니다.

Frame은 틀, work는 동작하다(동사)인 것으로 비추어 보아 틀 안에서 동작한다 이런 의미로 이해하시면 되겠습니다.

단어 그대로, 개발을 하는데 있어서 이 틀을 벗어나지 말라는 의미입니다.

"신입 개발자들아. 내가 틀을 제공해줄테니까 너는 이 틀에 맞춰서 개발해. 그럼 너도 나처럼 좋은 프로그램을 만들 수 있을거야" 이게 프레임워크입니다.

 

2. 또한 스프링 부트는 오픈 소스입니다.

따라서 우리는 소스 코드의 내부를 들여다 볼 수 있습니다.

만약 우리가 스프링 부트를 공부하다가 내부를 너무 많이 공부해서 아주 깊숙히 알게 되면 이거 좀 불편한데? 생각이 들 때 고쳐서 Contribute할 수도 있습니다. 다만 이게 가능하다면 지금처럼 스프링 부트를 공부하지 않아도 될 실력이겠죠?

 

3. 스프링부트는 IoC 컨테이너를 가집니다. (중요)

IoC라는건 "Inversior of Controll"의 약자입니다.

직역하면 "제어의 역전"으로 풀이됩니다. 그러니까 무슨 의미냐면 주도권을 스프링이 가진다고 이해할 수 있겠습니다.

예를 들어 class가 있고 object, Instance가 있다고 해봅시다.

class는 설계도지요?? object는 실체화가 가능한 것(객체)라고 합니다.

이해가 안되는 분들께 한 번 예를 들어볼게요.

제가 롤을 좋아하는데 그 중 제이스라는 챔피언을 참 좋아합니다. class는 설계도라고 했는데, 이 제이스라는 챔피언을 설계하기 위해 여러 변수가 있을거란 말이에요? 그리고 제이스는 게임할 때 실제로 플레이 되는 것이기 때문에 제이스는 object라고 할 수 있습니다. 

그런데, 롤에서 사용자 계정은 굉장히 추상적인 의미로서 해석될 수 있습니다.

우리가 큐를 잡고 제이스를 고르기 전까지 티모를 고를 수 있고, 블리츠크랭크를 고를 수 있는 여러 경우의 수가 존재합니다. 이 때 저의 계정은 추상적인 의미를 가집니다. 

게임속에 저의 캐릭터가 존재할 뿐이지 제가 존재하는 것이 아니기 때문이지요.

그래서 이것은 실체화가 불가능한 것으로서 여겨집니다.

그럼 Instance는 무엇일까요?

인게임 상황에서 다시 비추어 해석해보겠습니다.

제이스가 해머로 미니언을 때렸을 때 실제 게임안에 제이스가 존재하는 것이잖아요?

이건 또한 실체화가 된 것입니다. 즉, 실체화가 되었으면서 추상적이지 않은 것. 이것이 바로 Instance입니다.

 

다르게 이야기 해볼게요.

가구를 떠올려봅시다.

가구는 Object일까요?

정답은 No입니다. 

가구는 실체화가 불가능하기 때문입니다. 왜냐하면 가구 자체를 우리가 본 적이 있나요? 가구에 속하는 의자, 침대 이런 걸 보았지(Object), 가구를 보진 않았습니다.

그러므로 가구는 "추상적"이라고 생각하시면 되겠습니다.

그리고 여러분이 보고 계시는 노트북, 마우스. 이런 것들은 Instance입니다.

이해가 가시나요????

그럼 다시 IoC를 설명해볼게요.

IoC는 Object를 직접 new 의자(); 와 같이 만들어서 heap이라는 메모리 공간에 올리게 되면 

그 heap에 올라간 주소는 Reference 변수 s인데, 이 변수 s를 누가 관리하냐면 바로 메서드 내부에서 관리하게 됩니다.

예를 들어

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

이렇게 작성한다면 의자를 실체화 시켜서 메모리에 띄운겁니다.

이 주소는 s가 가지고 있습니다. 그리고 s는 이 make메서드가 실행된 순간에 메모리에 떠있게 됩니다.

근데 만약에 다른 메서드에서(예를 들면 use()) 의자를 사용하고 싶을 수 있잖아요?

그래서 다른 메서드에서

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

라고 만들었다고 해봅시다.

그럼 이 s 주소는 heap에 밑에 하나 더 추가되어서 뜨게 됩니다.

즉, 위의 s와 밑의 s는 다른 의자로 관리될 수 있습니다.

이렇게 되면 나중에 작업할 때 서로 공유하는게 굉장히 어려워집니다.

그래서 스프링부트에서 IoC라는걸 해줍니다.

의자라는 오브젝트도 있고, 제이스라는 오브젝트도 있고~ 여러 오브젝트가 있을 때 스프링부트에서는 이것들을 전부 스캔해서 HEAP 메모리 공간에 다 띄워주는 역할을 수행하여 번거롭게 불필요하게 공유되는 변수를 줄입니다.

 

네 번째로 스프링 부트는 DI를 지원합니다.

DI라는건 Dependency Injection의 약자로서 의존성 주입이라고 부릅니다.

원래 예전에는 내가 주소를 관리했다면 이젠 스프링이 스캔해서 오브젝트를 메모리에 띄웠기 때문에 내가 관리 안하고 스프링이 관리했습니다. 이걸 IoC라고 하고 그럼 스프링이 관리하는 이 객체를 내가 원하는 모든 곳에서, 즉 모든 클래스에서도 그대로 사용할 수 있게 지원합니다.

따라서 다른 클래스의 오브젝트라고 하더라도 이를 메모리에 한 번만 띄우기 때문에 같은 오브젝트를 사용할 수 있게 해주며 이를 우리는 "싱글톤"이라고도 부릅니다. 

또한 필요한 곳에서 가져가서 쓰는 것. 이것을 DI라고도 부릅니다.

이 IoC와 DI를 잘하면 나중에 개발하는데 굉장히 편리합니다.

그러니 잘 공부해서 우리 모두 훌륭한 개발자가 됩시다.

감사합니다.

728x90
반응형
Comments