1. 엔티티 생성
2. 레포지토리 생성 및 쿼리문 작성
3. 서비스 작성
4. 컨트롤러 작성
5. html 작성
6. 완성 화면
1. Entity 생성
- 이전 페이지와 다음 페이지의 데이터를 담을 엔티티 작성
파일 경로 : com.mysite.sbb.question/QuestionPage.java
@Data
@Entity
public class QuestionPage {
@Id
private Integer id;
private String PREVID;
private String PREV_SUB;
private String NEXTID;
private String NEXT_SUB;
}
2. 레포지토리 인터페이스 생성 및 쿼리문 작성
- LAG 함수 : 기준 데이터의 이전 행의 값을 반환해주는 함수
- LEAD 함수 : 기준 데이터의 다음 행의 값을 반환해주는 함수
SELECT 조회할 컬럼 명 LAG (대상 컬럼명) OVER (ORDER BY 대상 컬럼명 정렬기준) AS 별칭 FROM 테이블 명
SELECT 조회할 컬럼 명 LEAD (대상 컬럼명) OVER (ORDER BY 대상 컬럼명 정렬기준) AS 별칭 FROM 테이블 명
- 글 번호를 기준으로 이전, 다음 데이터를 반환해오는 쿼리문 작성
SELECT * FROM(
SELECT
ID,
SUBJECT,
LAG(ID, 1, 0) OVER(ORDER BY ID ASC) AS PREBNO,
LAG(subject, 1, '이전글이 없습니다') OVER (ORDER BY ID) AS preb_sub,
LEAD(ID, 1, 0) OVER(ORDER BY ID ASC) AS NEXTBNO,
LEAD(subject, 1, '다음글이 없습니다') OVER (ORDER BY ID) AS next_sub
FROM QUESTION
)
ORDER BY id;
- DB에서 데이터가 제대로 조회되는 것을 확인할 수 있음
파일 경로 : com.mysite.sbb.question/QuestionPageRepository.java
public interface QuestionPageRepository extends JpaRepository<QuestionPage, Integer> {
@Query(value = "SELECT * FROM(SELECT ID, " +
"LAG(ID, 1, 0) OVER(ORDER BY ID ASC) AS PREVID, " +
"LAG(subject, 1, '이전글이 없습니다') OVER (ORDER BY ID ASC) AS PREV_SUB, " +
"LEAD(ID, 1, 0) OVER(ORDER BY ID ASC) AS NEXTID, " +
"LEAD(subject, 1, '다음글이 없습니다') OVER (ORDER BY ID ASC) AS NEXT_SUB " +
"FROM QUESTION) WHERE id = :id",
nativeQuery = true)
QuestionPage findByPages(Integer id);
}
3. 서비스 작성
- 레포지토리에 작성해둔 findByPages 메서드에서 question 엔티티의 id를 기준으로 쿼리문 실행하는 서비스 작성
파일 경로 : com.mysite.sbb.question/QuestionService.java
public QuestionPage getQuestionByPageId(Question question){
return questionPageRepository.findByPages(question.getId());
}
4. 컨트롤러 작성
- 이전글, 다음글 번호와 제목을 html에서 불러올 수 있게 model.addAttribute() 작성
파일 경로 : com.mysite.sbb.question/QuestionController.java
@RequestMapping(value = "/detail/{id}")
public String detail(Model model, @PathVariable("id") Integer id, AnswerForm answerForm,
@RequestParam(value="page", defaultValue="0") int page) {
~ 생략 ~
QuestionPage questionPage = questionPageRepository.findByPages(id);
model.addAttribute("prevID", questionPage.getPREVID());
model.addAttribute("prevSub", questionPage.getPREV_SUB());
model.addAttribute("nextID", questionPage.getNEXTID());
model.addAttribute("nextSub", questionPage.getNEXT_SUB());
return "question_detail";
}
-> 위의 코드를 두 줄로 줄일 수 있음
@RequestMapping(value = "/detail/{id}")
public String detail(Model model, @PathVariable("id") Integer id, AnswerForm answerForm,
@RequestParam(value="page", defaultValue="0") int page) {
~ 생략 ~
QuestionPage questionPage = questionPageRepository.findByPages(id);
model.addAttribute("questionPage", questionPage);
return "question_detail";
}
5. HTML 작성
- /question/detail/과 같은 문자열과 ${prevID}와 같은 자바 객체의 값을 더할 때는
반드시 다음처럼 |과 | 기호로 좌우를 감싸 주어야 함
파일 경로 : resources.templates/question_detail.html
<div>
<span>이전글</span>
<span><a th:href="@{|/question/detail/${prevID}|}"
th:text="*{prevSub}"></a></span>
</div>
<hr>
<div>
<span>다음글</span>
<span><a th:href="@{|/question/detail/${nextID}|}"
th:text="*{nextSub}"></a></span>
</div>
-> 줄이고 나서의 HTML 코드
<div>
<span>이전글</span>
<span><a th:href="@{|/question/detail/${questionPage.getPREV_ID()}|}"
th:text="*{questionPage.getPREV_SUB()}"></a></span>
</div>
<hr>
<div>
<span>다음글</span>
<span><a th:href="@{|/question/detail/${questionPage.getNEXT_ID()}|}"
th:text="*{questionPage.getNEXT_SUB()}"></a></span>
</div>
6. 완성 화면
'Language > Springboot' 카테고리의 다른 글
[Stringboot] 네이버지도 API에 현재 위치 받아오기 (0) | 2022.08.28 |
---|---|
[Stringboot] 제이쿼리(jQuery) 적용하기 (0) | 2022.08.28 |
[Springboot] 웹에 네이버지도 API 추가하기 (0) | 2022.08.26 |
[Stringboot] 게시글 댓글 페이징 기능 구현하기 (1) | 2022.08.25 |
[Springboot] 게시글 조회수 구현하기 (1) | 2022.08.25 |