글상세보기 구현
날짜 형태 변경 -시간 제외하기
진행방향
- cs 만들기 : list파일 복붙 후, <
section
> 바꾸기
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>blog</title>
</head>
<body>
<nav>
<ul>
<li>
<a href="#">홈</a>
</li>
<li>
<a href="#">글쓰기</a>
</li>
</ul>
</nav>
<hr>
<section>
<div>
번호 : {{model.id}} <br>
제목 : {{model.title}} <br>
내용 : {{model.content}} <br>
작성일 : {{model.createdAt}} <br>
</div>
</section>
</body>
</html>
BoardController
기능 추가- 쿼리스트링(where절): /board?title=바다 (제목이'바다'인 글을 찾아줘) 기본키나 유니크 하지않을 때. ?key=value 형태. &(and) 사용가능
- 패스변수(where절): /board/1 (id값이 1인 글을 찾아줘) 유니크(pk)할 때. URL의 경로 일부를 변수로 사용
RESTful API 설계 : 주소로 자원을 찾는 방법
대화처럼 인식하기, 쿼리스트링과 패스변수를 적절히 혼합하여 사용
주소 형태로 데이터 받기: 주소는 모두 where절에 걸림(where절 = 쿼리문 조건절)
@GetMapping("/board/{id}") // 중괄호있으면,
public String detail(@PathVariable("id") int id, Model model) { // 어노테이션 vaule값 필요
// model을 리퀘스트 객체에 넣어야 꺼내 쓰기 편함 > Model model 추가
BoardResponse.DetailDTO boardDetail = boardService.게시글상세보기(id);
model.addAttribute("model", boardDetail);
return "detail";
}
BoardResponse
DetailDTO 생성
@Data
public static class DetailDTO {
private int id;
private String title;
private String content;
private String createdAt;
public DetailDTO(Board board) {
this.id = board.getId();
this.title = board.getTitle();
this.content = board.getContent();
// TODO: 2.24.11.18 형태로 변경하기
this.createdAt = board.getCreatedAt().toString();
}
}
BoardService
‘게시글상세보기’메서드 작성 개발 진행방향: 다같이 vs코드로 모든 화면 만들고, 레이어 순서대로 코드 세분화
추천 방향: 반대로 만들기. 1.레파지토리>2.컨트롤러>3.서비스
public BoardResponse.DetailDTO 게시글상세보기(int id) {
Board board = boardRepository.findById(id); // 바로 return 불가능>DTO
return new BoardResponse.DetailDTO(board);
}
BoardRepository
’findById’ 쿼리문 및 메서드 작성
public Board findById(int id) {
Query q = em.createNativeQuery("select * from board_tb where id = ?", Board.class);
q.setParameter(1, id); // 물음표 완성하기 (물음표 순서, 물음표에 바인딩될 변수값)
// (Board) : 다운캐스팅. getSingleResult 타입은 object
return (Board) q.getSingleResult(); // 한개만 반환
}
결과


날짜 형태 변경 -코드
해당 코드를 이용해 직접 해보기 -
_core
패키지 따로 만든 후, 클래스 생성import java.text.SimpleDateFormat;
import java.util.Date;
Date createdAt = board.getCreatedAt();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
String formattedDate = sdf.format(createdAt);
this.createdAt = formattedDate;
- 새로운 패키지
_core
생성 따로 클래스를 만들어 날짜 인코딩 여러 곳 사용가능 및 패키지를 따로 파서 기능 구별함 Encoding
클래스 생성
package com.example.blog._core;
import com.example.blog.Board.Board;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Encoding {
// Board 객체 받아 createdAt를 "yyyy.mm.dd" 형태 반환하는 메서드
public static String formatToStr(Board board) {
// Board 객체에서 createdAt을 가져와서 포맷
Date createdAt = board.getCreatedAt();
SimpleDateFormat date = new SimpleDateFormat("yyyy.MM.dd");
return date.format(createdAt); // 포맷된 날짜 문자열 반환
}
}
BoardResponse
수정
@Data
public static class DetailDTO {
private int id;
private String title;
private String content;
private String createdAt;
public DetailDTO(Board board) {
this.id = board.getId();
this.title = board.getTitle();
this.content = board.getContent();
// Encoding클래스의 날짜변환 메서드 가져와 적용
this.createdAt = Encoding.formatToStr(board);
}
}
날짜 형태 변경 -출력 확인

Share article