spring boot

46일차 spring 화면 표기html, controller에서 data 받아오기, thymeleaf, rest controller, controller 차이점

비루블 2022. 8. 29. 13:00

요약정리

 

화면이 이동되는 것처럼 보이지만 전부 눌렀을때 주소를
엔터키 치는 것으로 이동되는 것임.(get)

 

여기 controller에서는 get과 post만 씀.중요중요중요중요중요중요중요중요중요중요중요

 

화면에 표기하려면 restcontroller가 되면 안되고 controller가 되야함
rest로 하면 return json으로 되기 때문

※ controller <-> restcontroller 차이점

https://mangkyu.tistory.com/49

 

어떻게 화면까지 표기하게 됬는지 원리 다시 보기

 

<memeber/join.html>

form으로 입력부분 감싸줌

목적 :안보이게끔해서 보내려고

+ member/join.do 의 post를 사용하는 구간이라고 알림.

 

 

<html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"></html>

위 코드 쓰는 이유? 이거의 문법을 쓰려고.(지금은 form으로 바로 method 쓰는 방식으로 씀)

같은 것 쓸 수 있음.

ex)

<form th:action="@{/member/join.do}" method="post">

form th:action="@{/member/join.do}"
이거 쓴 이유는 크롬 소스보기에서 보면
자동으로 /ROOT/member/join.do로 입력됨.
<form action="/ROOT/member/join.do" method="post"> <=이걸로 바뀜

자동으로 path가 변경되니 좋음.
 

controller에서 해당 html vue으로 정보를 줄때는 model을 사용함.
public 입력값에 Model model추가
model.addAttribute("blist", list);
위 코드로 값 전달(service에서 받아온 값을 list에 담아서 blist로 줌)

 

${#numbers.sequence(1, pages)}
이건 숫자 만들어주는 거인듯 1부터 pages까지

 

오전 

restcontroller // rest full => vue

controller => restcontroller
기존 controller 전부 restcontroller로 변경

boot20220827.java에 다시 restcontroller 포함(이름 다 바꿧기 때문)

controller의 rest파일들 파일명 전부 Rest붙여줌(처음 만들때부터 rest붙여주고 만들었어야하는뎅 이제 붙여줌)
(앱 작동이 안되서)

 

폴더생성


controller
@controller

pom 라이브러리 추가(springframework의 thymeleaf를 사용하기 위해서)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>


화면은 리소스안에
templates안에 html로 집어넣음



resource> application.properties ( 프로젝트 내의 templates 연결 )

#refresh 안되는 사람은 이거함.(새로고침해도 잘 안될때)
spring.thymeleaf.cache=false
#뷰의 위치
spring.thymeleaf.prefix=classpath:/templates/
#확장자를 뭘로 쓸거냐
spring.thymeleaf.suffix=.html


HomeController.java 작성

package com.example.controller;

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

@Controller
public class HomeController {
    

    // 127.0.0.1:8080/ROOT
    // 127.0.0.1:8080/ROOT/home
    // 127.0.0.1:8080/ROOT/home.do
    @GetMapping(value ={ "/", "/home", "home.do"})
    public String homeGet(){
        return "home"; // resources/templates/home.html
    }
}


home의 리턴값은? string형태의 "home"<=파일(html)
return "home"; // resources/templates/home.html

home주소를 부르면 home.html을 끌고와서 화면표기

그냥 controller는 그냥 바로 검색하자마자 나오는 페이지이기때문(get)

templates/home.html 만들어주기(base는 !쓰면 됨)

주소 127.0.0.1:8080/ROOT/home

a태그는 get으로 불러오는 것임.
주소에 엔터쳐서 들어오는것이랑 똑같기 떄문에 get임.

membercontroller.java
생성

package com.example.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.example.entity.Member;
import com.example.service.MemberService;

@Controller
@RequestMapping(value = "/member")
public class MemberController {
    
    @Autowired
    MemberService mService;

    

    // 127.0.0.1:8080/ROOT/member/join.do
    @GetMapping(value = "/join.do")
    public String joinGET(){
        return "member/join"; // join.html file
    }

    @PostMapping(value = "/join.do")
    public String joinPOST(@ModelAttribute Member member){
        
        // service호출해서 추가
        int ret = mService.insertMember(member);
        System.out.println(member.toString());
        if(ret < 1){
            
            return "redirect:/member/join.do";
        }
        // home으로 보내기 여기서 a태그는 어떻게 쓰냐(a태그 동작)
        return "redirect:/home.do";
    }

    //로그인
    @GetMapping(value = "/login.do")
    public String loginGET(){
        return "member/login"; // join.html file
    }

    @PostMapping(value = "/login.do")
    public String loginPOST(@ModelAttribute Member member){
        
        // service호출해서 추가
        int ret = mService.loginMember(member);
        System.out.println(member.toString());
        if(ret < 1){
            return "redirect:/member/join.do";
            // 스토리지에서 토큰이나 시큐리티 시스템 넣어야함.
        }
        // home으로 보내기 여기서 a태그는 어떻게 쓰냐(a태그 동작)
        return "redirect:/home.do";
    }
}



<member/join.html>

<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"></html>
<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>회원가입</title>
</head>
<body>
    <link href="../static/css/joincss.css" rel="stylesheet" />
    <div class="container">
        <h3>회원가입</h3>
        <hr />
        <form th:action="@{/member/join.do}" method="post">
            <!-- 주소창에 노출되지않게 -->
            <div>
                <label class="lbl">아이디</label> <!-- label에서 style이 안먹힘(인라인 형식) -->
                <input type="text" name="id" placeholder="아이디" autofocus/>
                <!-- <label id="idcheck">중복확인</label> -->
            </div>
            
            <div class="row"><!-- 비밀번호 -->
                <label class="lbl">암호</label>
                <input type="password" name="password" placeholder="암호"/>
            </div>
            
            <div class="row"><!-- 비밀번호 확인 -->
                <label class="lbl">암호확인</label>
                <input type="password" id="userpw1" placeholder="암호확인"/>
            </div>
            
            <div class="row"><!-- 이름 -->
                <label class="lbl">이름</label>
                <input type="text" name="name" placeholder="이름"/>
            </div>
            
            <div class="row"><!-- 연락처 -->
                <label class="lbl">연락처</label>
                <input type="text" name="phone" placeholder="연락처"/>
            </div>

            <input type="submit" value="가입" /> 
        
        
        </form>
    </div>
</body>
</html>

다시 join.html
form으로 입력부분 감싸줌 ?????????? 안보이게끔해서 보내려고 + member/join.do 의 post를 사용하는 구간이라고 알림.

form으로 감싸주는 이유는 해당 html의 controller를 쓰기 위해서 하는 것. get과 post만 사용
뷰에서는
const body = new obj;
obj.append("", data);
이걸 그냥 html에서는 바로했는거임.(바로 joincontroller에 Member타입으로 받아서 service호출로 바로 등록)

html에서 name 부분에 entity의 형식대로 넣음.

ex)

<input type="text" name="id" placeholder="아이디" autofocus/>



<html lang="ko" xmlns:th="http://www.thymeleaf.org">
쓰는 이유? 이거의 문법을 쓰려고.
<div th:action>, <div th:for>같은 것 쓸 수 있음.

지금은 controller의 method를 바로 사용하게끔 해놓음.


form th:action="@{/member/join.do}"
이거 쓴 이유는 크롬 소스보기에서 보면
자동으로 /ROOT/member/join.do로 입력됨.
<form action="/ROOT/member/join.do" method="post"> <=이걸로 바뀜


이제 input가입 post를 할거임
a태그 씀(a태그는 get으로 씀. 정보 가져올때 쓰는 것임.)
a태그로 home.do로 보냄
return "redirect:/home.do";

<membercontroller.java/ join.do>

// 127.0.0.1:8080/ROOT/member/join.do
@GetMapping(value = "/join.do")
public String joinGET(){
    return "member/join"; // join.html file
}

@PostMapping(value = "/join.do")
public String joinPOST(@ModelAttribute Member member){

    // service호출해서 추가
    int ret = mService.insertMember(member);
    System.out.println(member.toString());
    if(ret < 1){

        return "redirect:/member/join.do";
    }
    // home으로 보내기 여기서 a태그는 어떻게 쓰냐(a태그 동작)
    return "redirect:/home.do";
}



만약에 한페이지에 post가 두개면?
일단 한개일땐 form으로 감싸준 곳 method를 줬음.
form method는 하나만 쓸 수 있음. join.do의 post

controller에서 
@mapping에 value값을 입력하면 됨.(크롬상 주소)
그리고 html에서 사용할때 
    <a th:href="@{/home.do}">홈으로(GET)</a>
    <a th:href="@{/board/boardwrite.do}">글쓰기(GET)</a>
이렇게 씀.

return은 프로젝트 폴더 위치

boardcontroller만듬

package com.example.controller;


import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;

import com.example.entity.Board;
import com.example.service.BoardService;


@Controller
@RequestMapping(value = "/board")
public class BoardController {
    
    @Autowired
    BoardService bService;

    String resultmsg = "";


    // 삭제하기
    @GetMapping(value = "/boarddelete.do")
    public String deleteGET( Model model,     
            @RequestParam(name = "no", defaultValue = "0", required = false) long no) {
        if(no == 0){
            return "redirect:/board/boardlist.do";
        }
        Board board = new Board();
        board.setNo(no);
        short ret = bService.deleteBoard(board);
        if(ret < 1){
            return "redirect:/board/boardupdate.do";
        }
        return "redirect:/board/boardlist.do";
    }

    // 수정하기(수정 내용 기입)
    @PostMapping(value = "/boardupdate.do")
    public String updateGET( Model model,     
            @RequestParam(name = "no", defaultValue = "0", required = false) long no,
            @ModelAttribute Board board ) {
        if(no == 0){
            return "redirect:/board/boardlist.do";
        }
        board.setNo(no);
        short ret = bService.updateBoard(board);
        System.out.println("수정값"+board);
        if(ret < 1){
            return "redirect:/board/boardupdate.do";
        }
        return "redirect:/board/boardlist.do";
    }
    // 수정하기(게시글 하나 정보 불러오기)
    @GetMapping(value = "/boardupdate.do")
    public String updateGET( Model model,     
            @RequestParam(name = "no", defaultValue = "0", required = false) long no) {
        if(no == 0){
            return "redirect:/board/boardlist.do";
        }
        // 1. 해당 게시글 정보 불러오기
        Board board = new Board();
        board.setNo(no);
        List<Board> list = bService.selectOne(board);
        // System.out.println( list.toString() );

        // 2. VIEW로 html로 값전달
        model.addAttribute("blist", list);

        // 3. VIEW표시 boardlist.html파일
        return "board/boardupdate"; 
    }



    // th:href="@{/board/boardone.do(no=${tmp.no})}"
        // 서버주소/ROOT/board/boardone.do
    // 서버주소/ROOT/board/boardone.do?no=1
    @GetMapping(value = "/boardone.do")
    public String selectoneGET( Model model,     
            @RequestParam(name = "no", defaultValue = "0", required = false) long no ) {
        if(no == 0){
            return "redirect:/board/boardlist.do";
        }
        // 1. 서비스에서 가져옴 ex) 검색어없음, 1페이지
        Board board = new Board();
        board.setNo(no);
        List<Board> list = bService.selectOne(board);
        // System.out.println( list.toString() );

        // 2. VIEW로 html로 값전달
        model.addAttribute("blist", list);
        model.addAttribute("prevno", no-1);
        model.addAttribute("nextno", no+1);

        // 3. VIEW표시 boardlist.html파일
        return "board/boardone"; 
    }



    // 서버주소/ROOT/board/boardlist.do
    // 서버주소/ROOT/board/boardlist.do?txt=&page=1
    @GetMapping(value = "/boardlist.do")
    public String boardListGET( Model model, 
            @RequestParam(name = "txt", defaultValue = "", required = false) String txt,    
            @RequestParam(name = "page", defaultValue = "1", required = false) int page ) {
        // 1. 서비스에서 가져옴 ex) 검색어없음, 1페이지
        List<Board> list = bService.selectboard(txt, page);
        // System.out.println( list.toString() );

        // 1.1 페이지네이션 갯수
        long total = bService.countBoardList(txt);

        // 2. VIEW로 html로 값전달
        model.addAttribute("blist", list);
        model.addAttribute("pages", (total-1)/10 + 1);

        // 3. VIEW표시 boardlist.html파일
        return "board/boardlist"; 
    }

    @GetMapping(value="boardwrite.do")
    public String boardWriteGET() {
        return "board/boardwrite";
    }

    @PostMapping(value = "/boardwrite.do")
    public String boardwritePOST(@ModelAttribute Board board){
        
        // service호출해서 추가
        int ret = bService.insertBoard(board);
        System.out.println(board.toString());
        if(ret < 1){
            return "redirect:/board/boardwrite.do";
        }
        // home으로 보내기 여기서 a태그는 어떻게 쓰냐(a태그 동작)
        return "redirect:/board/boardlist.do";
        // if(ret == 1){
            // return "redirect:/board/boardlist.do";
            // }
            // // 실패시 다시 글쓰기로
            // return "redirect:/board/boardwrite.do";
        }
    
    
}


boardlist.html 만듬
<a th:href="@{/board/boardwrite.do">글쓰기(GET)</a>

<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"></html>
<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>게시판</title>
</head>
<body>
    <h3>게시판</h3>
    <a th:href="@{/home.do}">홈으로(GET)</a>
    <a th:href="@{/board/boardwrite.do}">글쓰기(GET)</a>

    <form th:action="@{/board/boardlist.do}" method="get">
        <input type="text" name="txt" placeholder="검색어"/>
        <input type="hidden" name="page" value="1"/>
        <input type="submit" value="검색"/>
    </form>
    <table border="1">
        <tr>
            <th>번호</th>
            <th>제목</th>
            <th>작성자</th>
            <th>조회수</th>
            <th>날짜</th>
        </tr>

        <!-- v-for= "(tmp,idx) of blist" -->
        <tr th:each = "tmp,idx : ${blist}">
            <td th:text="${tmp.no}"></td>
            <td>
                <a th:href="@{/board/boardone.do(no=${tmp.no})}"
                    th:text="${tmp.title}">
                </a>
            </td>
            <td th:text="${tmp.content}"></td>
            <td th:text="${tmp.hit}"></td>
            <td th:text="${tmp.regdate}"></td>
        </tr>
    </table>
    <!-- th:href="이동할페이지(파라미터)" -->
    <th:block th:each = "i : ${#numbers.sequence(1, pages)}">
        <a th:href="@{/board/boardlist.do(txt=${param.txt},page=${i})}" th:text="${i}">
        <!-- <a th:href="@{/board/boardlist.do(txt='',page=${i})}" th:text="${i}"> -->
        </a>
    </th:block>
</body>
<script>
</script>

</html>



template위치 옮겨줄때 boardcontroller에서 
기본 리턴값 boardlist를 board/boardlist로 바꿔줌(개인 설정)

게시판 글쓰기 만들기
boardcontroller

package com.example.controller;


import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;

import com.example.entity.Board;
import com.example.service.BoardService;


@Controller
@RequestMapping(value = "/board")
public class BoardController {
    
    @Autowired
    BoardService bService;

    String resultmsg = "";


    // 삭제하기
    @GetMapping(value = "/boarddelete.do")
    public String deleteGET( Model model,     
            @RequestParam(name = "no", defaultValue = "0", required = false) long no) {
        if(no == 0){
            return "redirect:/board/boardlist.do";
        }
        Board board = new Board();
        board.setNo(no);
        short ret = bService.deleteBoard(board);
        if(ret < 1){
            return "redirect:/board/boardupdate.do";
        }
        return "redirect:/board/boardlist.do";
    }

    // 수정하기(수정 내용 기입)
    @PostMapping(value = "/boardupdate.do")
    public String updateGET( Model model,     
            @RequestParam(name = "no", defaultValue = "0", required = false) long no,
            @ModelAttribute Board board ) {
        if(no == 0){
            return "redirect:/board/boardlist.do";
        }
        board.setNo(no);
        short ret = bService.updateBoard(board);
        System.out.println("수정값"+board);
        if(ret < 1){
            return "redirect:/board/boardupdate.do";
        }
        return "redirect:/board/boardlist.do";
    }
    // 수정하기(게시글 하나 정보 불러오기)
    @GetMapping(value = "/boardupdate.do")
    public String updateGET( Model model,     
            @RequestParam(name = "no", defaultValue = "0", required = false) long no) {
        if(no == 0){
            return "redirect:/board/boardlist.do";
        }
        // 1. 해당 게시글 정보 불러오기
        Board board = new Board();
        board.setNo(no);
        List<Board> list = bService.selectOne(board);
        // System.out.println( list.toString() );

        // 2. VIEW로 html로 값전달
        model.addAttribute("blist", list);

        // 3. VIEW표시 boardlist.html파일
        return "board/boardupdate"; 
    }



    // th:href="@{/board/boardone.do(no=${tmp.no})}"
        // 서버주소/ROOT/board/boardone.do
    // 서버주소/ROOT/board/boardone.do?no=1
    @GetMapping(value = "/boardone.do")
    public String selectoneGET( Model model,     
            @RequestParam(name = "no", defaultValue = "0", required = false) long no ) {
        if(no == 0){
            return "redirect:/board/boardlist.do";
        }
        // 1. 서비스에서 가져옴 ex) 검색어없음, 1페이지
        Board board = new Board();
        board.setNo(no);
        List<Board> list = bService.selectOne(board);
        // System.out.println( list.toString() );

        // 2. VIEW로 html로 값전달
        model.addAttribute("blist", list);
        model.addAttribute("prevno", no-1);
        model.addAttribute("nextno", no+1);

        // 3. VIEW표시 boardlist.html파일
        return "board/boardone"; 
    }



    // 서버주소/ROOT/board/boardlist.do
    // 서버주소/ROOT/board/boardlist.do?txt=&page=1
    @GetMapping(value = "/boardlist.do")
    public String boardListGET( Model model, 
            @RequestParam(name = "txt", defaultValue = "", required = false) String txt,    
            @RequestParam(name = "page", defaultValue = "1", required = false) int page ) {
        // 1. 서비스에서 가져옴 ex) 검색어없음, 1페이지
        List<Board> list = bService.selectboard(txt, page);
        // System.out.println( list.toString() );

        // 1.1 페이지네이션 갯수
        long total = bService.countBoardList(txt);

        // 2. VIEW로 html로 값전달
        model.addAttribute("blist", list);
        model.addAttribute("pages", (total-1)/10 + 1);

        // 3. VIEW표시 boardlist.html파일
        return "board/boardlist"; 
    }

    @GetMapping(value="boardwrite.do")
    public String boardWriteGET() {
        return "board/boardwrite";
    }

    @PostMapping(value = "/boardwrite.do")
    public String boardwritePOST(@ModelAttribute Board board){
        
        // service호출해서 추가
        int ret = bService.insertBoard(board);
        System.out.println(board.toString());
        if(ret < 1){
            return "redirect:/board/boardwrite.do";
        }
        // home으로 보내기 여기서 a태그는 어떻게 쓰냐(a태그 동작)
        return "redirect:/board/boardlist.do";
        // if(ret == 1){
            // return "redirect:/board/boardlist.do";
            // }
            // // 실패시 다시 글쓰기로
            // return "redirect:/board/boardwrite.do";
        }
    
    
}


boardwrite.html 작성

<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"></html>
<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>글쓰기</title>
</head>
<body>
    <h3>글쓰기</h3>

    <form th:action="@{/board/boardwrite.do}" method="post">
        제목 : <input type="text" name="title"/><br/>
        내용 : <textarea rows="6" name="content"></textarea><br/>
        작성자 : <input type="text" name="writer"/><br/>

        <input type="submit" value="작성완료">
        <a th:href="@{/board/boardlist.do}">
            <input type="button" value="목록으로">
        </a>
    </form>
    
</body>
</html>



지금 보니까 html부분은 controller랑만 소통 하고있음.
주소 오류 같은 경우는 controller로 해결하면 될듯.
controller는 서비스와 소통중


오후일과
보드리스트 들고오기위해서
boardrepository 작성

package com.example.repository;

import java.util.List;

import org.springframework.boot.autoconfigure.data.web.SpringDataWebProperties.Pageable;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;

import com.example.entity.Board;

public interface BoardRepository extends MongoRepository<Board, Long>{
    

    // 검색어, 페이지네이션, 정렬
    @Query(value = "{ title : { $regex : ?0}}", sort="{_id : -1}")
    public List<Board> selectBoardList(String text, PageRequest page);

    // 검색어 포함 개수
    @Query(value = "{ title : { $regex : ?0}}", count = true)
    public long countBoardList(String text);
}


boardcontroller 작성

package com.example.controller;


import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;

import com.example.entity.Board;
import com.example.service.BoardService;


@Controller
@RequestMapping(value = "/board")
public class BoardController {
    
    @Autowired
    BoardService bService;

    String resultmsg = "";


    // 삭제하기
    @GetMapping(value = "/boarddelete.do")
    public String deleteGET( Model model,     
            @RequestParam(name = "no", defaultValue = "0", required = false) long no) {
        if(no == 0){
            return "redirect:/board/boardlist.do";
        }
        Board board = new Board();
        board.setNo(no);
        short ret = bService.deleteBoard(board);
        if(ret < 1){
            return "redirect:/board/boardupdate.do";
        }
        return "redirect:/board/boardlist.do";
    }

    // 수정하기(수정 내용 기입)
    @PostMapping(value = "/boardupdate.do")
    public String updateGET( Model model,     
            @RequestParam(name = "no", defaultValue = "0", required = false) long no,
            @ModelAttribute Board board ) {
        if(no == 0){
            return "redirect:/board/boardlist.do";
        }
        board.setNo(no);
        short ret = bService.updateBoard(board);
        System.out.println("수정값"+board);
        if(ret < 1){
            return "redirect:/board/boardupdate.do";
        }
        return "redirect:/board/boardlist.do";
    }
    // 수정하기(게시글 하나 정보 불러오기)
    @GetMapping(value = "/boardupdate.do")
    public String updateGET( Model model,     
            @RequestParam(name = "no", defaultValue = "0", required = false) long no) {
        if(no == 0){
            return "redirect:/board/boardlist.do";
        }
        // 1. 해당 게시글 정보 불러오기
        Board board = new Board();
        board.setNo(no);
        List<Board> list = bService.selectOne(board);
        // System.out.println( list.toString() );

        // 2. VIEW로 html로 값전달
        model.addAttribute("blist", list);

        // 3. VIEW표시 boardlist.html파일
        return "board/boardupdate"; 
    }



    // th:href="@{/board/boardone.do(no=${tmp.no})}"
        // 서버주소/ROOT/board/boardone.do
    // 서버주소/ROOT/board/boardone.do?no=1
    @GetMapping(value = "/boardone.do")
    public String selectoneGET( Model model,     
            @RequestParam(name = "no", defaultValue = "0", required = false) long no ) {
        if(no == 0){
            return "redirect:/board/boardlist.do";
        }
        // 1. 서비스에서 가져옴 ex) 검색어없음, 1페이지
        Board board = new Board();
        board.setNo(no);
        List<Board> list = bService.selectOne(board);
        // System.out.println( list.toString() );

        // 2. VIEW로 html로 값전달
        model.addAttribute("blist", list);
        model.addAttribute("prevno", no-1);
        model.addAttribute("nextno", no+1);

        // 3. VIEW표시 boardlist.html파일
        return "board/boardone"; 
    }



    // 서버주소/ROOT/board/boardlist.do
    // 서버주소/ROOT/board/boardlist.do?txt=&page=1
    @GetMapping(value = "/boardlist.do")
    public String boardListGET( Model model, 
            @RequestParam(name = "txt", defaultValue = "", required = false) String txt,    
            @RequestParam(name = "page", defaultValue = "1", required = false) int page ) {
        // 1. 서비스에서 가져옴 ex) 검색어없음, 1페이지
        List<Board> list = bService.selectboard(txt, page);
        // System.out.println( list.toString() );

        // 1.1 페이지네이션 갯수
        long total = bService.countBoardList(txt);

        // 2. VIEW로 html로 값전달
        model.addAttribute("blist", list);
        model.addAttribute("pages", (total-1)/10 + 1);

        // 3. VIEW표시 boardlist.html파일
        return "board/boardlist"; 
    }

    @GetMapping(value="boardwrite.do")
    public String boardWriteGET() {
        return "board/boardwrite";
    }

    @PostMapping(value = "/boardwrite.do")
    public String boardwritePOST(@ModelAttribute Board board){
        
        // service호출해서 추가
        int ret = bService.insertBoard(board);
        System.out.println(board.toString());
        if(ret < 1){
            return "redirect:/board/boardwrite.do";
        }
        // home으로 보내기 여기서 a태그는 어떻게 쓰냐(a태그 동작)
        return "redirect:/board/boardlist.do";
        // if(ret == 1){
            // return "redirect:/board/boardlist.do";
            // }
            // // 실패시 다시 글쓰기로
            // return "redirect:/board/boardwrite.do";
        }
    
    
}


model사용

boardlist
테이블 작성 및 검색어 부분 작성

<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"></html>
<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>게시판</title>
</head>
<body>
    <h3>게시판</h3>
    <a th:href="@{/home.do}">홈으로(GET)</a>
    <a th:href="@{/board/boardwrite.do}">글쓰기(GET)</a>

    <form th:action="@{/board/boardlist.do}" method="get">
        <input type="text" name="txt" placeholder="검색어"/>
        <input type="hidden" name="page" value="1"/>
        <input type="submit" value="검색"/>
    </form>
    <table border="1">
        <tr>
            <th>번호</th>
            <th>제목</th>
            <th>작성자</th>
            <th>조회수</th>
            <th>날짜</th>
        </tr>

        <!-- v-for= "(tmp,idx) of blist" -->
        <tr th:each = "tmp,idx : ${blist}">
            <td th:text="${tmp.no}"></td>
            <td>
                <a th:href="@{/board/boardone.do(no=${tmp.no})}"
                    th:text="${tmp.title}">
                </a>
            </td>
            <td th:text="${tmp.content}"></td>
            <td th:text="${tmp.hit}"></td>
            <td th:text="${tmp.regdate}"></td>
        </tr>
    </table>
    <!-- th:href="이동할페이지(파라미터)" -->
    <th:block th:each = "i : ${#numbers.sequence(1, pages)}">
        <a th:href="@{/board/boardlist.do(txt=${param.txt},page=${i})}" th:text="${i}">
        <!-- <a th:href="@{/board/boardlist.do(txt='',page=${i})}" th:text="${i}"> -->
        </a>
    </th:block>
</body>
<script>
</script>

</html>



controller에 적어야하는 것을 
rest에 적고 있었음 개멍청이

중요중요중요중요중요중요중요중요중요중요중요중요
controller에서 해당 html vue으로 정보를 줄때는 model을 사용함.
public 입력값에 Model model추가
model.addAttribute("blist", list);
위 코드로 값 전달(service에서 받아온 값을 list에 담아서 blist로 줌)

html vue에서 정보를 받아올때는 @requestparam사용
기본 페이지 불러오기가 있으니까 defaultvalue와 required false를 줬음.
지금 boardlist 해당 화면에서 받아올껀 txt, page


boardrepository에서
페이지 개수 들고오기
이것또한 같음
repository 작성
boardservice에서 return 반영
controller에서 불러오기
model에 담기
html에 작성
    <!-- th:href="이동할페이지(파라미터)" -->
    <th:block th:each = "i : ${#numbers.sequence(1, pages)}">
        <a th:href="@{/board/boardlist.do(txt=${param.txt},page=${i})}" th:text="${i}">
        </a>
    </th:block>

param에 있는 txt를 가져옴(2페이지 넘길때 빈공간으로 넘기면 못받아오니까 해줌)


${#numbers.sequence(1, pages)}
이건 숫자 만들어주는 거인듯 1부터 pages까지


제목 눌러주면 상세내용 나오게 하기
td에서 제목부분 수정
            <td>
                <a th:href="@{/board/selectone.do(no=${tmp.no})}"
                    th:text="${tmp.title}">
                </a>
            </td>


a태그로 이동하였기 때문에 get임.