쌓고 쌓다
[스프링 부트] 게시글 상단 고정(공지사항) - 24 본문
공지사항 기능을 위해
공지사항 테이블을 따로 만들까, 게시글에 카테고리 컬럼을 추가할까... 이런저런 생각하다가
일단 상단 고정 기능부터 만들어봤다.
Poster 클래스 fix 필드 추가
@Entity
@Getter
@Setter
public class Poster {
private Boolean fix;
}
고정할 게시글인지 fix 필드로 구별한다.
Poster 테이블 fix 컬럼 추가
alter table poster add fix boolean; -- BOOLEAN = tinyint(1) --
고정할 게시글은 fix 컬럼의 0과 1로 구별한다.
게시글 작성 폼
<form th:action="@{|/posters/${category}|}" method="post" th:object="${poster}">
<div>
<input type="checkbox" th:field="*{fix}">
<label th:text="'상단 고정'"></label>
</div>
</form>
체크박스로 게시글 고정 유무를 설정하다.
게시글 목록 HTML
<table class="table table-hover">
<th>No</th>
<th></th> <!-- Image -->
<th>title</th>
<th>writer</th>
<th>date</th>
<!-- 상단 고정 게시글 출력 -->
<tr th:each="fixedPoster : ${fixedPosters}" style="background-color: whitesmoke">
<td th:text="[알림]" style="color: green"></td>
<td><img width="50" height="50" th:if="${fixedPoster.getImgFiles().size()}!=0" th:src="|/images/${fixedPoster.getImgFiles().get(0).getStoreFileName()}|"></td>
<td><a th:text="|${fixedPoster.title} [${fixedPoster.commentCnt}]|" th:href="@{|/posters/view/${fixedPoster.id}|}" style="text-decoration-line: none;"></a></td>
<td th:text="${fixedPoster.writer}"></td>
<td th:text="${#temporals.format(fixedPoster.regdate, 'yyyy.MM.dd HH:mm')}"></td>
</tr>
<!-- 게시글 목록 출력 -->
<tr th:each="poster : ${posters}" height="70">
...
</tr>
</table>
게시글 목록 출력 위에
반복문으로 해당 카테고리의 고정된 게시글을 출력하는 태그를 추가했다.
고정 게시글들을 모두 출력하고 기본 페이징으로 보여지는 게시글을 뿌려준다.
게시글 수정 HTML
<form ... th:object="${poster}">
<div>
<input type="checkbox" th:field="*{fix}">
<label th:text="'상단 고정'"></label>
</div>
</form>
th:field로 불러온 poster 객체의 fix 값을 통해 자동으로 checked 옵션을 넣어준다.
(th:field가 id, name, value 옵션을 자동으로 넣어줌)
PosterRepository 추가
List<Poster> findByCategoryAndFix(Category category, Boolean fix);
게시글 카테고리마다 고정한 게시글을 분류하여 뿌려주기위해
카테고리와 고정 유무로 게시글들을 뽑아온다.
PosterController
List<Poster> fixedPoster = posterService.fixPosterList(category, true);
model.addAttribute("fixedPosters", fixedPoster);
요청한 카테고리에 따라 고정된 게시글들을 뽑아와 게시글 목록 HTML에 넣어준다.
동작 모습
'프로그래밍 > spring' 카테고리의 다른 글
[스프링 부트] BindingResult 사용 - 25 (0) | 2023.08.29 |
---|---|
유효성 검사 직접 처리 및 폼 데이터 유지 방법 (0) | 2023.08.27 |
메시지, 국제화 사용하기 (0) | 2023.08.21 |
컨트롤러 모든 메서드 Model에 값 넣기 - @ModelAttribute (0) | 2023.08.20 |
빈 순환 참조 발생 (The dependencies of some of the beans in the application context form a cycle) (0) | 2023.08.18 |
Comments