Spring paging

์ด๋™์–ธยท2024๋…„ 8์›” 30์ผ

new world

๋ชฉ๋ก ๋ณด๊ธฐ
36/62
post-thumbnail

8.30(๊ธˆ)

1. viewResolver

    <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๊ฐ€ ๋˜๋Š”๊ฒƒ.




2. redirect

ํ•˜์ง€๋งŒ, 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๋กœ ์ž๋™์ด๋™๋œ๋‹ค.




3. addFlashAttribute / getAttribute

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";
	}

}

list.jsp

<%@ 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

๐Ÿ‘‰ addAttribute() - ์ฃผ์†Œ์ฐฝ์— ์ ํž˜(์ฟผ๋ฆฌ์ŠคํŠธ๋ง์œผ๋กœ ๋ณ€ํ™˜), ํ•œ๊ธ€์ด๋‚˜ URL์ธ์ฝ”๋”ฉ ์ž๋™์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•ด.




4. Model

TodoController.java

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ํ™”๋ฉด์œผ๋กœ ์ด๋™
	}

}

TodoMapper.java

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์„ ์‚ฌ์šฉํ•  ๋ฉ”์„œ๋“œ๋งŒ ์ •์˜

Todo.java

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์˜ ์š”์†Œ๋“ค์„ ๊ทธ๋Œ€๋กœ ์ž‘์„ฑ

TodoMapper.xml

<?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๋ฌธ์ธ ์—ฌ๊ธฐ์„œ ์ž‘์„ฑ

list.jsp

<%@ 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๋กœ ์ถœ๋ ฅ




5. bean์— ์ •์˜๋˜๊ณ  ๋“ฑ๋ก๋˜์–ด ์‚ฌ์šฉ๋˜๋Š” ๊ณผ์ •

5-1. root-context.xml

 <context:component-scan base-package="org.room4.w2.service;"></context:component-scan>

๐Ÿ‘‰ org.room4.w2.service๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์Šค์บ”

5-2. Service.java

@Service
public class HelloService {
}

๐Ÿ‘‰ Service ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ๋นˆ์œผ๋กœ ๋“ฑ๋ก, @component๋“ฑ ๋‹ค์–‘ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š”๋ฐ ํ•ด๋‹น๋˜์–ด์žˆ๋Š” ํด๋ž˜์Šค๋Š” ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋จ

5-3. Test.java

@Autowired
private HelloService helloService;

๐Ÿ‘‰ Autowired๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…๋˜์–ด bean๊ฐ์ฒด(HelloService)๋ฅผ ์ฃผ์ž…ํ•ด์ค€๋‹ค.

๐Ÿ“Œ์—ฌ๊ธฐ์„œ ์ฃผ์ž…ํ•ด์ค€๋‹ค๋Š”๊ฒƒ์€, ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š”๊ฒƒ.




6. paging

6-1. PageRequest.java

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ํŒจํ‚ค์ง€ ๋ฐ‘์— ๊ตฌํ˜„ํ•œ๋‹ค.

6-2. TodoMapper.java

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 ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ž๋ฆฌ์— ๋„ฃ๋Š”๋‹ค.

6-3. TodoController.java

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๋ฅผ ๋„ฃ๋Š”๋‹ค.




7. mybatis ๊ฒฝ๋กœ์„ค์ •

7-1. root-context.xml

<property name="configLocation" value="classpath:mybatis-config.xml"/> <!-- mybatis ๊ฒฝ๋กœ ์„ค์ • -->

๐Ÿ‘‰ ํ•ด๋‹น์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด๋‘๊ณ 

7-2. mybatis-config.xml

  • mapper ํด๋” ๋ฐ‘์— ์ƒ์„ฑ
<?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>

7-3. TodoMapper.xml

<?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๋งŒ ์„ค์ •ํ•ด์ค˜๋„ ์ƒ๊ด€์—†์Œ.

0๊ฐœ์˜ ๋Œ“๊ธ€