오류 및 문제점
1. MySQL 시퀀스
- 문제점: 기업, 상품 등록 시 코드를 위해 시퀀스가 필요하다.
- 해결 방안: MySQL 시퀀스를 만들어 사용한다.
* DELIMITER: 문법의 끝을 나타내는 역할
create TABLE SEQUENCES(
name varchar(32) primary key,
currval BIGINT unsigned
)
engine = innoDB;
DELIMITER $$
create procedure `create_sequence` (IN seq_name text, IN start_val int)
modifies sql data
deterministic
begin
delete from SEQUENCES where name = seq_name;
insert into SEQUENCES values(seq_name, start_val);
end $$
DELIMITER ;
DELIMITER $$
create function `nextval` (seq_name VARCHAR(32))
RETURNS BIGINT unsigned
MODIFIES SQL DATA
Deterministic
begin
declare ret BIGINT unsigned;
update SEQUENCES set currval = currval +1 where name = seq_name;
select currval into ret from SEQUENCES where name = seq_name limit 1;
return ret;
end $$
DELIMITER ;
call create_sequence('seq_company', 9);
call create_sequence('seq_product', 1999);
2. MySQL Error Code: 1419
- 문제점: log_bin_trust_function_creators 설정으로 인해 권한이 없어 function을 생성할 수 없다.
- 해결 방안: root 계정에 접속해 function 생성 시 일시적으로 설정을 바꾼다.
set global log_bin_trust_function_creators=on;
3. MySQL Error Code: 1175
- 문제점: key가 아닌 칼럼을 사용해 delete를 실행하니 안전모드에 걸린다.
- 해결 방안: 삭제 시 사용할 칼럼을 primary key로 설정한다. (참고 자료의 링크를 들어가면 primary key로 설정하지 않는 해결 방법도 있다.)
create TABLE SEQUENCES(
name varchar(32) primary key,
currval BIGINT unsigned
)
engine = innoDB;
4. 기업 정보 수정 시 세션에 저장된 기업명 변경
- 문제점: 기업 변경 시 세션 값이 변경되게 했기 때문에 기업 정보를 수정하면 헤더의 기업명은 수정 전 이름이다.
- 해결 방안: 기업 정보 수정 시 조회중인 기업이면 세션에 저장된 기업명도 바꾼다.
private CompanyVO makeCompany(HttpServletRequest request) {
CompanyVO company = new CompanyVO();
HttpSession session = request.getSession();
if(company_id == (int) session.getAttribute("comId")) {
session.setAttribute("comName", company_name);
}
return company;
}
5. 기업 수정 시 관리자 확인
- 문제점: 기업 정보를 수정할 때 관리자 확인을 이중을 하고 싶다.
- 해결 방안: 수정 버튼을 누르면 prompt로 비밀번호를 입력하게 한다.
$("#modifyBtn").on("click", function () {
var password = prompt("관리자 확인", "비밀번호를 입력하세요");
if("${managerUser.manager_pw}" === password) {
return true;
} else if(password === null) {
} else {
alert("비밀번호가 올바르지 않습니다.");
}
return false;
});
6. Unknown column in 'where clause'
- 문제점: SQL 쿼리에서 에러가 생겼다.
- 해결 방안: where절에서 문자와 같은지 비교를 할 때 따옴표로 감싼다.
String sql = "select * from product join manager using(manager_id) where company_id=" + comID;
if (!cond.equals("all")) {
sql += " and product_status='" + cond + "'";
}
진행 상황
1. 기업 등록
String sql = """
insert into company values(nextval('seq_company'), ?, ?, ?, ?)
""";
HttpServletRequest request = (HttpServletRequest) data.get("request");
CompanyVO company = makeCompany(request);
CompanyService service = new CompanyService();
String message = service.companyModify(company);
return "redirect:/company/companyList.do";
2. 상품 등록
String sql = """
insert into product(product_code, subcategory_name, company_id, product_name, product_cost, product_price,
product_stock, product_safety, product_status, product_regdate, manager_id)
values(nextval('seq_product'), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""";
HttpServletRequest request = (HttpServletRequest) data.get("request");
ProductVO product = makeProduct(request);
ProductService service = new ProductService();
String message = service.productInsert(product);
return "redirect:/product/productList.do";
3. 등록, 수정 시 이중 확인
$("#companyModifyBtn").on("click", function () {
var password = prompt("관리자 확인", "비밀번호를 입력하세요");
if("${managerUser.manager_pw}" === password) {
return true;
} else if(password === null) {
} else {
alert("비밀번호가 올바르지 않습니다.");
}
return false;
});
$("#productInsertBtn").on("click", function() {
if(confirm("정말 등록하시겠습니까?") === true) {
return true;
} else {
return false;
}
});
4. 조회 데이터 형식 설정
- 문제점: 가격, 날짜 데이터의 형식을 설정하고자 한다.
- 해결 방안: JSTL을 사용해 형식을 지정한다.
<fmt:formatNumber value="${product.product_cost}">
<fmt:formatDate value="${product.product_regdate}" pattern="yyyy-MM-dd hh:mm:ss"/>
<fmt:formatNumber value="${company.company_commission}" type="percent">
5. 기업 상태 필터
$("#prodStatus-filter").on("change", function() {
$.ajax({
url: $(location).attr("pathname"),
method: "post",
data: {"filter":$(this).val()},
success: function(result) {
$("#table-body").html(result);
}
});
});
참고 자료