Spring

스프링 7강. 컴포넌트 스캔

JJJAEOoni 2022. 2. 27. 13:39
반응형

 

package site.metacoding.first;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication // 얘가 성을 만들어줌
public class FirstApplication {

	public static void main(String[] args) {
		// main을 실행하면 스프링이라는 프레임워크가 실행됨(성이 지어짐)
		SpringApplication.run(FirstApplication.class, args);
	}
}

FirstApplication의 main을 실행하면

스프링의 큰 성이 지어진다.

이 성의 입구도 같이 만들어지는데

입구의 포트 번호는 8080,

context path는 / 이다.

 

SpringApplication.run 메서드가 이미 적혀있다.

클래스.메서드 이니까 run 메서드는 static이다.

 

run 메서드에 Ctrl + 클릭을 하여

구조를 확인해보니

ConfigurableApplicationContext 타입을 리턴해준다.

context를 리턴한다는 말은

이 성에 대한 모든 문맥을 리턴한다는 말이다.

 

클라이언트의 request가 왔을 때

입구를 통해 들어오면

이제 어디로 가야할지

웹 서버의 설정 프로그램을 만들어 줘야 한다.

 

요청이 들어오면 가장 먼저 받는 파일이

DispatcherServlet이다.

 

우리가 프로젝트를 만들며 설정했던 라이브러리의

Spring Web이 이 디스패쳐 서블릿을 자동으로 만들어준다.

 

우리는 프론트 컨트롤러를 만들어주자.

 

컨트롤러를 만들 때 패키지를 따로 만들지 않고

파일을 만들어준다.

 


 

스프링이 만들어준 디스패쳐 서블릿에서

내가 어떤 컨트롤러를 만들 줄 알고 나눠줄까?

 

어노테이션을 달아주자.

package site.metacoding.first;

import org.springframework.web.bind.annotation.RestController;

@RestController // 성을 만들면서 컴포넌트 스캔을 한다.
// UserController u = new UserController(); 와 같다.
public class UserController {

    public void home() {

    }
}

성을 만들면서 만든 자바 파일들을

리플렉션 기법을 통해 분석한다.

 

이때 붙어있는 어노테이션을 보고

이 컨트롤러를 new 해준다.

실행 시에 new 되는 것이다!!

 

이때 찾아내는 행위를

컴포넌트 스캔이라고 한다.

 

컴포넌트 스캔의 대상은 누구일까?

내가 적은 site.metacoding.first

패키지 이하 파일들이 대상이 된다.

내 프로젝트 폴더 이하인 것이다.

 

first 밖으로 파일을 만들면

스캔을 하지 않기 때문에 만들지 말자.

 

리플렉션은 필드, 파라미터, 메서드 등

어노테이션만 분석하는 게 아니다.

스캔해서 메모리에 띄워주는 어노테이션은

5개밖에 없다.

이 중 하나가 @RestController이다.

차근차근 배워보자.

 

이 어노테이션을 찾으면

그 컨트롤러를 new 하고

메모리에 뜬 컨트롤러의 주소만 보관하는

컨테이너에 주소가 저장된다.

 

내가 new 한게 아닌 스프링이 new한 것을

보관하는 컨테이너를

IoC(Inversion of Control; 제어의 역전) 컨테이너라고 한다.

 

이제 디스패쳐 서블릿이 보낼 수 있는

메서드를 만들어주면 된다.

package site.metacoding.first;

import org.springframework.web.bind.annotation.RestController;

@RestController // 성을 만들면서 컴포넌트 스캔을 한다.
// UserController u = new UserController(); 와 같다.
public class UserController {

    public UserController() {
        // 진짜 마법처럼 new 되는지 확인
        System.out.println("UserController 생성자 실행됨");
    }

    public void home() {
        System.out.println("home~~~~~~~~~~");
    }

    public void bye() {
        System.out.println("bye~~~~~~~~~~~");
    }
}

 

이제 요청을 할 때는 이렇게 한다.

 

http://localhost:8000/까지 오면

/가 어딘지 모르기 때문에 welcome 파일로 간다.

우리는 index 파일을 만들지 않았기 때문에

DS는 어디로 가야 할지 당황하게 된다.

어디로 가야 할지는 모르지만

UserController가 메모리에 new 된 것은 확인할 수 있다.

 


이제 우리는 /home 요청이 오면 home 메서드,

/bye 요청이 오면 bye 메서드를 때리고 싶은데

디스패쳐 서블릿을 건드릴 수 없기 때문에

어노테이션을 붙여준다.

 

실행 시에 어노테이션을 분석하여

메서드를 때려주는 것이다.

package site.metacoding.first;

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

@RestController // 성을 만들면서 컴포넌트 스캔을 한다.
// UserController u = new UserController(); 와 같다.
public class UserController {

    public UserController() {
        // 진짜 마법처럼 new 되는지 확인
        System.out.println("UserController 생성자 실행됨");
    }

    @GetMapping("/home")
    public void home() {
        System.out.println("home~~~~~~~~~~");
    }

    @GetMapping("/bye")
    public void bye() {
        System.out.println("bye~~~~~~~~~~~");
    }
}

 

 

 

 

[출처]

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com


메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

 

반응형