1228 개발일지

Yesol Lee·2021년 12월 28일
0

개발일지 - 2021

목록 보기
17/20

오늘 한 일

  1. 어제 못했던 경비테이블: 수정 화면에서 없던 값 새로 생성 기능 완료
  2. register.jsp의 출장비용 표시 부분 중복되던 코드 반복문으로 리팩토링
  3. 사용자 검색 팝업창 만들기
  4. 정보처리기사 영상강의 듣기

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"/>
      &nbsp;<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"/>
      &nbsp;<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할 때 출장 관련자 테이블의 값을 가져와야 하기 때문에 출장 비용을 연결할 때와 마찬가지로 거의 모든 코드에 수정이 필요할 것 같다... 오늘은 앞으로 어떤 식으로 코딩해야 할 지 종이에 설계해보는 시간을 가졌다.

추후 할 일

  1. 출장 DB 테이블 컬럼 조정: AUTHOR_ID 제외한 나머지 사용자 ID값 사용 안함
  2. 출장 VO 조정: USER_ID 대신 USER_NAME 사용
  3. SQL 조정: SELECT FROM BT, SELECT FROM BT_ROLE 출장 비용 따로 CRUD 했던 것처럼 BT_ROLE에 대해서도 구현
  4. SQL에서 USER 검색 별도로 만들기: USER 테이블에서 USER_ID, USER_NAME, USER_DEP_CODE(유저 부서코드), USER_POS_CODE(유저 직급 코드) 가져오기
  5. 사용자검색 jsp: commandName='searchVO', user_id를 리턴하는 form-> 키워드 기반 검색할 수 있는 화면 구성
  6. 리턴한 user_id로 selectUser -> RoleVO 생성 -> BtVO의 RoleVOList에 넣어주기
  7. role.id만 form:hidden으로 DB에 전달하여 저장하고, 이름이나 부서명 등은 <c:out value>로 화면에 출력
  8. 출장 정보 CRUD 시 출장 관련자 테이블도 같이 CRUD

4. 정보처리기사 영상 강의 듣기

내년 정보처리기사 첫 시험을 바로 응시할 예정인데, 필기부터 해야되는데 기초가 없으니 지금부터 조금씩 영상강의를 듣기로 했다.
2022 정보처리기사 필기 출제경향예측

profile
문서화를 좋아하는 개발자

0개의 댓글