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