Loading...

Spring / / 2022. 3. 1. 13:51

스프링 13강. mustache 문법

반응형

 

글 쓰기 페이지,

글 상세보기 페이지,

글 목록 페이지를 만들어보자.

 

Post 컨트롤러를 만들어준다.

 

@Controller가 붙어있는 것을 보니

파일을 리턴해주는 컨트롤러이다.

package site.metacoding.second.web;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import site.metacoding.second.domain.Post;

// View (글쓰기 페이지, 글 상세보기 페이지, 글 목록 페이지)
@Controller
public class PostController {

    @GetMapping("/post/writeForm")
    public String writeForm() {
        return "post/writeForm";
    }

    @GetMapping("/post/detail")
    public String detail(Model model) {

        // 1. DB에 연결해서 SELECT 해야함
        // 2. ResultSet을 JavaObject로 변경
        // 3. request에 담기
       
       return "post/detail";
    }
    
    @GetMapping("/post/list")
    public String list(Model model) {
        return "post/list";
    }
}

 

데이터베이스에서 가져올 데이터를

자바 오브젝트로 만들어주기 위한

모델을 만들어준다.

package site.metacoding.second.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

// 모델
@AllArgsConstructor
@Getter
@Setter
public class Post {
    private int id;
    private String title;
    private String content;
}

 

 

(1) 글 쓰기 페이지

@GetMapping("/post/writeForm")
public String writeForm() {
    return "post/writeForm";
}
<!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>
    <h3>title=제목1&content=내용1 -> x-www-form-urlencoded</h3>
    <hr/>
    <form method="post" action="/post">
        <input type="text" name="title" placeholder="Enter Title" /> <br />
        <textarea name="titleContent" cols="30" rows="10"></textarea> <br />
        <button type="submit">글 쓰기 완료</button>
    </form>
</body>
</html>

 

(2) 글 상세보기 페이지

@GetMapping("/post/detail")
public String detail(Model model) {

    // 1. DB에 연결해서 SELECT 해야함
    // 2. ResultSet을 JavaObject로 변경
    Post post = new Post(1, "제목1", "내용1");

    // 3. request에 담기
    model.addAttribute("post", post); // 키, 밸류

    // return "redirect:/post/detail"; sendRedirect 하고싶을 때
    return "post/detail"; // 스프링 리턴전략 : RequestDispatcher로 forward함 => request 복제
}

데이터베이스에 연결하지 않고,

직접 객체를 만들어주어

디비에서 가져온것처럼 연습해보자.

 

<!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 : {{post.title}} / content : {{post.content}}
</body>
</html>

mustache는 중괄호 두 개 {{  }} 안에 있는 코드를

자바 코드로 해석한다.

 

jsp에서 <% %>와 같다.

 

setAttribute 안 해도 request를 가지고 온다.

 

근데 title은 모델에 private으로 만들었기 때문에

외부에서 호출할 수 없는데

어떻게 post.title이라고 사용할 수 있을까?

 

내부적으로 getTitle을 때리는 것이다.

 

 

(3) 글 목록 페이지

@GetMapping("/post/list")
public String list(Model model) {

    List<Post> posts = new ArrayList<>();

    // 1. DB에 연결해서 SELECT 해야함
    // 2. ResultSet을 JavaObject로 변경
    Post post1 = new Post(1, "제목1", "내용1");
    Post post2 = new Post(2, "제목2", "내용2");
    Post post3 = new Post(3, "제목3", "내용3");
    Post post4 = new Post(4, "제목4", "내용4");
    Post post5 = new Post(5, "제목5", "내용5");

    posts.add(post1);
    posts.add(post2);
    posts.add(post3);
    posts.add(post4);
    posts.add(post5);

    // 3. model(request)에 담기
    model.addAttribute("posts", posts); // 키, 밸류

    return "post/list";
}

 

스프링에서는 request가 아닌 모델에 담아서 보내야 한다. 규칙!

request를 덮어 씌워서 유지하는 객체이다.

 

<!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/>
    <!--posts 컬렉션 크기만큼 반복, 자바의 for-each와 같다-->
    {{#posts}}
        id : {{id}} / title : {{title}} / content : {{content}} <br/>
    {{/posts}}
</body>
</html>

 

mustache에서 반복문을 돌리기 위해

위와 같이 사용한다.

 

{{#리스트}} {{/리스트}}

#을 걸어주면 리스트의 크기만큼 반복해준다.

 

자바의 for-each 반복문과 같은 것이다.

 

반복문 안에서는 변수를

참조 없이 사용 가능하다.

 

mustache가 아닌 jsp로 만들었다면

아래와 같은 코드가 나온다.

 

엄청 불편해보인다 ㅋㅋ

<!-- jsp 였다면 -->
<%
   List<Post> posts = (List<Post>) request.getAttribute("posts");
%>

<% for(int i=0; i<posts.size(); i++) { %>
      id : <%=posts.get(i).getId() %> title : <%=posts.get(i).getTitle() %> content : <%=posts.get(i).getContent() %>
<% } %>

 

 

 

 


package site.metacoding.second.web;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import site.metacoding.second.domain.Post;

// View (글쓰기 페이지, 글 목록 페이지, 글 상세보기 페이지)
@Controller
public class PostController {

    @GetMapping("/post/writeForm")
    public String writeForm() {
        // System.out.println("writeForm 호출");
        return "post/writeForm";
    }

    @GetMapping("/post/detail")
    public String detail(Model model) {

        // 1. DB에 연결해서 SELECT 해야함
        // 2. ResultSet을 JavaObject로 변경
        Post post = new Post(1, "제목1", "내용1");

        // 3. request에 담기
        model.addAttribute("post", post); // 키, 밸류

        // return "redirect:/post/detail"; sendRedirect 하고싶을 때
        return "post/detail"; // 스프링 리턴전략 : RequestDispatcher로 forward함 => request 복제
    }
    
    @GetMapping("/post/list")
    public String list(Model model) {

        List<Post> posts = new ArrayList<>();

        // 1. DB에 연결해서 SELECT 해야함
        // 2. ResultSet을 JavaObject로 변경
        Post post1 = new Post(1, "제목1", "내용1");
        Post post2 = new Post(2, "제목2", "내용2");
        Post post3 = new Post(3, "제목3", "내용3");
        Post post4 = new Post(4, "제목4", "내용4");
        Post post5 = new Post(5, "제목5", "내용5");

        posts.add(post1);
        posts.add(post2);
        posts.add(post3);
        posts.add(post4);
        posts.add(post5);

        // 3. model(request)에 담기
        model.addAttribute("posts", posts); // 키, 밸류

        return "post/list";
    }

}

 

 

[출처]

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

 

 

반응형