1. View 확인
상세보기는 없는 간단한 제목과 내용 작성자를 적고, 수정 삭제를 할 수 있는 페이지이다.
현재는 데이터 없이 View 화면만 있는 페이지다. 데이터를 추가해 화면에 출력하보자.
board/Board
package shop.mtcoding.blog.board; import jakarta.persistence.*; import lombok.Data; @Data //게터세터 @Entity // 이게 붙으면 테이블 생성됨 @Table(name="board_tb") // 테이블명 public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) //auto_increment private int id ; private String author ; private String title; private String content; }
테이블을 담을 클래스를 만든다. 테이블명은
board_tb
로 정했다.이 테이블은 자동으로 증가하는 id 와 게시자 이름, 제목, 내용으로 이루어져 있다.
resources/data.sql
insert into board_tb(author,title,content) values ('홍길동','제목1','내용1'); insert into board_tb(author,title,content) values ('홍길동','제목2','내용2'); insert into board_tb(author,title,content) values ('홍길동','제목3','내용3'); insert into board_tb(author,title,content) values ('홍길동','제목4','내용4'); insert into board_tb(author,title,content) values ('홍길동','제목5','내용5');
Insert 쿼리문으로 더미데이터를 만든다.
application.yml
sql: init: data-locations: - classpath:db/data.sql
더미데이터 추가를 위해 yml 파일에 코드를 추가한다.
테이블이 완성되었다.
2. Controller
board/BoardController
@GetMapping("/") public String index(HttpServletRequest request,@RequestParam(defaultValue = "0")int page) { List<Board> boardList = boardRepository.findAll(page); return "index"; }
컨트롤러에서 데이터를 불러온다.
3. Repository
board/BoardRepository
public List<Board> findAll(int page) { final int COUNT = 5; int value = page * COUNT ; Query query = em.createNativeQuery("select * from board_tb order by id desc limit ?,?",Board.class); query.setParameter(1,value); query.setParameter(2,COUNT); List<Board> boardList = query.getResultList(); return boardList; }
테이블은 하나의 타입이 아니기 때문에 컬렉션의 형태로 데이터를 받는다.
쿼리문 뒤에 Board.class 를 붙이면 jpa 라이브러리가 파싱을 도와준다.
COUNT를 5로 설정하면 한 페이지에 5개의 글이 표시된다.
4. 조회한 데이터 View에 전송
@GetMapping("/") public String index(HttpServletRequest request,@RequestParam(defaultValue = "0")int page) { List<Board> boardList = boardRepository.findAll(page); request.setAttribute("boardList",boardList); return "index"; }
조회한 데이터 boardList 를 request 객체에 담는다.
resource/index.mustache
<table class="table table-striped"> <thead> <tr> <th>번호</th> <th>제목</th> <th>내용</th> <th>작성자</th> <th></th> </tr> </thead> <tbody> {{#boardList}} <tr> <td>{{id}}</td> <td>{{title}}</td> <td>{{content}}</td> <td>{{author}}</td> <td> <div class="d-flex"> <form action="/board/{{id}}/delete" method="post"> <button class="btn btn-danger">삭제</button> </form> <form action="/board/{{id}}/updateForm" method="post"> <button class="btn btn-warning">수정</button> </form> </div> </td> </tr> {{/boardList}} </tbody> </table>
전달 받은 데이터가 오브젝트라면 {{#}} {{/}} 는 if문, {{^}} {{/}} 는 else 문
전달 받은 데이터가 컬렉션 형태라면 {{#}} {{/}} 는 반복문이 된다.
boardList 는 컬렉션 형태기 때문에 반복문이 된다.
입력받은 데이터와 동일한 화면이 출력된다.
Share article