1228 개발일지
오늘 한 일
- 어제 못했던 경비테이블: 수정 화면에서 없던 값 새로 생성 기능 완료
- register.jsp의 출장비용 표시 부분 중복되던 코드 반복문으로 리팩토링
- 사용자 검색 팝업창 만들기
- 정보처리기사 영상강의 듣기
1. java 빈 값 체크
어제에 이어 출장비용 생성, 수정 시 경비 생성, 수정, 삭제를 구현하고 있었는데, 출장비용은 금액이 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());
}
}
2. jstl forEach로 코드 중복제거
하나의 출장 정보에 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>
3. 사용자 검색 팝업창 만들기
1. USER_TYPE
값을 get 방식으로 받아 검색 팝업창 띄우기
- 예전에 만들어 둔 검색 팝업창 및 controller 메소드 사용함
- 변수명이 대문자로 변경되었고, 변수값도 String에서 int로 변경되었기 때문에 숫자값을 text로 바꾸어 제목에 넣는 과정 추가
- 코드 더 짧은 방법 없을까? 원래
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>
2. 사용자 검색 팝업창 jsp 파일 만들기
처음엔 register.jsp 파일을 참고했지만 사용자 검색 -> 사용자 목록 조회&검색 -> 특정 사용자 선택 하는 과정 생각해보면 출장 목록 jsp와 기능이 더 유사하다. 조건에 맞는 사용자 검색 결과를 userList
로 받는다는 전제 하에 검색창과 목록 보여줄 테이블 화면을 구성했다.
사용자 검색 결과를 바탕으로 출장 관련자 테이블에 데이터를 생성하고, 출장 정보를 CRUD할 때 출장 관련자 테이블의 값을 가져와야 하기 때문에 출장 비용을 연결할 때와 마찬가지로 거의 모든 코드에 수정이 필요할 것 같다... 오늘은 앞으로 어떤 식으로 코딩해야 할 지 종이에 설계해보는 시간을 가졌다.
추후 할 일
- 출장 DB 테이블 컬럼 조정:
AUTHOR_ID
제외한 나머지 사용자 ID값 사용 안함 - 출장 VO 조정:
USER_ID
대신USER_NAME
사용 - SQL 조정:
SELECT FROM BT
,SELECT FROM BT_ROLE
출장 비용 따로 CRUD 했던 것처럼 BT_ROLE에 대해서도 구현 - SQL에서 USER 검색 별도로 만들기: USER 테이블에서 USER_ID, USER_NAME, USER_DEP_CODE(유저 부서코드), USER_POS_CODE(유저 직급 코드) 가져오기
- 사용자검색 jsp:
commandName='searchVO'
, user_id를 리턴하는 form-> 키워드 기반 검색할 수 있는 화면 구성 - 리턴한 user_id로 selectUser -> RoleVO 생성 -> BtVO의 RoleVOList에 넣어주기
- role.id만
form:hidden
으로 DB에 전달하여 저장하고, 이름이나 부서명 등은<c:out value>
로 화면에 출력 - 출장 정보 CRUD 시 출장 관련자 테이블도 같이 CRUD
4. 정보처리기사 영상 강의 듣기
내년 정보처리기사 첫 시험을 바로 응시할 예정인데, 필기부터 해야되는데 기초가 없으니 지금부터 조금씩 영상강의를 듣기로 했다.
2022 정보처리기사 필기 출제경향예측
Author And Source
이 문제에 관하여(1228 개발일지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lee_yesol421/1228-개발일지저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)