
지쿠 따라하기
java 폴더 안에 web과 service를 만든다.

web 안에 GreetingController.java,
service 안에 GreetingService.java 을 만든다.

/* src/main/java/web/GreetingController.java */
package web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import service.GreetingService;
@RestController
public class GreetingController {
String result;
@GetMapping("/greeting")
public String greeting() {
result = GreetingService.greeting();
return result;
}
}
/* src/main/java/service/GreetingService.java */
package service;
public class GreetingService {
public static String greeting() {
return "<h1>핫도그 세개 주세요</h1>";
}
}
/* src/main/java/hello/hellospring/HelloSpringApplication.java */
package hello.hellospring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages = {"web"}) // <- 이 줄 추가
public class HelloSpringApplication {
public static void main(String[] args) {
SpringApplication.run(HelloSpringApplication.class, args);
}
}
이러고 실행해서 localhost:8080/greeting 으로 들어가면

이렇게 뜬다.
코드를 하나하나 뜯어보기 전에 스프링의 처리 과정을 보자

- 클라이언트가 웹서비스에 요청을 보낸다.
- Dispatcher Servlet이 요청에 매핑되는 Handler를 찾는다.
- Controller가 요청을 처리하고 view를 Dispathcher Servlet에게 전달한다.
- 사용자에게 응답을 보낸다.
컨트롤러가 될 자바 클래스 위에 @Controller라는 어노테이션을 적어주면, 스프링이 이놈이 컨트롤러구나~ 하고 알아서 작업해준다.
@Controller : view를 반환@RestController : 객체 자체를 반환할 때 사용됨localhost:8080/example 요청이 들어오면 아래 함수를 실행하라는 뜻이다.

greeting() 함수에서는 GreetingService의 greeting() 함수를 반환하고 있는데, 얘 코드를 보면

<h1> 태그로 감싸진 핫도그 세개 주세요 라는 문자열을 반환하고 있다.
원래 컨트롤러가
ex. hello라는 문자열을 반환하면 스프링이 자동으로src/main/resources/templates에서ex. hello라는 이름을 가진 view를 찾아서 반환해준다.
그런데 지금은 위에 어노테이션을 @RestController를 붙였기 때문에 문자열을 객체 자체 그대로 반환하고, 따라서 실행해보면 그 문자열이 그대로 화면에 뜬다.
컨트롤러가 view를 반환하도록 하려면 일단 컨트롤러 위의 어노테이션을 @Controller로 바꿔주고

src/main/resources/templates에 greeting.html을 만들어주고

Service단에서 반환값을 view 이름으로 바꿔준다.

장고에서는 view를 따로 작성해야 했어서 좀 헷갈렸는데 스프링에서는 굳이 따로 안써줘도 파일명 자체로 장고에서 렌더링하는 view 함수가 완성되는 것 같다.
그리고 실행해보면

greeting.html이 잘 뜬다.
모든 내용을 Controller에서 다 써도 되지만 Service로 분할해서 코드를 작성했다. 컨트롤러에서는 매핑만 하고, 실질적인 요청 처리 함수는 Service에 몰아넣어서 코드를 정리한다.

@ComponentScan: @component 어노테이션 및 @Service, @Repository, @Controller 등의 어노테이션을 스캔하여 Bean으로 등록해주는 어노테이션
위에서 아무리 잘 연결을 해줘도 @ComponentScan를 안쓰면

이런 에러가 뜨는데, 경로를 제대로 주지 않아서 뜨는 에러라고 한다.

@ComponentScan("패키지 경로")
== @ComponentScan(basePackages = {"패키지 경로"})
: 해당 패키지에 있는 @Controller, @Service, @Repogitory, @Component 객체들이 DI 컨테이너에 등록된다. 해당 경로를 포함하는 하위 패키지를 모두 스캔한다.
따라서 여기서는 대충 web 패키지에 있는 컨트롤러를 등록한다는 의미가 되겠다.
2022.10.17 <이후에 인프런 강의 듣고 나서 수정>
패키지 위치를 처음부터src/main/java/hello/hellospring안에다 만들면 따로@ComponentScan을 써주지 않아도 된다. (오히려 쓰면 에러남)
[Spring] vscode로 Spring 시작하기 이제 maven을 곁들인,,
[spring] @Controller와 @GetMapping