프론트 확인
컨트롤러 작성
@GetMapping("/board/{id}")
public String detail(@PathVariable int id) {
System.out.println("id : "+id); // PathVariable이 잘 작동하는 지 확인
return "board/detail";
}
Java
복사
응답 DTO만들기
package shop.mtcoding.blog.board;
import lombok.Data;
public class BoardResponse {
@Data
public static class DetailDTO {
private int id;
private String title;
private String content;
private int userId;
private String username;
}
}
Java
복사
findById()메소드 만들기
public BoardResponse.DetailDTO findById(int idx) {
// 이 코드를 사용하려면 의존성주입이 되어야 한다. EntityManager
Query query = em.createNativeQuery("select b.id, b.title, b.content, b.user_id, u.username from board_tb b inner join user_tb u on b.user_id = u.id where b.id = ?");
query.setParameter(1, idx);
// 객체 각 요소들을 배열로 받는다. 한 행의 요소로 배열로 들어간다.
Object[] row = (Object[]) query.getSingleResult();
// H2에 받은 결과값을 그대로 확인하고 타입과 순서를 모두 지켜줘야 된다. 1차원적 설계
Integer id = (Integer) row[0];
String title = (String) row[1];
String content = (String) row[2];
int userId = (Integer) row[3];
String username = (String) row[4];
//확인용 코드
System.out.println("id : "+ id);
System.out.println("title : "+ title);
System.out.println("content : "+ content);
System.out.println("userId : "+ userId);
System.out.println("username : "+ username);
//객체를 생성하여서 DetailDTO로 옮겨담는 작업
BoardResponse.DetailDTO responseDTO = new BoardResponse.DetailDTO();
responseDTO.setId(id);
responseDTO.setTitle(title);
responseDTO.setContent(content);
responseDTO.setUserId(userId);
responseDTO.setUsername(username);
return responseDTO;
}
Java
복사
테스트 하기
@GetMapping("/board/{id}")
public String detail(@PathVariable int id) {
// 테스트용 코드
boardRepository.findById(id);
return "board/detail";
}
}
Java
복사
// 테스트용 URL 주소
http://localhost:8080/board/1
Java
복사
화면에 렌더링 하기
@GetMapping("/board/{id}")
public String detail(@PathVariable int id, HttpServletRequest request) {
// 모델에게 위임하고 반환된 값을 responseDTO에 저장
BoardResponse.DetailDTO responseDTO = boardRepository.findById(id);
// request가방에 담아서 화면에 렌더링할 수 있게해준다.
// 아래 코드 예시로는 mustache에서 {{board}} 같이 문법을 쓰면 정보를 가져다 쓸 수 있다.
request.setAttribute("board", responseDTO);
return "board/detail";
}
Java
복사
테스트 확인
각 게시물마다 바뀌는 사용자와 제목/내용을 확인 할 수 있다.
detail.mustache 전체코드
{{> /layout/header}}
<div class="container p-5">
<!-- 수정삭제버튼 -->
<div class="d-flex justify-content-end">
<button class="btn btn-warning me-1">수정</button>
<button class="btn btn-danger">삭제</button>
</div>
<div class="d-flex justify-content-end">
<b>작성자</b> : {{board.username}}
</div>
<!-- 게시글내용 -->
<div>
<h2><b>{{board.title}}</b></h2>
<hr/>
<div class="m-4 p-2">
{{board.content}}
</div>
</div>
<!-- 댓글 -->
<div class="card mt-3">
<!-- 댓글등록 -->
<div class="card-body">
<form action="/reply/save" method="post">
<textarea class="form-control" rows="2" name="comment"></textarea>
<div class="d-flex justify-content-end">
<button type="submit" class="btn btn-outline-primary mt-1">댓글등록</button>
</div>
</form>
</div>
<!-- 댓글목록 -->
<div class="card-footer">
<b>댓글리스트</b>
</div>
<div class="list-group">
<!-- 댓글아이템 -->
<div class="list-group-item d-flex justify-content-between align-items-center">
<div class="d-flex">
<div class="px-1 me-1 bg-primary text-white rounded">cos</div>
<div>댓글 내용입니다</div>
</div>
<form action="/reply/1/delete" method="post">
<button class="btn">🗑</button>
</form>
</div>
<!-- 댓글아이템 -->
<div class="list-group-item d-flex justify-content-between align-items-center">
<div class="d-flex">
<div class="px-1 me-1 bg-primary text-white rounded">ssar</div>
<div>댓글 내용입니다</div>
</div>
<form action="/reply/1/delete" method="post">
<button class="btn">🗑</button>
</form>
</div>
</div>
</div>
</div>
{{> /layout/footer}}
Java
복사
추가 노트..
URL 테이블 명 뒤에 들어오는 값은 PK or Unique 나머지는 다 QueryString
주소 들어가는 모든 데이터는 where절에 들어간다.
서로가 알고 있는 표준을 잘 지켜줘야 된다.
바디데이터가 없으면 유효성 검사는 없다.
파일에 맞는 DTO를 생성하면 직관적이고 편하다. 두번 생각하지 않아도 된다.