
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
๐ viewํ์ผ์ ์ด๋ป๊ฒ ์ฝ์๊ฒ์ธ๊ฐ์ ๋ํ ์ฝ๋
๐ controller์์ getMapping์ ์ฝ๋๊ฐ "/hello" ์ด๊ณ , ํด๋น๋๋ ๋ฉ์๋๊ฐ public void์ผ๋๋,
property์ ์ฒซ๋ฒ์งธ ๋ค์ ๋ถ๊ฒ๋๋ค. ๊ณ ๋ก /WEB-INF/views/hello.jsp๊ฐ ๋๋๊ฒ.
ํ์ง๋ง, void๊ฐ ์๋ string์ผ๋ก ๋ฉ์๋๋ฅผ ์ ์ธํ๊ฒ ๋๋ค๋ฉด return๊ฐ์ผ๋ก redirect๋ฅผ ์ ์ธํ ์ ์๋ค.
package org.room4.w2.controller;
import org.room4.w2.vo.Todo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import lombok.extern.log4j.Log4j2;
@Controller
@RequestMapping("/todo") //todo๋ก ์์๋๋ ์ ๋ค์ ์๋ฅผ ๊ฑฐ์ณ๊ฐ๋ค (์ฒซ๋ฒ์งธ ๋์ค)
@Log4j2
public class TodoController {
@GetMapping("list")
public void list() {
log.info("/todo/list");
}
@GetMapping("register")
public void register() {
log.info("/todo/register");
}
@PostMapping("register")
public String registerPost(Todo todo) { //String์ผ๋ก ์ ์ธ
log.info(todo);
return "redirect:/todo/list"; // ๋ฑ๋ก์ดํ ์ด๋๋ก ์ด๋ํ ์ง ์ ํ ๊ฐ๋ฅ
}
}
๐ todo register์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๊ณ ๋ฒํผ์ ๋๋ฌ post๋ก ์ด๋ํ๊ฒ ๋๋ฉด redirect๋ฅผ ํตํด todo list๋ก ์๋์ด๋๋๋ค.
package org.room4.w2.controller;
@Controller
@RequestMapping("/todo") //todo๋ก ์์๋๋ ์ ๋ค์ ์๋ฅผ ๊ฑฐ์ณ๊ฐ๋ค (์ฒซ๋ฒ์งธ ๋์ค)
@Log4j2
public class TodoController {
@GetMapping("list")
public void list() {
log.info("/todo/list");
}
@GetMapping("register")
public void register() {
log.info("/todo/register");
}
@PostMapping("register")
public String registerPost(Todo todo, RedirectAttributes rttr) {
log.info(todo);
// register์์ post๊ฐ ์คํ(jsp์์ add๋ฒํผ์ ๋๋ฅด๋ฉด)
rttr.addFlashAttribute("mno",432); // ํด๋น ์ฝ๋๊ฐ ์คํ์ด ๋๋ฉฐ mno์ 432๋ผ๋ ๊ฐ์ด ๊ธฐ๋ก๋๋ค.
return "redirect:/todo/list";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>list page</h1>
//redirect๋ฅผ ํตํด listํ์ด์ง์ ์ค๊ฒ๋๋ฉด
<script>
const result = '${mno}' //mno=432๋ผ๋ ๊ฐ์ ๊ฐ์ง๊ณ ์์๊ธฐ ๋๋ฌธ์
if(result){ //ํด๋น ์ฝ๋๊ฐ ์คํ๋๋ค.
alert("aa")
}
</script>
</body>
</html>
๐ addFlashAttribute๋ 1ํ์ฉ ๋ฐ์ดํฐ, ์ฃผ์์ฐฝ์ ์ ๋ํ๋จ, session์ ์ ์ฅ๋์๋ค๊ฐ ์๋ฉธ๋๋ค.
๐ addAttribute() - ์ฃผ์์ฐฝ์ ์ ํ(์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก ๋ณํ), ํ๊ธ์ด๋ URL์ธ์ฝ๋ฉ ์๋์ผ๋ก ์ฌ์ฉํ๊ธฐ์ํด.
package org.room4.w2.controller;
@Controller
@RequestMapping("/todo") //todo๋ก ์์๋๋ ์ ๋ค์ ์๋ฅผ ๊ฑฐ์ณ๊ฐ๋ค (์ฒซ๋ฒ์งธ ๋์ค)
@Log4j2
@RequiredArgsConstructor // private final๊ณผ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ํด์ ํ์ํจ
public class TodoController {
private final TodoMapper todoMapper; // TodoMapper ์ธํฐํ์ด์ค์ ์ฝ๋๋ฅผ(getList)๋ฅผ ๊ฐ์ ธ์ด
@GetMapping("list") // ์ฃผ์์ฐฝ์๋ http://localhost:8080/todo/list ๋ผ๊ณ ๋ค์ด๊ฐ๋ค
public void list(Model model) { //model์ ์ปจํธ๋กค๋ฌ์ view๋ฅผ ์ด์ด์ฃผ๋ ์ญํ
model.addAttribute("list", todoMapper.getList());
// list๋ผ๋ ์ด๋ฆ์ผ๋ก view์์ getList์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค.
}
@GetMapping("register") //register์ get
public void register() {
log.info("/todo/register");
}
@PostMapping("register") // register์ post
public String registerPost(Todo todo, RedirectAttributes rttr) {
log.info(todo);
rttr.addFlashAttribute("mno",432); // register์์ post๊ฐ ์คํ๋๋ฉด mno=432๋ผ๊ณ ์ผํ์ฉ์ผ๋ก ๋ด๊ธด๋ค
return "redirect:/todo/list"; // post๊ฐ ๋๋ฉด ์๋์ผ๋ก listํ๋ฉด์ผ๋ก ์ด๋
}
}
package org.room4.w2.mappers;
import org.room4.w2.vo.Todo;
public interface TodoMapper {
java.util.List<Todo> getList();
}
๐ ์๋ Mapper.java์์ sql๋ฌธ์ ์์ด ์ฌ์ฉํด๋ ๋์ง๋ง, ๊ทธ๋ฌํ ์๋๊ฒ์ ๋ง๊ธฐ ์ํด์ xmlํ์ผ์ ์ถ๊ฐ๋ก ๋ง๋ค์ด sql๊ณผ java๋ฅผ ๋ถ๋ฆฌํ๋ค.
๐ mapper์์๋ sql์ ์ฌ์ฉํ ๋ฉ์๋๋ง ์ ์
package org.room4.w2.vo;
import lombok.Data;
@Data
public class Todo {
private Long mno;
private String title;
private String dueDate;
private String writer;
}
๐ db table์ ์์๋ค์ ๊ทธ๋๋ก ์์ฑ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--dtd์ ์ญํ ์ ์๋์์ฑ-->
<mapper namespace="org.room4.w2.mappers.TodoMapper"> <!-- ์ธํฐํ์ด์ค์ ๊ฒฝ๋ก๋ฅผ ๋๊ฐ์ดํ๊ณ ์ธํฐํ์ด์ค ์ด๋ฆ ๋๊ฐ์ด -->
<select id="getList" resultType="org.room4.w2.vo.Todo"> <!-- ์ธํฐํ์ด์ค ๋ฉ์๋์ด๋ฆ ์ ๊ณ , ํด๋น ๋ฉ์๋์ ํ์
์ ์ ๋, ์๋ฌธ์๋ก -->
SELECT mno,due_date dueDate, title, writer FROM tbl_todos order by mno desc
</select>
</mapper>
๐ mapper.java์์ ์์ฑ๋์ด์ผํ sql๋ฌธ์ xml๋ฌธ์ธ ์ฌ๊ธฐ์ ์์ฑ
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>list page</h1>
${list}
<script>
const result = '${mno}'
if(result){
alert("aa")
}
</script>
</body>
</html>
๐ ์ปจํธ๋กค๋ฌ์์ addAttribute๋ก ๋ณด๋ด์ค list๋ฅผ ์ฌ๊ธฐ์ ์ฌ์ฉ๊ฐ๋ฅ
๐ TodoMapper.java์์ getList ๋ฉ์๋๋ฅผ ์ ์ธํ๊ณ , voํจํค์ง์์ Todo.java๋ฅผ ํตํด db์ ๋ด์ฉ์ ๊ทธ๋๋ก ์์ฑ, ์ดํ์ TodoMapper.xml์์ TodoMapper.java์์ ์ ์ธํ ๋ฉ์๋์ ๊ฐ์ sql๋ฌธ์ ์ ์ธ TodoController.java์์ ํด๋น sql๋ฉ์๋๋ฅผ ๊ฐ์ ธ์์ view์ ๋ฟ๋ฆด์์๋๋ก model๊ฐ์ฒด์ addAttribute๋ฅผ ํตํด ๋ด์, ์ดํ์ list.jsp๋ก ์ถ๋ ฅ
<context:component-scan base-package="org.room4.w2.service;"></context:component-scan>
๐ org.room4.w2.service๋ด๋ถ ํด๋์ค๋ฅผ ์ค์บ
@Service
public class HelloService {
}
๐ Service ์ด๋ ธํ ์ด์ ์ ํตํด ํด๋น ํด๋์ค๊ฐ ๋น์ผ๋ก ๋ฑ๋ก, @component๋ฑ ๋ค์ํ ์ด๋ ธํ ์ด์ ์ด ์๋๋ฐ ํด๋น๋์ด์๋ ํด๋์ค๋ ๋น์ผ๋ก ๋ฑ๋ก๋จ
@Autowired
private HelloService helloService;
๐ Autowired๋ผ๋ ์ด๋ ธํ ์ด์ ์ ํตํด ์๋์ผ๋ก ์์กด์ฑ ์ฃผ์ ๋์ด bean๊ฐ์ฒด(HelloService)๋ฅผ ์ฃผ์ ํด์ค๋ค.
๐์ฌ๊ธฐ์ ์ฃผ์ ํด์ค๋ค๋๊ฒ์, ์ฌ์ฉ์๊ฐ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ ํ์๊ฐ ์๋ค๋๊ฒ.
package org.room4.w2.vo;
import lombok.Getter;
import lombok.ToString;
@Getter
@ToString
public class PageRequest {
private int page=1;
private int size=10;
public void setPage(int page) {
this.page = page <= 0 ? 1 : page;
}
public void setSize(int size) {
this.size = size <= 10 ? 10 : size >= 100 ? 100 : size;
}
public int getSkip() {
return (this.page - 1) *10; //1ํ์ด์ง๋ 0๊ฐ์ด๊ณ , 2ํ์ด์ง๋ 10๊ฐ๋ฅผ ๊ฑด๋๋์ด์ผํ๋ฏ๋ก
// ์ด์ฝ๋๊ฐ ํ์ํ ์ด์ ๋ limit์์๋ ์์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฉ์๋๊ฐ ํ์ํ๋ค.
}
}
๐ ํ์ด์ง๋ฅผ ๊ตฌํํ๊ธฐ์ํด voํจํค์ง ๋ฐ์ ๊ตฌํํ๋ค.
package org.room4.w2.mappers;
import org.room4.w2.vo.PageRequest;
import org.room4.w2.vo.Todo;
public interface TodoMapper {
java.util.List<Todo> getList(PageRequest pageRequest);
}
๐ PageRequest pageRequest๋ฅผ getList ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ์๋ฆฌ์ ๋ฃ๋๋ค.
package org.room4.w2.controller;
@Controller
@RequestMapping("/todo") //todo๋ก ์์๋๋ ์ ๋ค์ ์๋ฅผ ๊ฑฐ์ณ๊ฐ๋ค (์ฒซ๋ฒ์งธ ๋์ค)
@Log4j2
@RequiredArgsConstructor
public class TodoController {
private final TodoMapper todoMapper;
@GetMapping("list")
public void list(PageRequest pageRequest, Model model) {
model.addAttribute("list", todoMapper.getList(pageRequest));
}
@GetMapping("register")
public void register() {
log.info("/todo/register");
}
@PostMapping("register")
public String registerPost(Todo todo, RedirectAttributes rttr) {
log.info(todo);
rttr.addFlashAttribute("mno",432);
return "redirect:/todo/list";
}
}
๐ list์ ํ๋ผ๋ฏธํฐ๊ฐ์ PageRequest๋ฅผ ๋ฃ๋๋ค.
<property name="configLocation" value="classpath:mybatis-config.xml"/> <!-- mybatis ๊ฒฝ๋ก ์ค์ -->
๐ ํด๋น์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ์ค์ ํด๋๊ณ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd"> <!--dtd์ ์ญํ ์ ์๋์์ฑ-->
<configuration>
<typeAliases>
<package name="org.room4.w2.vo"/> <!-- vo ๋ฐ์์๋ ํด๋์คํ์
์ ์ฌ์ฉํ๊ธฐ ํธํ๊ฒ -->
</typeAliases>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--dtd์ ์ญํ ์ ์๋์์ฑ-->
<mapper namespace="org.room4.w2.mappers.TodoMapper"> <!-- ์ธํฐํ์ด์ค์ ๊ฒฝ๋ก๋ฅผ ๋๊ฐ์ดํ๊ณ ์ธํฐํ์ด์ค ์ด๋ฆ ๋๊ฐ์ด -->
<select id="getList" resultType="Todo">
SELECT mno,due_date dueDate, title, writer
FROM
tbl_todos
order by mno desc
limit #{skip} , #{size}
</select>
</mapper>
๐ ํด๋น์ฝ๋ ์ฌ์ฉํ ๋ select id="getList" resultType="Todo" ์ฌ๊ธฐ์์ resultType์ ๊ฒฝ๋ก + Todo๋ฅผ ์ค์ ํด์ค์ผํ์ง๋ง, vo ์ด๋ฆ์ธ Todo๋ง ์ค์ ํด์ค๋ ์๊ด์์.