Follow Work/SpringbootBoard

[Springboot] 이전글 다음글 만들기 [30]

ReCode.B 2022. 8. 25. 12:02
728x90

SpringBoot  ·  intelliJ  · OracleDB  ·  Thymeleaf 


1. 엔티티생성

이전페이지와 다음페이지의 데이터를 담을 엔티티 작성

QuestionPage.java

package com.gosari.repick_project.question;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.Id;

@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에서 데이터가 제대로 조회되는 것을 확인할 수 있다

 

QuestionPageRepository.java

package com.gosari.repick_project.question;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

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);
}
/* LAG 함수 : 기준 데이터의 이전 행의 값을 반환해주는 함수
 * LEAD 함수 : 기준 데이터의 다음 행의 값을 반환해주는 함수 */

 

3. 서비스 작성

레포지토리에 작성해둔 findByPages 메서드에서 question 엔티티의 id를 기준으로 쿼리문 실행하는 서비스 작성

QuestionService.java

public QuestionPage getQuestionByPageId(Question question){
    //레파지토리에 작성해둔 findByPages 메서드에서 question엔티티의 id를 기준으로 쿼리문을 실행
    return questionPageRepository.findByPages(question.getId());
}

 

4. 컨트롤러 작성

이전글, 다음글 번호와 제목을 html에서 불러올 수 있게 model.addAttribute() 작성

QuestionController.java

/*질문상세*/
@RequestMapping(value = "/detail/{id}")
public String detail(Model model, @PathVariable("id") Integer id, AnswerForm answerForm,
                     @RequestParam(value="page", defaultValue="0") int page) { /*AnswerForm추가*/

    Question question = this.questionService.getQuestion(id);
    model.addAttribute("question", question);

    /*이전글다음글번호와 제목을 html에서 불러올수있게 model.addAttribute() 작성*/
    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";
}

 

5. html 작성

qusetion_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>

/question/detail/과 같은 문자열과 ${prevID}와 같은 자바 객체의 값을 더할 때는

반드시 다음처럼 | | 기호로 좌우를 감싸 주어야 함

 

 

 

이전글 다음글 없을때 처리 : [Springboot] 이전글 다음글 없을 시 클릭 막기 [39] (tistory.com)

 

[Springboot] 이전글 다음글 없을 시 클릭 막기 [39]

SpringBoot  ·  intelliJ · OracleDB  ·  Thymeleaf [Springboot] 이전글 다음글 만들기 [30] (tistory.com) [Springboot] 이전글 다음글 만들기 [30] SpringBoot  ·  intelliJ · OracleDB  ..

rebornbb.tistory.com

 

728x90