[Java] Spring boot [6] - 게시물 CRUD

RedPanda·2023년 1월 13일
0

[Java] Spring Boot

목록 보기
5/5

지난번에 DB에 데이터를 넣는 것 까지 구현했었다. DB를 다룰 수 있게 되어 게시물 조회/추가/수정/삭제를 해보았다. 이 과정에서 짚고 넘어가야할 부분을 설명해보고자 한다.

우선 시작 전에 이전에 했던 세팅을 모두 따라해주도록 하자. Entity, Repository, Service, Controller 모두 필요하다.

또한 DB 설정에서 RSA KEY ERROR와 같은 문구가 떴다면 다음과 같이 해결해주도록 하자.

// ../src/main/.../resources/application.properties
// DB에 접근할 때 접근하기 편하게 하는 코드를 추가해주자

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mariadb://localhost:3306/board?allowPublicKeyRetrieval=true&useSSL=false

1. 데이터 주고받기

데이터를 주고 받을 때 기존에는 JS script를 추가하여 사용했다. 사용하면서 태그를 가져와서 텍스트를 입히는 일이 여간 귀찮은 일이 아니였다. 우리는 thymeleaf로 간단하게 작업할 수 있게 되었다.
우선 JSP에서 사용했던 방법을 생각해보자면 데이터를 주고받을 때에 session이나 request에 요소를 추가하여 넘겨주었다. Spring 또한 유사한 방식으로 추가해주는데, 대신 자체적인 Model 객체에 넣어 추가하도록 해준다. 이는 html파일을 호출할 때 같이 넘겨주는 것 같다.

public String boardView(Model model, Integer id) {

	model.addAttribute("board", boardService.boardView(id));
    return "boardView";
 }
//{board=Board(id=7, title=제목7, content=내용7)}

위 코드를 보면 model를 파라미터로 가져온다. 이곳에 필요한 데이터를 Key Value와 같이 저장하는 것으로 보인다.
model을 출력해보면 주석과 같은 출력값이 나타난다.
이렇게 저장한 데이터를 return한 html에서 사용할 수 있게 해준다.

<body>
    <h1 th:text="${board.title}">게시글 상세 페이지입니다.</h1>
    <p th:text="${board.content}">내용입니다.</p>
    <a th:href="@{/board/modify/{id}(id=${board.id})}">수정</a>
    <a th:href="@{/board/delete(id=${board.id})}">삭제</a>
</body>

앞서 model에 board로 저장했기 때문에 board.title로 불러올 수 있게 되었다. thymeleaf의 힘을 빌려 편리하게 포맷팅하여 불러올 수 있게 했다.

[추가] GET의 URL을 받는 방식

  • /board/modify/{id}(id=${board.id})
    : "/board/modify/id" 방식으로 id 값을 숨길 수 있음
  • /board/modify(id=${board.id})
    : "/board/modify?id=1" 방식으로 id 값을 입력하여 이동시킬 수 있음

예를 들어 프론트 사이드에서 데이터 폼에 입력된 값을 넘겨주려고 한다. html에서는 form 태그를 사용하여 줄 수 있는데 초기에 받은 thymeleaf로 주고받으면 조금 더 편하게 사용할 수 있다.

다음 코드는 게시글 하나를 조회했을 때 나올 html이다.
form에서 action과 method로 요청할 방법에 대해 서술한다.

<body>
<div class="layout">
    <div class="input-area">
        <form th:action="@{/board/update/{id}(id=${board.id})}" method="post">
            제목 : <input name="title" th:value="${board.title}"/>
            <br>
            내용 : <textarea name="content" th:text="${board.content}"></textarea>
            <br>
            <button type="submit">수정</button>
        </form>
    </div>
</div>
</body>

Controller에서 URL을 받을 때 /id로 받는다면 다음과 같이 데이터를 받아준다. @PathVariable로 파라미터 id에 넣어주도록 한다.
이럴때 보면 어노테이션이 거의 다 하는 것 같다.

 @PostMapping("/board/update/{id}")
 public String updateBoard(@PathVariable("id") Integer id, Board board) {

	Board boardTmp = boardService.boardView(id);
	boardTmp.setTitle(board.getTitle());
	boardTmp.setContent(board.getContent());
	boardService.write(boardTmp);

	return "redirect:/board/list";
}

2. JPA로 Service 수정하기

Service에서 호출하는 메소드 모두 JPA Repository로 불러올 수 있으므로 다음과 같이 만들어주면 된다.

findById같은 경우는 return값이 Optional값이다. 받아온 값이 null일때를 위한 것이다. 따라서 .get()으로 board 값을 받아오도록 하자.

    // 특정 게시글 불러오기
public Board boardView(Integer id){

    // Optional 값으로 데이터를 받아오기 때문에 get으로 받아와야함
    return boardRepository.findById(id).get();
}
    
// 게시물 삭제
public void delete(Integer id){

    boardRepository.deleteById(id);
}

참고자료

Java Optional - https://mangkyu.tistory.com/70
DB 세팅 - https://solbel.tistory.com/1441

profile
끄적끄적 코딩일기

0개의 댓글