Loading...

Spring / / 2022. 3. 2. 11:05

스프링 15강. 스프링 작동 원리

반응형

스프링의 동작 원리를 정리해보자.

 

클라이언트가 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 창을 확인해보자.

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

 

메타코딩 : 네이버 카페

코린이들의 궁금증

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

 

 

반응형