이번에는 작성한 게시글의 전체 목록을 출력하는 페이지를 만들어 볼것이다.
/freeboard로 접속하게 되면 게시판 페이지에 모든 사용자들이 작성한 글을 출력하려고 한다.
1. freeboard.html
헤더부분은 이전 포스팅과 같이 네비바를 붙혀줬다. 게시판 기본 페이지에 사용자들이 작성한 글을 출력하고싶기 때문에 타임리프의 each를 사용해서 다음에 볼 controller에서 list라는 model객체로 보낸 Post객체 즉 게시글에 대한 정보가 담긴 Post객체를 list라는 변수로 모든 글 목록을 출력해줬다. 단 작성일은 Datetime 타입으로 DB에 들어가 있기 때문에 이쁜 모양으로 출력해주기 위해 포맷팅해줬다!
<div class="container-fluid px-4">
<h1 class="mt-4">자유게시판</h1>
<div class="card mb-4">
<div class="card-header">
<a class="btn btn-primary float-end" href="/freeboard/posting"> <!-- <i class="fas fa-table me-1"></i> -->
<i class="fas fa-edit" ></i> 글 작성
</a>
</div>
<div class="card-body">
<table class="table table-hover table-striped">
<thead>
<tr>
<th>글번호</th>
<th>작성자</th>
<th>제목</th>
<th>작성일</th>
</tr>
<tbody>
<!--5번-->
<!--list에 testboard가 담겨있는것을 하나씩 빼준다-->
<tr th:each="post : ${list}">
<td th:text="${post.boardId}"></td>
<td th:text="${post.author}"></td>
<td>
<a th:href="@{/freeboard/detail/{boardId}(boardId=${post.boardId})}" th:text="${post.title}"></a>
</td>
<td th:text="${#temporals.format(post.createdDate, 'yyyy-MM-dd')}"></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
2. Post.java & Basetime.java :: ProjectApplication.java
게시글을 작성할 때 작성시간과 수정한다면 수정 시간을 넣어주고 싶어서 처음 entity를 만들 때 BaseTime을 상속받았다.
@EnableJpaAuditing
@SpringBootApplication
public class BoardProjectApplication {
@PostConstruct
void init() {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
}
public static void main(String[] args) {
SpringApplication.run(BoardProjectApplication.class, args);
}
}
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTime {
//Entity가 생성되어 저장될 때 시간이 자동 저장됨.
@CreatedDate
protected LocalDateTime createdDate;
// 조회한 entity 값을 변경할 때 시간이 자동 저장됨.
@LastModifiedDate
protected LocalDateTime modifiedDate;
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class Post extends BaseTime{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long boardId;
private String author;
private String title;
private String content;
//forign key 글쓴이임
@ManyToOne
private Member member;
public void update(String title, String content) {
this.title = title;
this.content = content;
}
}
Post entity class가 BaseTime 추상 클래스를 상속 받았기 때문에 JPA가 생성 시간, 수정 시간을 인식할 수 있게 됐다. 그리고 영속성 컨텍스트에 저장 후 BaseTime 클래스의 Auditing 기능으로 인해 글 쓰기를 할 때 Hibernate가 자동으로 시간 값을 채워준다.
3.PostDTO.java
@NoArgsConstructor
@Getter
@Setter
public class PostDTO {
@NotBlank(message = "제목은 필수 입력값입니다.")
private String title;
@NotNull(message = "본문은 필수 입력값입니다.")
private String content;
public PostDTO(String title, String content) {
this.title = title;
this.content = content;
}
}
4. PostController.java
여기서도 네비바에 로그인 여부에 따라 이름과 버튼 출력을 해줘야 하기 때문에 로그인 여부를 확인해서 폼으로 보내줬다.
/freeboard URL에서 바로 글 목록을 출력해야 하기 때문에 postService.getPostList를 통해 글 목록 리스트를 받아와서 list라는 변수에 담아 폼으로 보내준다.
@Slf4j
@Controller
@RequiredArgsConstructor
@RequestMapping("/freeboard")
public class PostController {
private final PostService postService;
private final MemberService memberServiceImpl;
@GetMapping("")
public String getFreeboard(Model model, Principal principal) {
if(principal != null) {
model.addAttribute("isSignedIn", true);
}
else {
model.addAttribute("isSignedIn", false);
}
List<Post> boardList = postService.getPostList();
model.addAttribute("list", boardList);
return "/board/freeboard";
}
}
5. PostService.java
여기서는 postRepository에서 JPA를 활용하여 모든 리스트를 불러온다.
@Service
@RequiredArgsConstructor
public class PostService {
private final MemberService memberService;
private final PostRepository postRepository;
public List<Post> getPostList() {
return postRepository.findAllByOrderByCreatedDateDesc();
}
}
5. PostService.java
나중에 따로 JPA에 대해 포스팅 할 예정이지만 여기서 사용된 메서드만 보면 findAllByOrderByCreateDateDesc는 모든 Post테이블에 있는 값을 가져오지만 뒤에 OrderByCreatedDateDesc로 인해 CreatedDate가 내림차순 즉 최근에 작성한 글 순서대로 불러온다는 뜻이다. 이 메서드 이름을 토대로 JPA가 쿼리문을 짜준다. 물론 복잡한 쿼리문은 메서드 이름 위에 @query로 직접 쿼리문을 작성해서 값을 가져올 수도 있다.
public interface PostRepository extends JpaRepository<Post, Long>{
List<Post> findAllByOrderByCreatedDateDesc();
}
성공..!
다음 편에서는 글을 작성하는 기능을 만들어 볼 것이다.
만들고 싶은 서비스를 스스로 공부하고 만들어 보면서 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분 혹은 궁금한 점은 언제든지 댓글로 남겨주세요🧐
'Projects > 식단 짜주는 웹' 카테고리의 다른 글
[Spring/식단 추천 API] 게시판 글 수정 기능 구현 - 6 (0) | 2023.11.18 |
---|---|
[Spring/식단 추천 API] 게시판 글 상세보기 기능 구현 - 5 (0) | 2023.11.16 |
[Spring/식단 추천 API] 게시판 글 작성 기능 구현 - 4 (1) | 2023.11.16 |
[Spring/식단 추천 API] 로그인 기능 구현 - 2 (1) | 2023.11.11 |
[Spring/식단 추천 API] 회원가입 기능 구현 - 1 (0) | 2023.10.26 |