[Spring] Controller와 Service

김재연·2022년 10월 11일
0

Spring Boot 공부

목록 보기
2/9
post-thumbnail

지쿠 따라하기

코드 및 파일구조

java 폴더 안에 webservice를 만든다.

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 으로 들어가면

이렇게 뜬다.


코드를 하나하나 뜯어보기 전에 스프링의 처리 과정을 보자

Spring의 요청 처리 과정

  1. 클라이언트가 웹서비스에 요청을 보낸다.
  2. Dispatcher Servlet이 요청에 매핑되는 Handler를 찾는다.
  3. Controller가 요청을 처리하고 view를 Dispathcher Servlet에게 전달한다.
  4. 사용자에게 응답을 보낸다.

Controller

@Controller

컨트롤러가 될 자바 클래스 위에 @Controller라는 어노테이션을 적어주면, 스프링이 이놈이 컨트롤러구나~ 하고 알아서 작업해준다.

  • @Controller : view를 반환
  • @RestController : 객체 자체를 반환할 때 사용됨

@GetMapping("/example")

localhost:8080/example 요청이 들어오면 아래 함수를 실행하라는 뜻이다.


반환값 (객체/view)

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

<h1> 태그로 감싸진 핫도그 세개 주세요 라는 문자열을 반환하고 있다.

원래 컨트롤러가 ex. hello라는 문자열을 반환하면 스프링이 자동으로 src/main/resources/templates에서 ex. hello라는 이름을 가진 view를 찾아서 반환해준다.

그런데 지금은 위에 어노테이션을 @RestController를 붙였기 때문에 문자열을 객체 자체 그대로 반환하고, 따라서 실행해보면 그 문자열이 그대로 화면에 뜬다.

컨트롤러가 view를 반환하도록 하려면 일단 컨트롤러 위의 어노테이션을 @Controller로 바꿔주고

src/main/resources/templatesgreeting.html을 만들어주고

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

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

그리고 실행해보면

greeting.html이 잘 뜬다.


Service

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


Application.java

@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을 써주지 않아도 된다. (오히려 쓰면 에러남)


Reference

[Spring] vscode로 Spring 시작하기 이제 maven을 곁들인,,
[spring] @Controller와 @GetMapping

profile
일기장같은 공부기록📝

0개의 댓글