[프로젝트] 웹 ITEM FARM - day06

_bean_·2023년 4월 24일
0
post-thumbnail

오류 및 문제점

1. MySQL 시퀀스

  • 문제점: 기업, 상품 등록 시 코드를 위해 시퀀스가 필요하다.
  • 해결 방안: MySQL 시퀀스를 만들어 사용한다.
    * DELIMITER: 문법의 끝을 나타내는 역할
-- 시퀀스로 사용할 테이블 생성
create TABLE SEQUENCES(
    name varchar(32) primary key,
    currval BIGINT unsigned
)
engine = innoDB;

-- 시퀀스로 사용할 프로시저 생성
-- 'IN' 으로 시퀀스 명, 시작 값을 받음
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. 기업 정보 수정 시 세션에 저장된 기업명 변경

  • 문제점: 기업 변경 시 세션 값이 변경되게 했기 때문에 기업 정보를 수정하면 헤더의 기업명은 수정 전 이름이다.
  • 해결 방안: 기업 정보 수정 시 조회중인 기업이면 세션에 저장된 기업명도 바꾼다.
// CompanyModifyController.java
private CompanyVO makeCompany(HttpServletRequest request) {
	CompanyVO company = new CompanyVO();
    // company 만드는 코드

	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 + "'"; // cond를 따옴표로 감싸기
}

진행 상황

1. 기업 등록

// CompanyDAO.java
String sql = """
	insert into company values(nextval('seq_company'), ?, ?, ?, ?)	
	""";
   
// CompanyModifyController.java
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. 상품 등록

// ProductDAO.java
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'), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
	""";
    
// ProductInsertController.java
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);
		}
	});
});

참고 자료

profile
어쩌다 풀스택 :3

0개의 댓글