글 목차
1. 스프링은 프레임워크이다.
2. 스프링은 오픈소스이다.
3. 스프링은 IoC컨테이너이다.
4. class/object/instance 정리
5. 스프링은 DI를 지원한다.
💻 스프링은 프레임워크이다.
프레임은 틀, 워크는 동작을 한다는 동사
틀 안에서만 동작을 한다는 말이다. (이 틀을 벗어날 수 없다는 의미)
이 틀을 벗어나지 말라는 것은 코딩을 잘 못하는 나같은 개발자들을 위해 구제해주는...
디자인 패턴 같은 것을 잘 몰라도 이런 정형화된 툴 안에서 움직이면
프로그램을 일정 퀄리티 이상의 것을 잘 만들 수 있기 때문에 만들어진 것이다.
💻 스프링은 오픈소스이다.
오픈소스라는 것은 소스 코드가 공개가 되어있다.
스프링이 어떻게 만들어져 있는지 그 내부를 들여다 볼 수 있고, 이 내부를 뜯어 고칠수도 있다.
만약 이 스프링을 공부하다가 정말 많이 공부해서 내부의 깊숙한 곳까지 알게 되면,
직접 불편한 곳을 커스터마이징을 해서 contribute (공헌)할 수 있다.
💻 스프링은 IoC 컨테이너이다.
IoC 라는 것은?
Inversion of Control 의 약자로 제어의 역전이다.
제어가 역전이 된다는 것은 주도권이 빼앗겨있다는 것이다. (주도권이 스프링에 있음)
자바의 Class 라는 것이 이렇게 있는데
Object, instance 라는 것이 있다.
💻 class/object/instance 정리
class - 설계도
object - 실체화가 가능한 것
instance - 실체화가 된 것
실체화가 가능하다는 말은 이런 것이다.
class 에는 일반적인 class 도 있지만 abstract class (추상 클래스)도 존재한다.
누누 클래스가 있는데
(설명에서 리그오브레전드의 누누를 예시로 들으셨음 ㅋㅋ)
누누 클래스에는 어떤 변수들이 있을 것이다.
이것이 누누를 만들기 위한 설계도(클래스)이다.
누누는 게임할 때 실체화가 있는 것이기 때문에 바로 이 누누를 object라고 할 수 있다.
리그오브레전드에서 '캐릭터' 라는 것이 있는데 캐릭터는 많은 것이 포함되어 있다.
이 캐릭터는 굉장히 추상적인 의미이다. 이러한 추상적인 것이 abstract class 이겠지...
캐릭터에는 신지드, 애니, 케틀 등 이런 것들이 올 수 있다.
캐릭터는 추상적인 것이기 때문에 실체화가 불가능하다.
이것은 Object 라고 하지 않는다.
Instance 는 실체화가 된 것을 의미한다.
누누가 소환사의 협곡에서 눈을 굴리고 다니면 실제 게임 내에서
존재하는 것이기 때문에 실체화가 된 인스턴스라고 볼 수 있다.
가구는 실체화가 가능할까? 가구는 추상적인 것이고, 실체화가 불가능 합니다.
실체화가 가능한 것은 의자, 침대 이러한 것들이 실체화가 가능한 것들이기 때문에 Object 라고 부르고,
Obejct 로 존재하다가 이 세상에 튀어나오는 순간 실체화가 되었기 때문에 Instance 라고 한다.
이제 진짜 IoC 에 대해서 설명이 되는데,
제어의 역전, 주도권이 스프링에 있다는 것은
내가 object 를 new 로 해서 heap 이라는 메모리 공간에 올리게 된다면
내가 직접 new 연산자를 쓰는건데 개발자가 new 를 한 것이다
개발자가 new 를 해서 heap 공간에 올리면 이것의 주소는 reperance 변수 s 이다.
s를 누가 관리하냐면 new 를 만든 해당 스택, 메서드 내부에서 관리하게 된다. (메서드 내부)
public void make() {
의자 s = new 의자();
}
라고 하면, 의자를 new 했기 때문에 이 의자를 실체화 시킨 것이다.
실체화 시켜서 메모리를 띄운 것을 이 주소를 s가 들고있다.
s는 메서드가 실행되는 순간에만 메모리에 떠있다.
public void use() {
의자 s = new 의자();
}
다른 메서드에서 이 의자를 쓰고 싶으면, 이렇게 쓸텐데
위의 make 에서 생성된 s 가 가르키는 곳과 밑의 use 에서
가르키는 s 곳이 서로 다른 주소에서 서로 다르게 관리되고 있다는 사실은 자명하다.
위의 인스턴스의 s 를 쓰고 싶은데 밑에서 new 를 사용하면 사용하지 못한다.
어떤 방법으로든 넘겨 받아야 하는데 이러한 로직을 짜는것은 굉장히~~~ 힘들다.
나도 자바 swing 프로젝트 하면서 이 문제 때문에 애를 많이 먹었던 기억이 있다.
spring 을 학원에서 배우면서 그냥 써서 몰랐는데 다시 고민을 해보니 이러한 문제가 spring 을 사용할 땐 없었다.
setAttribute 이런걸 통해서 계속 값을 자유롭게 넘겨받았으니...
우리가 들고 있는 수많은 object 들 (기린, 고양이, 사자...) 이러한 것들은 클래스로 다 만들어놓으면
spring 이 이걸 다 읽어서 spring 이 이 객체들을 띄운다. (heap 메모리 공간에 뜸)
솔직히 heap 뭔지 모르겠지만 대충 많이 들어보기도 하고 그래서
어떤 메모리 공간에 올라가는 거겠지 싶고 그냥 넘어가려고 한다... 이 플젝 끝나면 자바부터 다시 봐야지 ㅠ;
spring 이 만들었는데 이 주소를 내가 어떻게 찾아가는지는 신경 쓸 필요가 없다. 지금 중요한것은 IoC 이니까
spring 이 object 들을 읽어서 메모리에 올려준다는 사실을 아는 것이 중요하다.
💻 스프링은 DI를 지원한다.
DI - Dependency Injection
의존성 주입이라고 한다.
이것은 언제 쓰이냐면 예전에는 내가 new 를 해서
그 객체의 주소를 개발자가 원하는곳에서 내가 관리를 해야 했다면,
이제는 스프링이 스캔을 해서 object 를 메모리에 띄웠기 때문에 내가 관리를 하는 것이 아니라
스프링이 관리를 하는 것인데 이것을 IoC 제어의 역전이라고 하고
스프링이 관리하는 이 객체를 내가 원하는 모든 곳에서 모든 어떤 클래스의 메소드에서든
힙 메모리 공간에 올려진 이 객체들을 가져다가 쓸 수 있게 된다는 것이다.
딱 한번만 내가 필요한 객체들이 메모리에 뜨고
이 공간에 뜬 메모리를 어디에서든 사용이 가능하다 (싱글톤으로 관리가 됨 - Singleton Pattern)
필요한 곳에서 이렇게 가져다 쓰는 것을 DI (Dependency Injection) 이라고 한다.
이 IoC/DI 를 하면 프로그램을 짜기 굉장히 수월해진다.
강의해주신 유튜브 - [메타코딩] 선생님 강사합니다.
문제가 된다면 삭제하도록 하겠습니다.
'Java (국비지원 당시 공부했던 글) > Spring' 카테고리의 다른 글
[Spring] - 2. MVC 패턴 정리 (0) | 2022.09.01 |
---|---|
[Spring] - 1. 인코딩 타입 설정 정리 (0) | 2022.09.01 |
[Spring] - 0. Spring Framework, sts3 설치 (0) | 2022.08.22 |