회고록과 특별편도 작성했지만 아직 못다한 기능 구현을 조금씩 더 구현해보려 한다. 오늘은 비교적 간단한 공지사항 영역 보강이다.
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 <= #{end,jdbcType=INTEGER}
)
WHERE RNUM >= #{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 <= #{end,jdbcType=INTEGER}
)
WHERE RNUM >= #{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 <= #{end,jdbcType=INTEGER}
)
WHERE RNUM >= #{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 문을 작성했다.
- 아무것도 검색어로 작성하지 않았을 경우
- 제목 키워드로 검색하는 경우
- 내용 키워드로 검색하는 경우
- 제목+내용 키워드로 검색하는 경우
이 중 아무것도 작성하지 않은 경우에는 기존의 공지사항 리스트 조회와 같으므로 해당 action 을 요청하는 식으로 기존 코드를 재사용하는 방법을 택했다.
결과 확인

'Sist > Final Projet : I_Look' 카테고리의 다른 글
| 특별편. 프로젝트 진행 시 도움을 받은 포스팅 모음 (2) | 2025.05.24 |
|---|---|
| [Java Wep Application] 파이널 프로젝트 Ⅶ. 회고 (8) | 2025.05.22 |
| [Java Web Application] 파이널 프로젝트 Ⅵ. 기능 추가 구현 - 리뷰 미작성 시 평점 열람 제한 (1) | 2025.05.16 |
| [Java Web Application] 파이널 프로젝트 Ⅵ. 기능 추가 구현 - 1차 필터 신청 날짜 제한 (Flatpickr 라이브러리 활용) (1) | 2025.05.16 |
| [Java Wep Application] 파이널 프로젝트 Ⅴ. 프로젝트 결과물 (2) | 2025.05.14 |