Sist/Final Projet : I_Look

[Java Web Application] 파이널 프로젝트 Ⅵ. 기능 추가 구현 - 리뷰 미작성 시 평점 열람 제한

iridiscente 2025. 5. 16. 14:23

두 번째로 추가하는 기능은, "평점 열람 제한"이다. 앞선 기능에 비해 상대적으로 간단하다.

  • 돌봄 이용이 종료된 부모 회원이 리뷰를 작성하지 않을 경우
    → 돌봄 종료일로부터 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. 웹 페이지에 반영

검색 결과 페이지(parent26_김장미)평점 열람 제한(parent21_김연보라)
검색 결과 페이지(parent26_김장미) / 평점 열람 제한(parent21_김연보라)
결제 폼 페이지(parent26_김장미)평점 열람 제한(parent21_김연보라)
결제 폼 페이지(parent26_김장미) / 평점 열람 제한(parent21_김연보라)

 

이제는 어렵지 않게 사용하게 된 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>&nbsp;이후 평점 열람 가능)</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>
        &nbsp;이후 평점 열람 가능)
    </div>
</c:otherwise>
</c:choose>

 

만약, 윈도우 새창에서 기존 창으로 돌아가야 하는 경우에는 바로 href 속성에 작성하는 것이 아니라 위와 같이 『onclick = "window.opener.location.href= ~~~"』 을 활용한다.

돌봄 상세 정보 윈도우창(parent26_김장미)평점 열람 제한(parent21_김연보라)
돌봄 상세 정보 윈도우창(parent26_김장미) / 평점 열람 제한(parent21_김연보라)

📌 필요에 따라 함께 쓰면 좋은 구문
- window.close(); → 현재창(자식창) 닫기
- return false; → href="#" 과 더불어 href로 인한 페이지 이동 방지