gi_dor

spring 게시판 - 공지사항 하단 이전글 다음글 제목 본문

First/Spring

spring 게시판 - 공지사항 하단 이전글 다음글 제목

기돌 2023. 8. 3. 21:04
728x90

 

 

Mappr.xml

   <select id="selectPrev" parameterType="int" resultType="NoticeDTO">
        SELECT TITLE, NOTC_NO
        FROM notice
        WHERE NOTC_NO = #{notcNo} - 1
    </select>

    <select id="selectNext" parameterType="int" resultType="NoticeDTO">
        select TITLE, NOTC_NO
        from notice
        where NOTC_NO = #{notcNo} + 1
    </select>

 


 

에러

 

notcNo +1
notcNo -1

100번 글을 조회중 
notcNo+1 은 101번이 되고
notcNo -1 은 99번 이 된다 

만약 99번 과 101번을 삭제 했다면 
이전글은 98번과 다음글은 102 번이 되는데 +1 , -1 로 인해 98번과 102번으로 갈수가 없다.

delete from notice
where NOTC_NO = 99;

delete from notice
where NOTC_NO = 101;

 


해결방법

내가 원하는거는 이전 글과 다음글의 제목 각각 1개씩이니

조건으로 내가 제시한 숫자보다 작은 숫자 , 큰숫자만 조회해서

정렬 한뒤 LIMIT으로 맨 위에 나오는 행만 보이게 한다.

 SELECT TITLE, NOTC_NO
        FROM notice
        WHERE NOTC_NO < #{notcNo}
        ORDER BY NOTC_NO DESC
        LIMIT 1
        


SELECT TITLE, NOTC_NO
FROM notice
WHERE NOTC_NO < 100
ORDER BY NOTC_NO DESC
LIMIT 1


// 99가 삭제 되었고 100보다 작은수는 98 
// 역순으로 정렬해서 98 97 96 95 순서로 나오게 한뒤에 
// LIMIT 으로 맨첫번째 행만 보여준다.

 

 <select id="selectNext" parameterType="int" resultType="NoticeDTO">
        select TITLE, NOTC_NO
        from notice
        where NOTC_NO > #{notcNo}
        order by NOTC_NO asc
        LIMIT 1
    </select>
    
    
     <select id="selectNext" parameterType="int" resultType="NoticeDTO">
        select TITLE, NOTC_NO
        from notice
        where NOTC_NO > 100
        order by NOTC_NO asc
        LIMIT 1
    </select>
    
    
// 101번이 삭제된 이후 다음 큰수는 102 103 104 105 
// 오름차순으로 나타낸뒤 
// 맨위에 조회되는 102 만 보이게 LIMIT 1

 


주의
    <!--    이전 공지사항 제목 번호 조회-->
    <select id="selectPrev" parameterType="int" resultType="NoticeDTO">
        SELECT TITLE, NOTC_NO
        FROM notice
        WHERE NOTC_NO &lt; #{notcNo}
        ORDER BY NOTC_NO DESC
        LIMIT 1
    </select>

    <!--        다음 공지사항 제목 번호 조회-->
    <select id="selectNext" parameterType="int" resultType="NoticeDTO">
        select TITLE, NOTC_NO
        from notice
        where NOTC_NO &gt; #{notcNo}
        order by NOTC_NO asc
        LIMIT 1
    </select>

 

Mapper 에서는  >  , <  이런 등호가 먹히지 않는다고 한다 ?
&lt;   &gt; 를 사용 


 DAO

@Repository
public class NoticeDAOImpl implements NoticeDAO {
        @Autowired
        SqlSession session;

        String namespace = "com.teamProject.syusyu.NoticeMapper.";


        @Override
        public NoticeDTO selectPrev(Integer notcNo)throws Exception{
            return  session.selectOne(namespace+"selectPrev",notcNo);
        }

        @Override
        public NoticeDTO selectNext(Integer notcNo)throws Exception{
            return  session.selectOne(namespace+"selectNext",notcNo);
        }

    }

 

Service

@Service
    public class NoticeServiceImpl implements B_NoticeService {

            // DAO 주입시 생성자로 주입 받기!!!
            NoticeDAO noticeDao;

            @Autowired
            public NoticeServiceImpl(NoticeDAO noticeDao) {
                this.noticeDao = noticeDao;
            }

                @Override
            public NoticeDTO getPrevTitle(Integer notcNo) throws Exception {
                return noticeDao.selectPrev(notcNo);
            }

            @Override
            public NoticeDTO getNextTitle(Integer notcNo) throws Exception {
                return noticeDao.selectNext(notcNo);
            }
        }

 

Controller

   /**
    * notcNo 공지사항의 글 번호를 이용해서 해당 글을 읽음
    * notcNo 를 기준으로 이전 글과 다음글의 제목을 가져 온다.
    *
    * @param notcNo 공지사항의 번호 (글 번호)
    * @param sc 검색 조건 SearchCondition - page, pageSize, 검색바 -keyword,option
    * @return 공지사항 글 상세 페이지  notice.jsp
    * @throws Exception DB 조회 도중 발생할 수 있는 예외
    * @author han
    * @since  2023-07-31
    */
    // List/read?page=?&pageSize=?
    // 공지사항 글 읽기
    @GetMapping("/read")
    public String read(Integer notcNo, SearchCondition sc, Model m) throws Exception {
        try {
            // notcNo(글의 번호)를 이용해서 특정 공지사항 읽어오기
            NoticeDTO noticeDTO = noticeService.read(notcNo);

            // 이전 글과 다음 글의 제목 가져오기
            NoticeDTO prevNotice = noticeService.getPrevTitle(notcNo);
            NoticeDTO nextNotice = noticeService.getNextTitle(notcNo);

            // 이전 글과 다음 글의 제목을 모델에 추가해서 View 로 전달해줌
            m.addAttribute("prevTitle", prevNotice != null ? prevNotice.getTitle() : null);
            m.addAttribute("nextTitle", nextNotice != null ? nextNotice.getTitle() : null);

            // 이전 글과 다음 글의 번호를 모델에 추가
            m.addAttribute("prevNo", prevNotice != null ? prevNotice.getNotcNo() : null);
            m.addAttribute("nextNo", nextNotice != null ? nextNotice.getNotcNo() : null);





            // 조회한 공지사항의 글 정보와 검색조건(SearchCondition)을 모델에 추가해서 View로
            m.addAttribute("noticeDTO", noticeDTO);
            m.addAttribute("sc", sc);
            // m.addAttribute("page", page);
            // m.addAttribute("pageSize", pageSize);
            // 매개변수 Integer page , Integer pageSize 에서 SearchCondition 사용

        } catch (Exception e) {
            e.printStackTrace();
        }

        return ViewPath.FOS_HELP+"notice";
        // ViewPath :    public static final String FOS_HELP = ".help" + FOS + "cs/help/";

    }
728x90