스프링의 동작 원리를 정리해보자.
클라이언트가 CRUD 요청(request)이 들어오면
첫 번째로 클라이언트의 request 메모리 영역이 생긴다.
이 영역에는 홍길동의 요청에 대한 정보가 다 들어있다.
web.xml 파일을 바탕으로
이 request 공간을 검열한다.
성공적으로 검열이 끝나면
문지기가 문을 열어주어
8080 포트를 지나, 컨텍스트 패스를 거쳐
디스패쳐 서블릿으로 간다.
디폴트 컨텍스트 패스는 / 슬래시이다.
스프링은 URL 요청이 없다.
모든 요청은 컨텍스트 패스(/)를 지나
디스패쳐 서블릿으로 모이기 때문이다.
따라서 URI 요청만 한다.
디스패쳐 서블릿에서 주소 뒤 도메인을 파싱 해
알맞은 컨트롤러로 보내준다.
컨트롤러에 @Controller, @RestController, @Component가 붙어있으면
new 되어 IoC 컨테이너에 저장된다.
더 정확히 말하면 main이 시작될 때
내 프로젝트 폴더(third) 이하로 컴포넌트 스캔하여
어노테이션 붙은 애들을 IoC 컨테이너에 저장한다.
그리고 컨트롤러에서 return 해주는 순간(응답)
홍길동의 request 영역은 사라지게 된다.
@Controller는 파일을 리턴하는 컨트롤러를 말한다.
이때 리턴 값으로 파일 경로를 지정해줬었는데
어떻게 이 파일로 찾아가는 것일까?
기본적으로 View Resolver가 설정되어 있기 때문이다.
이 View Resolver는 mustache 라이브러리를 gradle에 등록할 때 설정된다.
View Resolver에는 prefix와 suffix를 설정하는데
prefix에는 파일의 경로, suffix에는 파일의 확장자를 설정한다.
/resources/templates/{리턴값}.mustache의 형식인 것이다.
ThirdApplication.java 서버 실행시키기
package site.metacoding.third;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ThirdApplication {
// main 실행시에 Spring 성이 만들어진다.
public static void main(String[] args) {
SpringApplication.run(ThirdApplication.class, args);
}
}
컨트롤러 만들어주자!
package site.metacoding.third;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller // 파일을 리턴하는 컨트롤러
public class PostController {
@GetMapping("/post/writeForm")
public String writeForm() {
// /resources/templates/{리턴값}.mustache 뷰 리졸버 설정
return "post/writeForm"; // 파일경로(ViewResolver 설정 - mustache 라이브러리 다운로드 시)
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>글쓰기 페이지입니다.</h1>
<hr />
<!--여러가지 데이터를 한방에 보내고 싶을 때 form 태그로 감싸서 보냄-->
<form action="/post" method="post">
<input type="text" name="title" placeholder="enter title"/>
<input type="text" name="content" placeholder="enter content"/>
<button type="submit">글쓰기 완료</button>
</form>
</body>
</html>
아직 post 요청을 받는 메서드를 만들지 않아서
글쓰기 완료 버튼을 누르면 오류창이 뜬다.
이때 브라우저에서 F12를 누르고 Network -> Payload 창을 확인해보자.
내가 입력한 데이터가 다 남아있다!
https가 아닌 홈페이지에서
개인정보 남기지 말자 ㅜㅜ
이제 post 요청받은 데이터를 받아보자.
package site.metacoding.third;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller // 파일을 리턴하는 컨트롤러
public class PostController {
@GetMapping("/post/writeForm")
public String writeForm() {
// /resources/templates/{리턴값}.mustache 뷰 리졸버 설정
return "post/writeForm"; // 파일경로(ViewResolver 설정 - mustache 라이브러리 다운로드 시)
}
// POST 메서드로 요청 -> http://localhost:8080/post
// title=제목1&content=내용1 -> x-www-form-urlencoded 타입!
// 스프링 기본 파싱 전략 -> x-www-form-urlencoded만 파싱
@PostMapping("/post")
public String write(String title, String content, Model model) {
// 1. title, content DB에 INSERT하기
System.out.println("title : " + title);
System.out.println("content : " + content);
// 2. 데이터 담아가기
model.addAttribute("title", title);
// 3. 글 목록 페이지로 이동
return "post/list";
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>글 목록 페이지입니다.</h1>
<hr />
{{title}}
</body>
</html>
[출처]
https://cafe.naver.com/metacoding
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9