Wanna be Brilliant Full-Stack Developer

SpringBoot Blog 만들기 프로젝트 실행해보기 본문

Back-End/블로그 만들기 With SpringBoot

SpringBoot Blog 만들기 프로젝트 실행해보기

Flashpacker 2023. 2. 2. 00:38

임의로 test 패키지를 만들면 안된다! 그이유는 무엇일까?

일단은 스프링이 IOC로 한다. 제어의 역전! 

제어의 역전이라는것은 너가 new 해서 메모리에 띄우지말고 내가 new해서 메모리에 띄울게

여기서 나라는것은 스프링을 뜻한다. 너라는것은 우리를 뜻한다.

 

왜그런가? 싱글톤 패턴을 사용하고 싶다는것과 레퍼런스 변수 스프링이 관리해주겠다는 것인데

 

만약에 우리가 Test라는 클래스를 가지고 있다. 

이 Test라는 클래스에서 Class A와 B가 있는데 여기서 헬로우라는 메서드에서
클래스 A를  객체가 필요해서 A a = new A(); 

new 한다는것은 Heap이라는 공간을 만든다는것이고 그공간을 a로 가리킨다는것이고

중요한것은 a라는 변수를 누가 가지고 있느냐? 헬로우라는 메서드내부에서 들고 있는

a라는 변수! 이런것을 지역변수라고 한다.

왜냐하면 Hello라는 메서드 내부에 변수를 선언했기 떄문이다.

원래 메서드 내부에 있는 이 공간은 메서드 호출시에 밑에 부분이 메모리에 뜨고

호출이 종료 될때 메모리에서 이부분이 사라진다. 

이 내부는 호출시에 메모리에 떳다가 호출이 끝나면 메모리가 사라지는 부분

한마디로 여기에 어떤 변수를 선언해도 Hello가 호출되기전에는 해당 변수가 없다

누군가 호출할때 잠깐 뜨고 호출이 종료되면 메모리에 사라진다.

이런 Stack에서 객체를 만들게 되면, Stack에서 객체를 만들어야한다

생성자나 메인 메소드나 어디나 메서드이기 떄문에 스택이라고 한다.

스택에서 만든 모든 객체는 결국 지역 변수가 관리하기 떄문에

지역 변수는 다른 스택에서 공유해서 사용할수가 없기 떄문에

 

예를 들어 다른 클래스 Animal이라고 한다면 애니멀이라는 클래스 Void start()라는 함수가 있는데

저 a가 필요하다면 접근하기 위해서는 굉장히 복잡한 로직이 필요하다.

이 a라는 변수는 Hello라는곳에서 만들었기 때문이다.

 

만약 전역공간에다가 만약 a를 선언한다면 heap으로 관리한다면 

혹은 void라고 하지 않고 a를 리턴한다면 a객체를 관리한다는 방식이 굉장히 번거롭다.

 

계속 new하지말고 스프링이 관리하겠다. 내가 New하겠다. 스프링컨테이너에서 a를 관리하고

필요할때마다 쓰라고 하는것이 제어의 역전이다. 

제어의역전은 스프링이 컴포넌트 스캔을 한다.

컴포넌트 스캔은  무엇인가 어떤 패키지가 있을떄 그 패키지 이하를 전부 스캔해서

필요한것들을 메모리에 로드 하는데 이것을 IOC라고 하고 싱글톤 패턴으로 관리한다

 

메모리에 로드 할때 스프링컨테이너면 여기에다가  모든 객체들의 변수를 관리한다.

패키지를 스캔에서 저기에 띄우는 기준이 무엇인가?

Com.cos.blog패키지를 만들었으면 그 이하만 스프링이 스캔을 한다.

만약에 com.cos.test라고 마음대로 패키지를 만들었으면 그 안에 작업파일을 만들었으면

스프링은 스캔을 하지 않고 메모리에 뜨지 않는다.

 

여기에 스프링부트할떄 가장 중요한것은 우리가 만든 패키지 이하로 패키지를 만들어야한다.

com.cos.blog. 다음에 만들고 싶은 이름으로 패키지를 이하로 만들어야한다!

package com.cos.blog.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

 // 스프링이 com.cos.blog 패키지 이하를 스캔해서 모든 파일을 new하는 것은 아니구요.
// 특정 어노테이션이 붙어있는 클래스 파일들울 new해서 IOC 스프링 컨테이너에 관리해줍니다.
@RestController
public class BlogControllerTest {
	
	//http://localhost:8080/test/hello 요청하면 저 문자가 브라우저에나올것이다.
	@GetMapping("/test/hello")
	public String hello() {
		return "<h1>hello spring boot</h1>";
	}
}