Sist/Final Projet : I_Look

[Java Web Application] 파이널 프로젝트 Ⅵ. 기능 추가 구현 - 공지사항 게시판 C(R)UD

iridiscente 2025. 6. 2. 18:57

회고록과 특별편도 작성했지만 아직 못다한 기능 구현을 조금씩 더 구현해보려 한다. 오늘은 비교적 간단한 공지사항 영역 보강이다.

1. 공지사항 조회수 증가

조회수 증가 기능 구현은 간단하다.

  • SQL Mapper 에 조회수 증가 쿼리 작성 후
  • 게시물 클릭 시 (작동하는 컨트롤러에)
  • 위 쿼리(조회수 증가 쿼리)를 실행하도록 하면 끝!

하나씩 빠르게 살펴보자.

 

조회수 증가 쿼리

<!-- 조회 수 1 씩 증가 -->
<update id="increaseHit" parameterType="java.lang.String">
    UPDATE NOTICES
    SET HITCOUNT = HITCOUNT + 1
    WHERE NOTICE_ID = #{notice_id}
</update>

 

게시물 클릭 시 작동 컨트롤러

// ● 공지사항 게시물 상세 페이지
@RequestMapping(value="/noticedetail.action", method = RequestMethod.GET)
public String noticeDetail(@RequestParam("noticeId") String noticeId
                         , @RequestParam("noticeRnum") String noticeRnum
                         , HttpSession session, Model model)
{
    String result = null;

    // 페이지 접근 권한 확인 ------------------------------------------
    ParDTO parent = (ParDTO) session.getAttribute("loginParent");
    SitDTO sitter = (SitDTO) session.getAttribute("loginSitter");
    AdminDTO admin = (AdminDTO) session.getAttribute("loginAdmin");

    if (parent == null && sitter == null && admin == null)
        return "redirect:/iLook.action";

    // 접근 권한 있다면 아래 내용 순차 진행
    //----------------------------------------------------------------

    // (이전 페이지에서 건네 받은) 공지사항 코드로
    INoticeDAO noticeDao = sqlSession.getMapper(INoticeDAO.class);

    // *** 여기에 조회수를 1만큼 증가시키는 코드 작성 ***

    // 특정 게시물 정보 조회
    NoticeDTO noticeDetail = noticeDao.noticeDetail(noticeId);

    // 다음 페이지로 넘겨주는 값
    // → 특정 게시물 정보, 게시물 번호
    model.addAttribute("noticeDetail", noticeDetail);
    model.addAttribute("noticeRnum", noticeRnum);

    // → 헤더 import 를 위한 값
    model.addAttribute("parent", parent);
    model.addAttribute("sitter", sitter);
    model.addAttribute("admin", admin);

    result = "WEB-INF/view/noticeDetail.jsp";

    return result;
}

 

조회수 증가 쿼리 실행 구문 추가

int num = noticeDao.increaseHit(noticeId);

if (num != 0)
    System.out.println("조회수 업데이트 완료");
else
    System.out.println("조회수 업데이트 실패");

 

꼭 필요한 건 아니지만, 조회수 업데이트 여부를 확인 메시지도 간단히 표시되도록 했다. 바로 작동하는지 확인해보자.

 

결과 확인

공지사항 조회수 증가 기능 확인
공지사항 조회수 증가 기능 확인

 

(.gif 로 업로드는 처음인데 확실히 눈에 잘 보이는 것 같다. 필요에 따라 종종 이용해야지.)


2. 공지사항 등록

2.1 작성 내용 초기화/목록으로

기존에도 만들어뒀지만 다시 한 번 짚고 넘어가보는 초기화 기능! 입력 폼 페이지의 스크립트 영역에서 다뤘으며 아래와 같다.

 

noticeInsert.jsp 내 script 영역

<script type="text/javascript">
    
    // 이 페이지 로드 시,
    document.addEventListener('DOMContentLoaded', function()
    {
        // ...
        
    	// 2. 초기화 버튼 클릭 시 확인 후 초기화
    	$("#reset").click(function(e)
    	{
    	    var userConfirmed = confirm("작성한 내용이 초기화 됩니다.\n정말 초기화 하시겠습니까?");
    	    
    	    if (userConfirmed)
    	    {
    	        //alert("textarea 초기화 완료");
    	        $("#subject-input").val('');	// 제목 초기화
    	        $("#content-input").val('');	// 내용 초기화
    	    }
    	    else
    	    {
    	        e.preventDefault(); // 폼 제출을 막고 현재 페이지에 머물게 함
    	        return; // 추가적인 동작을 막음
    	    }
    	});
    	
    	// 3. 목록으로 버튼 클릭 시 확인 후 목록으로
    	$("#back").click(function(e)
        {
            var userConfirmed = confirm("작성한 내용이 저장되지 않습니다.\n정말 목록으로 돌아가시겠습니까?");

            if (userConfirmed)
            {
            	window.location.href='<%=cp%>/noticelist.action';	// 목록으로
            }
            else
            {
                e.preventDefault(); // 폼 제출을 막고 현재 페이지에 머물게 함
                return; // 추가적인 동작을 막음
            }
        });
        
    });

</script>

 

굳이 특이사항을 찾아보자면 아래와 같다.

  • confirm 을 이용해 초기화 여부를 확인 후 초기화
  • 경고창 작성 시 개행문자는 "\n"
  • 폼 제출 막는 e.preventDefault();

결과 확인

공지사항 초기화/목록으로
공지사항 초기화/목록으로

2.2 공지사항 등록

이번에는 진짜 등록 과정이다. 사실 이것도 기존에 등록 페이지 이동까지는 잡아둔 틀이 있어서 어렵지는 않았다. 순서는 다음과 같다.

  • SQL Mapper 에 공지사항 등록 쿼리 작성 후
  • 게시물 등록 페이지 내 등록 버튼 클릭 시 (작동하는 컨트롤러를 작성하여)
  • 위 쿼리(공지사항 등록 쿼리)를 실행하도록 하면 끝!

공지사항 등록 쿼리

<!-- 공지사항 데이터 추가 -->	
<insert id="add" parameterType="com.team1.dto.NoticeDTO">
<selectKey keyProperty="notice_id" resultType="String" order="BEFORE">
    SELECT 'ANOT' || LPAD(SEQ_ANOT.NEXTVAL, 4, '0') 
    FROM DUAL
</selectKey>
    INSERT INTO NOTICES VALUES(#{notice_id}, #{notice_type_id}, #{subject}, #{content}, 0, SYSDATE)
</insert>

 

기존 일반 돌봄 예약 신청이나 결제 내역 INSERT 문과 마찬가지고 <selectKey> 태그의 order="BEFORE"로 시퀀스를 먼저 생성해 notice_id 로 활용해준다. 그리고 나머지 항목은 관리자가 입력한대로 (name 속성을 이용해) 가져와서 사용해준다.

 

(게시물 작성 후) 등록 버튼 클릭 시 작동 컨트롤러

// ● 공지사항 게시물 등록
@RequestMapping(value="/noticeinsert.action", method = RequestMethod.POST)
public String noticeInsert(HttpSession session, Model model, NoticeDTO dto)
{
    String result = null;

    // 페이지 접근 권한 확인 ------------------------------------------
    AdminDTO admin = (AdminDTO) session.getAttribute("loginAdmin");

    if (admin == null)
        return "redirect:/iLook.action";

    // 접근 권한 있다면 아래 내용 순차 진행
    //----------------------------------------------------------------

    // 공지사항 등록
    INoticeDAO noticeDao = sqlSession.getMapper(INoticeDAO.class);
    noticeDao.add(dto);

    result = "redirect:/noticelist.action";

    return result;
}

 

기본적으로 등록 작업은 쿼리만 실행하면 되지만, 현재 상태로는 게시물 본문의 개행이 제대로 작동하지 않을 수 있기 때문에 개행 부분을 살리는 작업도 더해져야 한다.

 

개행 문자 교체

// ● 공지사항 게시물 등록
@RequestMapping(value="/noticeinsert.action", method = RequestMethod.POST)
public String noticeInsert(HttpSession session, Model model, NoticeDTO dto)
{
    String result = null;

    // 페이지 접근 권한 확인 ------------------------------------------
    AdminDTO admin = (AdminDTO) session.getAttribute("loginAdmin");

    if (admin == null)
        return "redirect:/iLook.action";

    // 접근 권한 있다면 아래 내용 순차 진행
    //----------------------------------------------------------------

    // *** 개행 내용 살리기 ***
    String contentTemp = dto.getContent();
    String content = contentTemp.replace("\n", "<br>");
    dto.setContent(content);

    // 공지사항 등록
    INoticeDAO noticeDao = sqlSession.getMapper(INoticeDAO.class);
    int num = noticeDao.add(dto);

    // *** 등록 성공 여부 로그 ***
    if (num != 0)
        System.out.println("게시물 등록 완료");
    else
        System.out.println("게시물 등록 실패");

    result = "redirect:/noticelist.action";

    return result;
}

 

특이 사항이 있다면 아래와 같다.

  • String.replce 로 입력된 문자열 내 개행 문자를 <br>로 교체 후 서버 저장
  • 등록 작업 이후 기존 페이지 호출 시 redirect 이용

결과 확인

공지사항 등록
공지사항 등록

 

게시물 등록은 물론 조회수 증가, 페이지네이션까지 잘 작동한다.


3. 공지사항 수정

공지사항 등록, 열람이 되는 상황이니 다음은 수정이다.

  • SQL Mapper 에 공지사항 수정 쿼리 작성 후
  • 게시물 수정 페이지로 이동 (페이지 이동 컨트롤러 작성)
  • 공지사항 수정 후 페이지 내 수정 버튼 클릭 시 (작동하는 컨트롤러를 작성하여)
  • 위 쿼리(공지사항 수정 쿼리)를 실행하도록 하면 마찬가지고 끝!

공지사항 수정 쿼리

<!-- 공지사항 수정 -->	
<update id="modify" parameterType="com.team1.dto.NoticeDTO">
    UPDATE NOTICES
    SET NOTICE_TYPE_ID=#{notice_type_id}, SUBJECT=#{subject}, CONTENT=#{content}
    WHERE NOTICE_ID=#{notice_id}
</update>

 

기존 기획해둔 방침에 따라 수정 가능한 영역은 등록과 마찬가지로 공지사항 유형, 제목, 내용 뿐이다. 수정한 날짜는 별도로 반영되지 않는다.

 

게시물 수정 페이지 이동 컨트롤러

// ● 공지사항 게시물 수정 페이지
@RequestMapping(value="/noticeupdateform.action", method = RequestMethod.GET)
public String noticeUpdateForm(HttpSession session, Model model
                             , @RequestParam("notice_id") String noticeId
                             , @RequestParam("noticeRnum") String noticeRnum)
{
    String result = null;

    // 페이지 접근 권한 확인 ------------------------------------------
    AdminDTO admin = (AdminDTO) session.getAttribute("loginAdmin");

    if (admin == null)
        return "redirect:/iLook.action";

    // 접근 권한 있다면 아래 내용 순차 진행
    //----------------------------------------------------------------

    // (이전 페이지에서 건네 받은) 공지사항 코드로
    // 특정 게시물 정보 조회
    INoticeDAO noticeDao = sqlSession.getMapper(INoticeDAO.class);		
    NoticeDTO noticeDetail = noticeDao.noticeDetail(noticeId);

    // 조회된 항목 중 게시물 본문 개행 문자 변경
    String contentTemp = noticeDetail.getContent();
    String content = contentTemp.replace("<br>", "\n");
    noticeDetail.setContent(content);

    // 공지사항 유형 리스트 조회
    ArrayList<NoticeDTO> listType = noticeDao.listType();

    // 다음 페이지로 넘겨주는 값
    // → 특정 게시물 정보, 게시물 번호, 공지사항 유형 리스트
    model.addAttribute("noticeDetail", noticeDetail);
    model.addAttribute("noticeRnum", noticeRnum);
    model.addAttribute("listType", listType);

    result = "WEB-INF/view/noticeUpdateForm.jsp";

    return result;
}

 

게시물 수정 페이지에서는 본문 내용이 <textarea>안에 담기므로 개행 문자를 "<br>"에서 "\n"으로 변경해준다.

또한, 글 번호를 함께 표시하기 위해 noticeRnum 도 모델에 건네준다.

수정하기 위해 기존 내용을 출력해야 하는데, 내 경우 이전 페이지에서 해당 값을 가져가는 것이 아니라, 새 페이지로 넘어가면서 noticeId(게시물 식별번호)로 필요한 내용을 다시 조회하는 방향을 택했다.

 

(게시물 수정 후) 수정 버튼 클릭 시 컨트롤러

// ● 공지사항 게시물 수정
@RequestMapping(value="/noticeupdate.action", method = RequestMethod.POST)
public String noticeUpdate(HttpSession session, Model model, NoticeDTO dto
                         , @RequestParam("notice_id") String noticeId)
{
    String result = null;

    // 페이지 접근 권한 확인 ------------------------------------------
    AdminDTO admin = (AdminDTO) session.getAttribute("loginAdmin");

    if (admin == null)
        return "redirect:/iLook.action";

    // 접근 권한 있다면 아래 내용 순차 진행
    //----------------------------------------------------------------

    // 개행 내용 살리기
    String contentTemp = dto.getContent();
    String content = contentTemp.replace("\n", "<br>");
    dto.setContent(content);

    // 게시물 식별번호 세팅
    dto.setNotice_id(noticeId);

    // 공지사항 수정
    INoticeDAO noticeDao = sqlSession.getMapper(INoticeDAO.class);
    int num = noticeDao.modify(dto);

    if (num != 0)
        System.out.println("게시물 수정 완료");
    else
        System.out.println("게시물 수정 실패");

    result = "redirect:/noticelist.action";

    return result;
}

 

게시물 수정 완료 후 본문 내용 저장 시에는 게시물 열람 시 html로 펼쳐질 수 있도록 개행 문자를 다시 "\n"에서 "<br>"로 변경해준다.

그리고 (이전 페이지에서 받아온) 변경 내용이 담긴 dto에 noticeId(게시물 식별번호)를 마저 담아준 뒤 게시물 수정 작업을 처리한다.

 

결과 확인

공지사항 수정


4. 공지사항 삭제

삭제는 별도의 페이지가 필요하지 않다. 대신 우리 프로그램은 한 번 지운 게시물을 복구할 수는 없는 구조를 가지므로, 경고창을 띄우는 함수(deleteNotice)를 통해 삭제 여부를 한 번 더 확인하는 식으로 구성했다. (초기화 여부 확인과 유사하다.)

  • SQL Mapper 에 공지사항 삭제 쿼리 작성 후
  • 게시물 삭제 버튼 클릭 시 (작동하는 컨트롤러를 작성하여)
  • 위 쿼리(공지사항 수정 쿼리)를 실행

공지사항 삭제 쿼리

<!-- 공지사항 삭제 -->	
<delete id="remove" >
    DELETE
    FROM NOTICES
    WHERE NOTICE_ID=#{notice_id}
</delete>

 

앞선 내용이었던 게시물 수정과의 차이점은, 다른 부가 정보 없이 게시물 식별번호만 있으면 해당 게시물을 삭제할 수 있다는 것!

 

공지사항 게시물 삭제 컨트롤러

// ● 공지사항 게시물 삭제
@RequestMapping(value="/noticedelete.action", method = RequestMethod.GET)
public String noticeDelete(HttpSession session, Model model
                         , @RequestParam("notice_id") String noticeId)
{
    String result = null;

    // 페이지 접근 권한 확인 ------------------------------------------
    AdminDTO admin = (AdminDTO) session.getAttribute("loginAdmin");

    if (admin == null)
        return "redirect:/iLook.action";

    // 접근 권한 있다면 아래 내용 순차 진행
    //----------------------------------------------------------------

    // 공지사항 삭제
    INoticeDAO noticeDao = sqlSession.getMapper(INoticeDAO.class);
    int num = noticeDao.remove(noticeId);

    if (num != 0)
        System.out.println("게시물 삭제 완료");
    else
        System.out.println("게시물 삭제 실패");

    result = "redirect:/noticelist.action";

    return result;

}

 

공지사항 삭제 여부 확인 스크립트

// 함수2. 공지사항 삭제
function deleteNotice()
{
    var userConfirmed = confirm("정말 삭제하시겠습니까?");

    if (userConfirmed)
    {
        // 삭제 액션 처리
        alert("공지사항 삭제가 완료되었습니다.");

        var noticeId = document.getElementById('notice_id').value;
        window.location.href='<%=cp%>/noticedelete.action?notice_id=' + noticeId;
    }
    else
    {
        e.preventDefault(); // 폼 제출을 막고 현재 페이지에 머물게 함
        return; // 추가적인 동작을 막음
    }
}

 

결과 확인

공지사항 삭제


5. 공지사항 조회(검색)

마지막으로 공지사항 검색 기능이다. 검색종류(제목, 내용, 제목+내용)에 따라 결과 페이지가 다르게 나타나야 하며, 동시에 페이지네이션(페이지 처리)도 가능해야 한다. 기존 일반 돌봄 1차/2차 필터처럼 결과영역에 AJAX를 활용할까 하다가 이번에는 if else를 활용하여 작성했다.

  • 검색어 입력에 따른 검색 결과 및 조회된 건수를 나타내는 쿼리를 각각 작성
  • 검색 기능이 작동하도록 컨트롤러 작성
  • 버튼 클릭 시 위 과정이 이루어지도록 스크립트 작성

공지사항 검색 결과 리스트 쿼리

<!-- 공지사항 검색 (제목) -->	
<select id="searchSubject" resultType="com.team1.dto.NoticeDTO">
    SELECT *
    FROM (
        SELECT ROWNUM AS RNUM, DATA.*
        FROM (
                SELECT N.NOTICE_ID, T.TYPE, N.SUBJECT, N.CONTENT, N.HITCOUNT, N.NOTICED_DATE
                FROM NOTICES N
                JOIN NOTICE_TYPE T 
                  ON N.NOTICE_TYPE_ID = T.NOTICE_TYPE_ID
                <where>
                    <if test="search_text != null and search_text != ''">
                        AND N.SUBJECT LIKE '%' || #{search_text} || '%'
                    </if>
                </where>
                ORDER BY N.NOTICED_DATE DESC
             ) DATA
        WHERE ROWNUM &lt;= #{end,jdbcType=INTEGER}
    ) 
    WHERE RNUM &gt;= #{start,jdbcType=INTEGER}
</select>

<!-- 공지사항 검색 (내용) -->	
<select id="searchContent" resultType="com.team1.dto.NoticeDTO">
    SELECT *
    FROM (
        SELECT ROWNUM AS RNUM, DATA.*
        FROM (
                SELECT N.NOTICE_ID, T.TYPE, N.SUBJECT, N.CONTENT, N.HITCOUNT, N.NOTICED_DATE
                FROM NOTICES N
                JOIN NOTICE_TYPE T 
                  ON N.NOTICE_TYPE_ID = T.NOTICE_TYPE_ID
                <where>
                    <if test="search_text != null and search_text != ''">
                        AND N.CONTENT LIKE '%' || #{search_text} || '%'
                    </if>
                </where>
                ORDER BY N.NOTICED_DATE DESC
            ) DATA
        WHERE ROWNUM &lt;= #{end,jdbcType=INTEGER}
    ) 
    WHERE RNUM &gt;= #{start,jdbcType=INTEGER}
</select>

<!-- 공지사항 검색 (제목+내용) -->	
<select id="searchSubjectOrContent" resultType="com.team1.dto.NoticeDTO">
    SELECT *
    FROM (
        SELECT ROWNUM AS RNUM, DATA.*
        FROM (
                SELECT N.NOTICE_ID, T.TYPE, N.SUBJECT, N.CONTENT, N.HITCOUNT, N.NOTICED_DATE
                FROM NOTICES N
                JOIN NOTICE_TYPE T 
                  ON N.NOTICE_TYPE_ID = T.NOTICE_TYPE_ID
                <where>
                    <if test="search_text != null and search_text != ''">
                        AND ((N.SUBJECT LIKE '%' || #{search_text} || '%')
                        OR (N.CONTENT LIKE '%' || #{search_text} || '%'))
                    </if>
                </where>
                ORDER BY N.NOTICED_DATE DESC
            ) DATA
        WHERE ROWNUM &lt;= #{end,jdbcType=INTEGER}
    ) 
    WHERE RNUM &gt;= #{start,jdbcType=INTEGER}
</select>

 

공지사항 검색 결과 건수 쿼리

<!-- 공지사항 검색 (제목) 게시물 수 확인 -->	
<select id="countSearchSubject" resultType="java.lang.Integer">
    SELECT COUNT(*) AS COUNT
    FROM NOTICES N
    JOIN NOTICE_TYPE T 
      ON N.NOTICE_TYPE_ID = T.NOTICE_TYPE_ID
    <where>
        <if test="search_text != null and search_text != ''">
            AND N.SUBJECT LIKE '%' || #{search_text} || '%'
        </if>
    </where>
    ORDER BY N.NOTICED_DATE DESC
</select>

<!-- 공지사항 검색 (내용) 게시물 수 확인 -->	
<select id="countSearchContent" resultType="java.lang.Integer">
    SELECT COUNT(*) AS COUNT
    FROM NOTICES N
    JOIN NOTICE_TYPE T 
      ON N.NOTICE_TYPE_ID = T.NOTICE_TYPE_ID
    <where>
        <if test="search_text != null and search_text != ''">
            AND N.CONTENT LIKE '%' || #{search_text} || '%'
        </if>
    </where>
    ORDER BY N.NOTICED_DATE DESC
</select>

<!-- 공지사항 검색 (제목+내용) 게시물 수 확인 -->	
<select id="countSearchSubjectOrContent" resultType="java.lang.Integer">
    SELECT COUNT(*) AS COUNT
    FROM NOTICES N
    JOIN NOTICE_TYPE T 
      ON N.NOTICE_TYPE_ID = T.NOTICE_TYPE_ID
    <where>
        <if test="search_text != null and search_text != ''">
            AND ((N.SUBJECT LIKE '%' || #{search_text} || '%')
            OR (N.CONTENT LIKE '%' || #{search_text} || '%'))
        </if>
    </where>
    ORDER BY N.NOTICED_DATE DESC
</select>

 

공지사항 검색 컨트롤러

// ● 공지사항 검색 따른 리스트 페이지
@RequestMapping(value="/noticesearch.action", method = {RequestMethod.GET, RequestMethod.POST})
public String noitceSearch(@RequestParam(value = "page", defaultValue="1") int page
                       , @RequestParam("notice_search_type") String noticeSearchType
                       , @RequestParam("search_text") String searchText
                       , HttpSession session, Model model)
{
    String result = null;

    // 페이지 접근 권한 확인 ------------------------------------------
    ParDTO parent = (ParDTO) session.getAttribute("loginParent");
    SitDTO sitter = (SitDTO) session.getAttribute("loginSitter");
    AdminDTO admin = (AdminDTO) session.getAttribute("loginAdmin");

    if (parent == null && sitter == null && admin == null)
        return "redirect:/iLook.action";

    // 접근 권한 있다면 아래 내용 순차 진행
    //----------------------------------------------------------------

    if (searchText.equals(""))
    {
        result = "redirect:/noticelist.action";
        return result;
    }
    else if (noticeSearchType.equals("subject"))
    {
        // 공지사항 게시물 수
        INoticeDAO noticeDao = sqlSession.getMapper(INoticeDAO.class);
        //int countNotice = noticeDao.count();
        int countNotice = noticeDao.countSearchSubject(searchText);

        // 페이징 객체 생성
        PageHandler paging = new PageHandler(page, countNotice);

        // dto 에 페이징 정보 추가
        NoticeDTO dto = new NoticeDTO();
        dto.setStart(paging.getStart());
        dto.setEnd(paging.getEnd());
        dto.setSearch_text(searchText);

        // 공지사항 게시물 리스트
        ArrayList<NoticeDTO> listNotice = new ArrayList<NoticeDTO>();
        listNotice = noticeDao.searchSubject(dto);

        // 다음 페이지로 넘겨주는 값
        // → 공지사항 게시물 리스트, 게시물 수, 페이징 객체
        model.addAttribute("listNotice", listNotice);
        model.addAttribute("countNotice", countNotice);
        model.addAttribute("paging", paging);
    }
    else if (noticeSearchType.equals("content"))
    {
        // 공지사항 게시물 수
        INoticeDAO noticeDao = sqlSession.getMapper(INoticeDAO.class);
        //int countNotice = noticeDao.count();
        int countNotice = noticeDao.countSearchContent(searchText);

        // 페이징 객체 생성
        PageHandler paging = new PageHandler(page, countNotice);

        // dto 에 페이징 정보 추가
        NoticeDTO dto = new NoticeDTO();
        dto.setStart(paging.getStart());
        dto.setEnd(paging.getEnd());
        dto.setSearch_text(searchText);

        // 공지사항 게시물 리스트
        ArrayList<NoticeDTO> listNotice = new ArrayList<NoticeDTO>();
        listNotice = noticeDao.searchContent(dto);

        // 다음 페이지로 넘겨주는 값
        // → 공지사항 게시물 리스트, 게시물 수, 페이징 객체
        model.addAttribute("listNotice", listNotice);
        model.addAttribute("countNotice", countNotice);
        model.addAttribute("paging", paging);
    }
    else if (noticeSearchType.equals("subject_content"))
    {
        // 공지사항 게시물 수
        INoticeDAO noticeDao = sqlSession.getMapper(INoticeDAO.class);
        //int countNotice = noticeDao.count();
        int countNotice = noticeDao.countSearchSubjectOrContent(searchText);

        // 페이징 객체 생성
        PageHandler paging = new PageHandler(page, countNotice);

        // dto 에 페이징 정보 추가
        NoticeDTO dto = new NoticeDTO();
        dto.setStart(paging.getStart());
        dto.setEnd(paging.getEnd());
        dto.setSearch_text(searchText);

        // 공지사항 게시물 리스트
        ArrayList<NoticeDTO> listNotice = new ArrayList<NoticeDTO>();
        listNotice = noticeDao.searchSubjectOrContent(dto);

        // 다음 페이지로 넘겨주는 값
        // → 공지사항 게시물 리스트, 게시물 수, 페이징 객체
        model.addAttribute("listNotice", listNotice);
        model.addAttribute("countNotice", countNotice);
        model.addAttribute("paging", paging);
    }


    // → 헤더 import 를 위한 값
    model.addAttribute("parent", parent);
    model.addAttribute("sitter", sitter);
    model.addAttribute("admin", admin);

    result = "WEB-INF/view/noticeList.jsp";

    return result;
}

 

컨트롤러의 경우 크게 4가지로 나누어 if else 문을 작성했다.

  1. 아무것도 검색어로 작성하지 않았을 경우
  2. 제목 키워드로 검색하는 경우
  3. 내용 키워드로 검색하는 경우
  4. 제목+내용 키워드로 검색하는 경우

이 중 아무것도 작성하지 않은 경우에는 기존의 공지사항 리스트 조회와 같으므로 해당 action 을 요청하는 식으로 기존 코드를 재사용하는 방법을 택했다.

 

결과 확인

공지사항 검색 기능