지쿠 따라하기
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