57일 차 특이사항
1. session에서 계급을 교체해주고 있는데 mapper에서 구현해 보자.
mapper에서 session 계급 교체하기
1. 만약 사원이 결재글 리스트를 불러오는데, 대리결재를 받았다면~ 글쓴이가 대리결재권한 부여자가 보는 리스트를 보게 된다. 아래 코드는 작동이 되지 않고, 오류가 발생했다. 찾아보니 세션 데이터를 서브쿼리에서 찾을 수 없다고 한다. 다시 코드를 바꿔보자.
<if test="memInfo.memRank == 'CLERK'">
and WRITE_ID = #{memInfo.memId}
<if test="memInfo.memId in (SELECT PROXY_MEMBER FROM JSH_APPROVAL_PROXY)">
and WRITE_ID = (
SELECT GRANT_MEMBER
FROM JSH_APPROVAL_PROXY
WHERE PROXY_MEMBER = #{memInfo.memId}
)
</if>
</if>
2. 컨트롤러에서 grantRank(결재권한 부여한 사람의 계급)값을 불러오기는 했는데 이것을 어떻게 mapper에서 select 해오지?
@RequestMapping("login")
public String loginView(@RequestParam(value="logId", required=false) String logId
,@RequestParam(value="logPass", required=false) String logPass
,Model model
,HttpSession session
,HttpServletResponse response) throws IOException {
// 로그인 상태 확인
if (session.getAttribute("memInfo") != null) {
return "redirect:list";
}
if (logId == null) {
return "login";
} else {
Map<String, Object> map = sqlSession.selectOne("mapper.loginChk", logId);
if (map == null) {
model.addAttribute("loginMsg", "idFail");
return "login";
} else if (!logPass.equals(map.get("memPass").toString())) {
model.addAttribute("loginMsg", "passwordFail");
return "login";
} else {
session.setAttribute("memInfo", map);
// 대리 결재 여부 확인
Map<String, Object> isProxyMember = (Map<String, Object>) service.isProxyMember(logId);
String grantRank = (String) isProxyMember.get("grantRank");
System.out.println("grantRank 값 : " + grantRank);
session.setAttribute("grantRank", grantRank); //BOSS값이 들어있잖아.
return "redirect:list";
}
}
}
<if test="memInfo.memRank == 'CLERK'">
and WRITE_ID = #{memInfo.memId}
<if test="grantRank = 'BOSS'">
OR (APPR_STATUS = 'wat')
</if>
</if>
3. 위 시도도 실패다. 조금 다르게 접근해보았다. 컨트롤러에서 grantRank값을 세션에 저장하고, 이것을 mapper에서 사용할 것이다.
// 대리 결재 여부 확인
Map<String, Object> isProxyMember = (Map<String, Object>) service.isProxyMember(logId);
String grantRank = (String) isProxyMember.get("grantRank");
String grantMember = (String) isProxyMember.get("grantMember");
System.out.println("grantRank 값 : " + grantRank);
System.out.println("grantMember 값 : " + grantMember);
session.setAttribute("grantRank", grantRank);
session.setAttribute("grantMember", grantMember);
4. 로그인 아이디의 계급이 CLERK이면서 grantRank 가 BOSS면, 아래 쿼리문(과장이 게시판 리스트 불러오는 쿼리문)이 실행된다.
<if test="memInfo.memRank == 'CLERK'">
and WRITE_ID = #{memInfo.memId}
<if test="grantRank == 'BOSS'">
AND (
APPR_STATUS = 'wat'
OR (APPR_STATUS = 'end' AND APPR_APPER = #{grantMember})
OR SEQ IN (
SELECT appr_seq
FROM (
SELECT
his_seq,
appr_seq,
his_app_date,
hist_apper,
hist_status,
ROW_NUMBER() OVER (PARTITION BY appr_seq ORDER BY his_seq DESC) AS row_num
FROM JSH_APPROVAL_HISTORY
) Rank
WHERE row_num IN (1, 2)
AND hist_apper = #{grantMember}
AND APPR_STATUS != 'tmp'
)
OR (APPR_APPER = #{grantMember} AND APPR_STATUS = 'ret')
OR (WRITE_ID = #{grantMember} AND APPR_STATUS = 'ret')
OR (WRITE_ID = #{grantMember} AND APPR_STATUS = 'tmp')
)
</if>
</if>
5. 그런데 이 방법이 효율적인가? 잘 모르겠다. 쿼리문이 더 길어진다. 게다가 과장처럼 결재글을 조회할 수 있을 뿐 결재하는 스크립트를 다시 수정해야 한다. 세션에서 memRank를 grantRank로 바꿔주면 이런 쿼리문을 만들 필요가 없다. 그냥 권한을 그대로 부여받는다. 아 도무지 모르겠다. 세션에서 처리하는 것이 더 좋은 방법이 아닐까?
직선 말고 곡선으로
계속 시도해도 답이 안 나온다. 모든 문제를 직선식으로 해결하려 하는 것이 좋지 않다는 말이 있다. 조금 돌아가더라도 오류, 실패, 시행착오를 경험해 보라는 것이다. 직선으로 해결하려 하지 말고, 곡선으로 해결하라는 말을 듣고 문제 해결에 대해 다시 생각하고 있다. 빠르게 해결한다고 다 좋은 것은 아닌 것 같다. 내가 찾아내서 고민 끝에 해결해야 근육이 생길 것이다. 계속 시도해 보자.
'일경험' 카테고리의 다른 글
[국민취업지원제도 일경험프로그램 59일차] 회원가입 form 보내기(ORACLE 함수) (2) | 2023.10.31 |
---|---|
[국민취업지원제도 일경험프로그램 58일차] 구글 SMTP 이메일 인증 기능 (2) | 2023.10.30 |
[국민취업지원제도 일경험프로그램 56일차] 결재시스템 대리결재 완료 (1) | 2023.10.26 |
[국민취업지원제도 일경험프로그램 55일차] 결재시스템 대리결재 controller (0) | 2023.10.25 |
[국민취업지원제도 일경험프로그램 54일차] 결재시스템 과장 서브쿼리 조건문 (0) | 2023.10.24 |