스프링부트 강좌 4강(블로그 프로젝트) - 프로젝트 실행해보기
test package를 만든다.
spring -> Ioc -> 제어의 역전을 한다.
너가 new 해서 메모리에 띄우지 마. 내가 new 해서 메모리를 띄울거야.
여기서 너는 => 나
나는 => 스프링
싱글톤 패턴 + 래퍼런스 변수를 스프링이 관리하겠다는 의미이다.
만약 테스트라는 클래스가 있다.
Class A {
}
Class B {
}
Class Test {
void hello() {
A a = new A();
}
}
Class A 를 메모리에 띄울 수 있다는 이야기이다. new 한다는 것은 heap 이라는 공간을 만든다는 것이고. 그 공간을 a로 가르킨다는 것이다. a라는 변수는 hello라는 메서드 내부에서 들고 있는 변수이다. 그래서 지역변수라고 부른다. 메서드 내부에
호출할때 메모리에 떤다. 그리고 호출이 종료될 때 부분이 사라진다. 호출 시에 메모리에 떴다가 종료되면 메모리에 사라진다.
스택에서 객체를 만들게 되면,
헬로우 라는 메서드, 생성자, 메인 메소드나 그 내부를 스택이라고 한다. 스택에서 만든 모든 객체는 결국 지역변수가 관리하기 때문에 그 지역변수는 다른 스택에서 공유해서 사용할 수 없다. 예를 들어 다른 animal 이라는 클래스가 있다고 한다.
class Animal {
void Start() {
}
}
Start 메서드에서 클래스 A가 필요한데, 여기에 접근하기 위해서는 굉장히 복잡한 로직이 필요하다. a라는 변수는 hello라는 곳에서 만들었기 때문이다. 헬로우 호출이 끝나면 사라지기 때문에 a라는 것들을... 전역공간에다가 선언하고... void라고 하지 말고 return이라고 하면.. 등등 번거로운 작업이 필요하다.
그래서 스프링 컨테이너에 a 변수 관리해줄게. 그럼 너는 a가 필요할 때 가져가서 써! 이게 제어의 역전이다.
스프링이 초반에 컴포넌트 스캔이라는 것을 한다. 컴포넌트 스캔이란 무엇인가?
어떤 패키지가 있을 때, 그 패키지 이하를 전부 다 스캔해서 메모리에 로드한다. Ioc라고 하고 싱글톤 패턴으로 관리한다. 메모리에 로드할 때 스프링 컨테이너이면 모든 객체에 대한 변수들을 관리한다.
그 기준이 뭐냐면..?
com.yuri.blog 라고 패키지 이름을 만들었는데 그럼 그 이하가 스캔을 한다.
근데 만약에 com.yuri.test 라고 마음대로 패키지를 만들어서 그 안에 작업파일을 만들어 놓으면 스프링이 스캔을 하지 않는다. 그럼 메모리에 뜨지 않는다. 진행할 수 없음 아무것도..
스프링 부트 할때 가장 중요한 것 중 하나가 패키지 이하로 만들어야 한다.
com.yuri.blog.controller
com.yuri.blog.resource
다음과 같이 만들어줘야 한다.
여기서 만났던 에러....
겟인데어님의 유튜브 있는 소스코드를 그대로 xml 파일에 추가했는데
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper</artifactId>
<version>9.0.22</version>
</dependency>
[tomcat-embed-core-9.0.37.jar:9.0.37] 라는 오류가 계속 났다..그래서 그냥 다 삭제하고 다시 깔고, 유튜브에 있는 의존성 말고 블로그에 있는
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
이 부분을 추가해줬더니 잘 동작했다.
이 글은 유투버 겟인데어의 스프링 부트 강좌를 바탕으로 정리한 내용입니다.