오류 및 문제점
1. 2개의 SQL select 결과를 하나의 결과로 보내야 한다.
- 문제점: 입출고 내역 조회 시 입고 결과, 출고 결과 모두 필요하다.
- 해결 방안: 입출고VO를 생성 후 각각에 대해 쿼리 실행 뒤 리스트에 추가한다. 추가 완료 후에는 정해진 방식으로 정렬한다. (날짜 내림차순, 상품 코드 오름차순)
if (!cond.equals("storing")) {
pst = conn.prepareStatement(sql_unstoring);
pst.setInt(1, comID);
rs = pst.executeQuery();
while(rs.next()) {
WarehousingVO warehousing = makeWarehousing(rs, "unstoring");
warehousingList.add(warehousing);
}
}
if (!cond.equals("unstoring")) {
pst = conn.prepareStatement(sql_storing);
pst.setInt(1, comID);
rs = pst.executeQuery();
while(rs.next()) {
WarehousingVO warehousing = makeWarehousing(rs, "storing");
warehousingList.add(warehousing);
}
}
Collections.sort(warehousingList);
2. org.apache.jasper.JasperException: JSP를 위한 클래스를 컴파일할 수 없습니다.
- 문제점: product_list.jsp에서 CategoryService 호출 시 header.jsp와 충돌이 생긴다. (product_list.jsp에 header.jsp 파일을 include하는 상황이다.)
- 해결 방안: 서비스 호출 변수명을 수정한다.
CompanyService service = new CompanyService();
CategoryService service = new CategoryService();
CategoryService categoryService = new CategoryService();
3. 상품 등록 및 수정 카테고리 외래키 제한
- 문제점: 상품의 카테고리가 외래키이기 때문에 input 입력 시 오류가 발생할 수 있다.
- 해결 방안: 카테고리를 select로 변경한다.
진행 상황
1. 입출고 내역 조회
@Override
public int compareTo(WarehousingVO obj) {
int result1 = obj.warehousing_date.compareTo(warehousing_date);
int result2 = product_code - obj.product_code;
if(result1 == 0) {
return result2;
}
return result1;
}
String sql_unstoring = """
select product_code, product_name, unstoring_date, unstoring_quantity
from unstoring_detail
join unstoring using(unstoring_code)
join product using(product_code)
where unstoring_state='출고완료' and company_id = ?
""";
String sql_storing = """
select product_code, product_name, balju_code, storing_date, storing_quantity
from storing_detail
join storing using(storing_code)
join product using(product_code)
where company_id = ?
""";
private WarehousingVO makeWarehousing(ResultSet rs, String mode) throws SQLException {
WarehousingVO warehousing = new WarehousingVO();
int product_code = rs.getInt("product_code");
String product_name = rs.getString("product_name");
String warehousing_state;
String balju_code;
Date warehousing_date;
int warehousing_quantity;
if(mode.equals("unstoring")) {
warehousing_state = "출고";
balju_code = null;
warehousing_date = rs.getDate("unstoring_date");
warehousing_quantity = rs.getInt("unstoring_quantity");
} else {
warehousing_state = "입고";
balju_code = rs.getString("balju_code");
warehousing_date = rs.getDate("storing_date");
warehousing_quantity = rs.getInt("storing_quantity");
}
}
if(method.equals("GET")) {
warehousingList = service.warehousingList(comId, "all");
request.setAttribute("filter", "all");
} else {
String cond = request.getParameter("warehousing-filter");
warehousingList = service.warehousingList(comId, cond);
request.setAttribute("filter", cond);
}
request.setAttribute("warehousingList", warehousingList);
<c:forEach items="${warehousingList}" var="warehousing" varStatus="status">
<tr id="datarow">
<td>${status.count}</td>
<td>${warehousing.warehousing_state}</td>
<td>${warehousing.product_code}</td>
<td>${warehousing.product_name}</td>
<td>${warehousing.warehousing_state == "출고" ? "-" : warehousing.balju_code != null ? "O" : "X"}</td>
<td>${warehousing.balju_code == null ? "-" : warehousing.balju_code}</td>
<td>${warehousing.warehousing_date}</td>
<td>${warehousing.warehousing_quantity}</td>
</tr>
</c:forEach>
2. 로그인에 따른 헤더 제한
- comId != null
- 매니저 로그인인 경우
- 매니저 로그인 정보
- 기업 정보
- 조회 기업 변경
- 로그아웃
- 기업 로그인인 경우
- 기업 정보
- 로그아웃
- comId == null
<ul class="navbar-nav ml-auto">
<c:if test="${comId != null}">
<c:if test="${managerUser != null && managerUser != ''}">
<li class="nav-item no-arrow">
<div class="nav-link">
<i class="fas fa fa-user fa-0.5x activeColor" aria-hidden="true"></i>
<span class="mr-2 d-none d-lg-inline text-gray-600 small">  ${managerUser.manager_name}</span>
</div>
</li>
<div class="topbar-divider d-none d-sm-block"></div>
</c:if>
<li class="nav-item no-arrow">
<div class="nav-link">
<i class="fas fa fa-building fa-0.5x activeColor" aria-hidden="true"></i>
<span class="mr-2 d-none d-lg-inline text-gray-600 small">  ${comName}</span>
</div>
</li>
<div class="topbar-divider d-none d-sm-block"></div>
<c:if test="${managerUser != null && managerUser != ''}">
<li class="nav-item no-arrow dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" id="dropdownMenuLink"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" >
<i class="fas fa-list fa-sm fa-fw mr-2 text-gray-400"></i>
<span class="mr-2 d-none d-lg-inline text-gray-600 small">조회 기업 변경</span>
</a>
<div id="select-box" class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="dropdownMenuLink">
<div class="dropdown-header">기업 목록</div>
<c:forEach items="${lookUpList}" var="look" varStatus="status">
<a class="dropdown-item" data-comId="${look.company_id}"
data-comName="${look.company_name}">${look.company_id}: ${look.company_name}</a>
</c:forEach>
</div>
</li>
<div class="topbar-divider d-none d-sm-block"></div>
</c:if>
<li class="nav-item no-arrow">
<a class="nav-link" href="#" role="button" aria-haspopup="true" aria-expanded="false"
data-toggle="modal" data-target="#logoutModal">
<i class="fas fa-sign-out-alt fa-sm fa-fw mr-2 text-gray-400"></i>
<span class="mr-2 d-none d-lg-inline text-gray-600 small">Logout</span>
</a>
</li>
</c:if>
<c:if test="${comId == null}">
<li class="nav-item no-arrow">
<a class="nav-link" href="/auth/LoginCheck.do">
<i class="fas fa-sign-out-alt fa-sm fa-fw mr-2 text-gray-400"></i>
<span class="mr-2 d-none d-lg-inline text-gray-600 small">Login</span>
</a>
</li>
</c:if>
</ul>
3. 상품 카테고리 select로 변환
<tr>
<th>카테고리</th>
<td>
<div class="nav-item no-arrow dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" id="categoryInsertDropdown"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" >
<i class="fas fa-list fa-sm fa-fw mr-2 text-gray-400"></i>
<input name="subcategory_name" id="selectedInsertCategory" class="mr-2 d-none d-lg-inline text-gray-600 small" value="카테고리 선택">
</a>
<div id="category-select-insert" class="dropdown-menu dropdown-menu-right shadow animated--fade-in" aria-labelledby="categoryInsertDropdown">
<c:forEach items="${categoryList}" var="category">
<div class="dropdown-header">${category.category_name}</div>
<c:forEach items="${subcategoryList}" var="subcategory">
<c:if test="${subcategory.category_code == category.category_code}">
<a class="dropdown-item category-insert-item" data-value="${subcategory.subcategory_name}">${subcategory.subcategory_name}</a>
</c:if>
</c:forEach>
</c:forEach>
</div>
</div>
</td>
</tr>
<script>
$(".category-insert-item").on("click", function () {
var selected = $(this).attr("data-value");
$("#selectedInsertCategory").attr("value", selected);
});
</script>
참고 자료