두 번째로 추가하는 기능은, "평점 열람 제한"이다. 앞선 기능에 비해 상대적으로 간단하다.
- 돌봄 이용이 종료된 부모 회원이 리뷰를 작성하지 않을 경우
→ 돌봄 종료일로부터 7일간 시터 평점 열람을 제한하는 기능이다.
7일이 지나면 시터 평점은 다시 노출되지만, 당장 시터의 평점을 볼 수 없기 때문에 부모로 하여금 리뷰를 작성하도록 하는 기능이다. 생각보다 간단히 구현되었으니 빠르게 알아보자.
1. 쿼리 작성
먼저, 우리 프로젝트 구조 상 시터 평점 열람 제한 대상자는 다음과 같은 조건을 동시에 만족한다.
- 일반 돌봄 예약 확정 테이블에 존재
- 일반 돌봄 예약 확정 후 시터 취소 테이블에 미존재
- 일반 돌봄 예약 확정 후 부모 취소 테이블에 미존재
- 일반 돌봄 리뷰 테이블에 미존재
- 일반 돌봄 종료일이 지난 경우
- 일반 돌봄 종료일로부터 일주일 이내인 경우
그리고 이를 기반으로 작성한 쿼리는 아래와 같다. (Oracle)
SELECT COUNT(*) AS COUNT
FROM PAR_BACKUP P JOIN CHILD_BACKUP C
ON P.PAR_BACKUP_ID = C.PAR_BACKUP_ID
JOIN GEN_REQ GR
ON C.CHILD_BACKUP_ID = GR.CHILD_BACKUP_ID
JOIN GEN_CONFIRMED GC
ON GR.GEN_REQ_ID = GC.GEN_REQ_ID
WHERE NOT EXISTS
(
SELECT 1
FROM GEN_SIT_CONFIRMED_CANCELED GSCC
WHERE GC.GEN_CONFIRMED_ID = GSCC.GEN_CONFIRMED_ID
)
AND NOT EXISTS
(
SELECT 1
FROM GEN_PAR_CONFIRMED_CANCELED GPCC
WHERE GC.GEN_CONFIRMED_ID = GPCC.GEN_CONFIRMED_ID
)
AND NOT EXISTS
(
SELECT 1
FROM GEN_REVIEWS RV
WHERE GC.GEN_CONFIRMED_ID = RV.GEN_CONFIRMED_ID
)
AND GR.END_DATE < SYSDATE
AND SYSDATE <= GR.END_DATE +7
AND P.PAR_BACKUP_ID = 'PBAC0021';
작성한 쿼리는 다른 쿼리와 마찬가지로 SQL Mapper 파일(GenReviewsDAO.xml) 에 작성해준다.
2. 세션 속성값 추가
이제 해당 쿼리를 기반으로 Controller에 세션 속성값을 추가해준다. 로그인 시 얻어낸 부모 백업 아이디를 기반으로 평점 열람 제한 여부를 조회하면 된다.
// ● 일반 돌봄 메인
@RequestMapping(value="/genmain.action", method = {RequestMethod.GET, RequestMethod.POST})
public String genMain(HttpSession session, Model model)
{
String result = null;
// 페이지 접근 권한 확인 ------------------------------------------
ParDTO parent = (ParDTO) session.getAttribute("loginParent");
if (parent == null)
return "redirect:/iLook.action";
// 접근 권한 있다면 아래 내용 순차 진행
//----------------------------------------------------------------
String parBackupId = parent.getPar_backup_id();
// 부모 id 기반으로 아이 이름 조회
IChildDAO childDao = sqlSession.getMapper(IChildDAO.class);
ArrayList<ChildDTO> listName = new ArrayList<ChildDTO>();
listName = childDao.listName(parBackupId);
// 부모 id 기반으로 평점 열람 제한 여부 조회
IGenReviewDAO reviewDao = sqlSession.getMapper(IGenReviewDAO.class);
int restrict = reviewDao.checkRestrictReview(parBackupId);
model.addAttribute("listName", listName);
session.setAttribute("restrict", restrict); // 리뷰를 작성하지 않은 돌봄 건 수
result = "WEB-INF/view/genMain.jsp";
return result;
}
시터 평점 열람 제한 대상자라면 변수 restrict 에 1 이상 숫자가, 제한 대상자가 아니라면 0이 담긴다.
시터 평점이 프로젝트의 여러 페이지에 걸쳐 나타나기 때문에 모델 객체에 매번 담아주기보다는 세션 객체에 담아주는 방향을 택했다. 당연히, 로그아웃 시 세션값은 전부 비워진다.
3. 웹 페이지에 반영




이제는 어렵지 않게 사용하게 된 core 태그. 이래서 반복이 중요하다. 각 페이지에서 기존에 시터 평점이 노출되던 곳을 찾아 작성하지 않은 돌봄 리뷰가 없는 경우(${restrict == 0}) 에는 시터 평점을 그대로 출력한다. 반대로 작성하지 않은 돌봄 리뷰가 있는 경우에는 시터 평점을 노출하지 않는다.
<div>최근 평점 ⭐${genReg.recent_avg_rating } (${genReg.recent_review_count }건)</div>
<div>전체 평점 ⭐${genReg.avg_rating } (${genReg.review_count }건)</div>
<!-- ↓ -->
<c:choose>
<c:when test="${restrict == 0}">
<div>최근 평점 ⭐${genReg.recent_avg_rating } (${genReg.recent_review_count }건)</div>
<div>전체 평점 ⭐${genReg.avg_rating } (${genReg.review_count }건)</div>
</c:when>
<c:otherwise>
<div>(⭐<a href="parentcaredone.action">돌봄 이용 리뷰 작성</a> 이후 평점 열람 가능)</div>
</c:otherwise>
</c:choose>
단순히 안내에 그치지 않고, 기존 평점 출력 위치에 하이퍼링크를 두어 헤매지 않고 바로 일반 돌봄 이용 완료 내역 페이지로 이동되도록 작성했다.
<c:choose>
<c:when test="${restrict == 0}">
<div>최근 평점 ⭐${genDetail.recent_avg_rating } (${genDetail.recent_review_count }건)</div>
<div>전체 평점 ⭐${genDetail.avg_rating } (${genDetail.review_count }건)</div>
</c:when>
<c:otherwise>
<div>
(⭐
<a href="#" onclick="window.opener.location.href='parentcaredone.action'; window.close(); return false;">
돌봄 이용 리뷰 작성
</a>
이후 평점 열람 가능)
</div>
</c:otherwise>
</c:choose>
만약, 윈도우 새창에서 기존 창으로 돌아가야 하는 경우에는 바로 href 속성에 작성하는 것이 아니라 위와 같이 『onclick = "window.opener.location.href= ~~~"』 을 활용한다.


📌 필요에 따라 함께 쓰면 좋은 구문
- window.close(); → 현재창(자식창) 닫기
- return false; → href="#" 과 더불어 href로 인한 페이지 이동 방지
'Sist > Final Projet : I_Look' 카테고리의 다른 글
| 특별편. 프로젝트 진행 시 도움을 받은 포스팅 모음 (2) | 2025.05.24 |
|---|---|
| [Java Wep Application] 파이널 프로젝트 Ⅶ. 회고 (8) | 2025.05.22 |
| [Java Web Application] 파이널 프로젝트 Ⅵ. 기능 추가 구현 - 1차 필터 신청 날짜 제한 (Flatpickr 라이브러리 활용) (1) | 2025.05.16 |
| [Java Wep Application] 파이널 프로젝트 Ⅴ. 프로젝트 결과물 (2) | 2025.05.14 |
| [Java Wep Application] 파이널 프로젝트 Ⅳ. DB 논리/물리 설계 (1) | 2025.05.13 |