글 쓰기 페이지,
글 상세보기 페이지,
글 목록 페이지를 만들어보자.
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
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9