[팀 프로젝트] 24.02.19. 노트
오늘 할일
관리자 member/owner CRUD<<게시판 형식으로 회원 목록 출력하기, 목록에서 검색
facility CRUD 시작
1. <form:form>태그 action 속성
<form:form action="<c:url value="/staff/update_info"/>" modelAttribute="member_info" class="form-horizontal" onsubmit="return confirm(회원 정보를 수정하시겠습니까?)">
위의 코드에서 다음과 같은 오류가 발생했다.
org.apache.jasper.JasperException: /WEB-INF/views/member/staff_member.jsp (행: [34], 열: [53]) 종료되지 않은 [<form:form] 태그
쌍따옴표 안에 또다시 쌍따옴표를 사용했기 때문이었다. 다른 곳에서도 똑같이 했는데 왜 여기서만 문제인지는 모르겠지만 일단은 다르게 표현해보기로 했다.
+(추가)c 태그는 JSP에서 처리하고 form:form 태그는 spring에서 처리하기 때문에 두 개를 같이 사용할 수 없다.
따옴표와 백틱을 사용하니 c태그가 아예 인식이 안 돼서 변수로 사용했다.
<c:url value="/staff/update_info" var="update_url"/>
<form:form action="${update_url}" modelAttribute="member_info" class="form-horizontal" onsubmit="return confirm(회원 정보를 수정하시겠습니까?)">
2. 회원 삭제 후 회원 목록이 출력되지 않음
url을 확인해보니 'http://localhost:8080/pet_hug/staff/delete_member?'라고 사용되었던 파라미터값만 없어지고 그대로 유지되고 있었다.
return값을 다음과 같이 수정했다.
return "redirect:/staff/members";
3. 회원 정보에서 회원 삭제 페이지로 mem_id 값이 전달되지 않음
관리자 페이지의 회원 상세정보 페이지에서 회원 삭제 페이지로 넘어갈 때 mem_id 값이 전달되지 않았다.
회원이 자신의 정보를 조회하고 회원탈퇴를 할 때는 session에 저장된 sessionId를 통해 sql문을 작성했다. 관리자 페이지에서는 sessionId를 사용할 수가 없어서 회원정보에 사용된 mem_id를 전달하려고 했다. 그런데 회원 정보에서는 mem_id가 잘 불러와졌는데 회원탈퇴 컨트롤러로 넘기는 게 되지 않았다.
<form:form name="delete_form" modelAttribute="member_info" action="/pet_hug/staff/delete_member" method="GET" onsubmit="return confirm('회원을 삭제하시겠습니까?');">
<input type="hidden" name="id" value="${member.mem_id}">
<input type="submit" value="회원 삭제" class="btn btn-danger"/>
</form:form>
하나의 ModelAttribute에 form을 여러 개 사용하면 CRUD 라인이 분리되지 않기 때문에 바람직하지 않다고 한다. 그래서 a태그를 사용했는데 여전히 el 태그의 값이 로딩되지 않았다.
<a href="/pet_hug/staff/delete_member?id=${mem_id}" class="btn btn-danger" onclick="return confirm('회원을 삭제하시겠습니까?');">회원 삭제</a>
form 태그 안에 넣어도 마찬가지고 밖에 빼도 마찬가지였다. modelAttribute는 form태그 안에서만 사용할 수 있다고 해서 c태그로 form 태그 안에서 el태그의 값을 변수에 넣고 a태그에서 변수의 값을 사용해도 되지 않았다.(애초에 c태그도 form태그가 아니니까 form 태그 안에서만 사용할 수 있다면 소용없는 일이다.)
아직 해결하지 못했다...이 상태로 하루를 지체했다. 달라진 점은 내 정신력이 엄청나게 소모된 것 뿐이다.

나중에 다른 해결책이 떠오르기를 바라며 일단은 놔두고 다른 부분을 하면서 더 공부해봐야겠다.

간단하게 해결됐다.
form의 modelAttribute 값과 el태그 안의 도메인명을 일치시켜야 했다. 보통 modelAttribute 값을 도메인과 일치시킨다고 한다.
책에서는 일치돼있었지만 확실하게 구별해보겠다고 member_info 같은 식으로 form마다 다르게 적어줬었다. Controller에서 @ModelAttribute를 사용할 때 이름을 일치시키면 작동하길래 계속 그렇게 했었는데 과욕을 부렸던 모양이다. 그래도 modelAttribute 속성의 역할을 조금 더 알게 됐으니 긍정적으로 생각해야겠다. 하루씩이나 들였지만......
그런데 ${member.mem_id}의 member와 modelAttribute의 값을 일치시켜야 하는 거라면 왜 input 태그 안에서는 정상적으로 출력됐을까? 컴퓨터가 융통성을 발휘할 수 있는 것도 아닌데...융통성이 조금만 더 있었더라면 참 좋았을 텐데
아무튼 회원 삭제까지 무사히 됐다.
내일 할일
관리자 member/owner CRUD<<게시판 형식으로 회원 목록 출력하기, 목록에서 검색(진짜진짜)
facility CRUD 진짜진짜 시작