어제에 이어 출장비용 생성, 수정 시 경비 생성, 수정, 삭제를 구현하고 있었는데, 출장비용은 금액이 0원이어도 생성되는 반면 경비는 금액이 0인 경우를 포함하지 않아 추가적인 처리가 필요했다.
if (출장비용.경비id 있으면) { // 이미 경비로 추가된 데이터
if (출장비용.금액>0) {
경비 업데이트
} else {
경비 삭제
출장비용.경비id 초기화
}
} else {
if(출장비용.금액>) {
경비 새로 생성
출장비용.경비id = 생성된 경비 id 저장
}
}
어제까지는 출장비용의 경비id가 있는지 여부를 경비id!=null && 경비id!=""
를 사용해서 체크했는데, 이상하게도 경비id를 "" 혹은 null로 초기화하고 나서도 해당 조건을 만족하지 않아 '원래 없던 값 생성'을 할 수 없었다.
가져와야 할 변수에 getClass().getName()
를 사용해 데이터타입을 확인해보니, null이 아닌 String으로 나오는 것을 확인하였다.
찾아보니 java에선 문자열 값 비교를 하는 여러 가지 방법이 있었는데, 나는 isEmpty()
를 사용하여 조건을 새로 만들었다. java문자열 비교 참고블로그
// controller.java -> update 메소드 안
if(!exp_id.isEmpty()) {
if(comExp.getPRICE()>0) {
btService.updateComExp(comExp);
}else {
btService.deleteComExp(comExp);
expVo.setEXPENSE_ID("");
}
}else {
if (comExp.getPRICE()>0) {
btService.insertComExp(comExp);
expVo.setEXPENSE_ID(comExp.getEXPENSE_ID());
}
}
하나의 출장 정보에 4개의 출장비용 정보를 띄우는 시도를 할 때, 기존에는 같은 코드를 path만 바꾸어 4번 반복하는 방법으로 작성했었다. 몇 번이나 반복문으로 중복을 제거해보려고 했었지만, jsp 요소와 데이터를 바운딩하는 것을 매번 실패해서 하지 못했었다. 이번에는 status.index
를 이용해 0에서 3까지 바뀌는 인덱스만 가져와서 넣는 방법으로 반복문 리팩토링에 성공하였다.
jstl forEach varStatus 사용법
<c:set var="EXPENSE_TYPE_TEXT">교통비, 일비, 숙박비, 기타</c:set>
<c:set var="btExpVOList" value="${btVO.btExpVOList }"/>
<c:forEach var="exp" items="${EXPENSE_TYPE_TEXT}" varStatus="status" >
<tr>
<c:if test="${registerFlag == 'modify'}">
<!-- 기존 게시물 있을 때: 비용 정보 번호, bt_id값 저장 -->
<form:hidden path="btExpVOList[${status.index }].BT_EXP_ID" readonly="true" />
<form:hidden path="btExpVOList[${status.index }].BT_ID" readonly="true" />
<form:hidden path="btExpVOList[${status.index }].EXPENSE_ID" readonly="true" />
</c:if>
<td class="tbtd_caption">
<c:out value="${exp}"/>
<form:hidden path="btExpVOList[${status.index}].EXPENSE_TYPE" maxlength="30" cssClass="txt" value="0" readonly="true"/>
<form:errors path="btExpVOList[${status.index}].EXPENSE_TYPE" />
</td>
<td class="tbtd_content">
<form:input path="btExpVOList[${status.index}].EXPENSE_DETAIL" maxlength="30" cssClass="txt"/>
<form:errors path="btExpVOList[${status.index}].EXPENSE_DETAIL" />
</td>
<td class="tbtd_content">
<form:select path="btExpVOList[${status.index}].PAYMENT_METHOD">
<form:option value="0" label="카드"/>
<form:option value="1" label="현금"/>
<form:option value="2" label="계좌이체"/>
</form:select>
</td>
<td class="tbtd_content">
<form:input path="btExpVOList[${status.index}].PRICE" maxlength="30" cssClass="PRICE"/>
<form:errors path="btExpVOList[${status.index}].PRICE" />
</td>
</tr>
</c:forEach>
USER_TYPE
값을 get 방식으로 받아 검색 팝업창 띄우기USER_TYPE_TEXT
를 문자열 배열로 만들고 USER_TYPE
을 배열 인덱스로 줘서 선택하려고 시도했는데 잘 안됐다.<c:choose>
<c:when test="${btRoleVO.USER_TYPE == 0}">
<c:set var="USER_TYPE_TEXT">출장자</c:set>
</c:when>
<c:when test="${btRoleVO.USER_TYPE == 1}">
<c:set var="USER_TYPE_TEXT">결재자</c:set>
</c:when>
<c:when test="${btRoleVO.USER_TYPE == 2}">
<c:set var="USER_TYPE_TEXT">수신자</c:set>
</c:when>
</c:choose>
<h1 class="board-title">
<c:out value="${USER_TYPE_TEXT} 등록"/>
</h1>
처음엔 register.jsp 파일을 참고했지만 사용자 검색 -> 사용자 목록 조회&검색 -> 특정 사용자 선택 하는 과정 생각해보면 출장 목록 jsp와 기능이 더 유사하다. 조건에 맞는 사용자 검색 결과를 userList
로 받는다는 전제 하에 검색창과 목록 보여줄 테이블 화면을 구성했다.
사용자 검색 결과를 바탕으로 출장 관련자 테이블에 데이터를 생성하고, 출장 정보를 CRUD할 때 출장 관련자 테이블의 값을 가져와야 하기 때문에 출장 비용을 연결할 때와 마찬가지로 거의 모든 코드에 수정이 필요할 것 같다... 오늘은 앞으로 어떤 식으로 코딩해야 할 지 종이에 설계해보는 시간을 가졌다.
AUTHOR_ID
제외한 나머지 사용자 ID값 사용 안함USER_ID
대신 USER_NAME
사용SELECT FROM BT
, SELECT FROM BT_ROLE
출장 비용 따로 CRUD 했던 것처럼 BT_ROLE에 대해서도 구현commandName='searchVO'
, user_id를 리턴하는 form-> 키워드 기반 검색할 수 있는 화면 구성form:hidden
으로 DB에 전달하여 저장하고, 이름이나 부서명 등은 <c:out value>
로 화면에 출력내년 정보처리기사 첫 시험을 바로 응시할 예정인데, 필기부터 해야되는데 기초가 없으니 지금부터 조금씩 영상강의를 듣기로 했다.
2022 정보처리기사 필기 출제경향예측