🐢🐢꼬부기 LV.2 | 실습•에러/🛡️껍질에 숨기(에러해결)

주문내역 페이지 구현과 샘플테이터 생성 오류 해결

서화 2025. 12. 25. 22:33

🐞 JSTL C태그 forEach Dead Code 발생 🐞

Multiple annotations found at this line: - isValid() == false - Line breakpoint:orderhistory.jsp [line: 314]

🔎원인분석

Dead Code는 프로그램 실행 시 절대 실행되지 않는 죽은 코드를 의미한다  따라서 사진의 forEach가 죽은코드인 이유를 찾아보자면

  • JSTL 사용을 위한 태그 라이브러리 선언이 없음
  • JSTL 라이브러리가 프로젝트에 없는 경우
  • <c:forEach> 문법이 틀렸거나 완성되지 않았을때

발생한다 여기서 오류문구를 해석해보자면 isValid() == false는  위의 세가지 이유에 해당하는 코드로 판단했기때문에 알림을 띄운것이다

🛠️해결방법

따라서 오류를 해결하기 위해 차례대로 확인해보았다

1.JSTL 사용을 위한 태그 라이브러리 선언

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

페이지 상단에 잘 선언 되어있는것을 확인했다

2.JSTL 라이브러리가 프로젝트에 없는 경우

WEB-INF 안에 잘 추가된것을 확인했다

3. <c:forEach> 문법이 틀렸거나 완성되지 않았을때

여기가 문제였다

<!-- 주문내역이 있을경우 반복해서 보여주기 --> 
<c:forEach>
<tr class="text-center"> 
  <th scope="row" class="text-start py-4">2025.11.11</th> 
    <td class="py-4">배송완료</td> 
    <td class="py-4">오너먼트</td> 
    <td class="py-4 text-center">10000</td> 
 </tr> 
 </c:forEach>

<c:forEach>문에 필요한 필수 속성을 지정해주지 않았고 문법이 틀려서 난 오류였다

또한 하드코딩 된 부분을 JSTL 문으로 바꿔주지 않았기 때문에 작동하지 않았다

    <!-- 주문 내역 있을 때 -->
    <!-- 반복할 필수 속성 지정-->
        <c:forEach var="order" items="${orderList}">
            <tr class="text-center">
            <!--주문날자 출력-->
                <th scope="row" class="text-start py-4">${order.orderDate}</th>
                <!--주문 현재상태-->
                <td class="py-4">${order.orderStatus}</td>
                <!--주문내역에서 보여줄 대표상품 이름-->
                <td class="py-4">${order.orderSignatureItemName}</td>
                <!--주문 총 가격 -->
                <td class="py-4 text-center">${order.orderTotalAmount}</td>
            </tr>
        </c:forEach>

따라서 반복할 필수 속성을 지정해주고 코드를 수정하였다


🐞ORA-00932: inconsistent datatypes: expected NUMBER got DATE🐞

주문내역 페이지를 테스트 해기 위해 샘플 데이터를 넣다가 발생한 오류이다

에러내용을 해석해 보자면 NUMBER 가 들어가야하는 컬럼에 문자로 데이터를 넣었기 때문에 발생했다

🔎원인분석

현재 INSERT를 하기위해 넣은 값이다 

-- 주문상세 생성
INSERT INTO ORDERS_ITEM (
    ORDERS_ITEM_PK,  -- PK  
    ORDERS_PK,    -- 주문내역 PK     
    ITEM_PK,        -- 상품 PK   
    ORDERS_ITEM_QUANTITY, -- 수량 
    ORDERS_ITEM_PRICE      -- 주문 시점 총 가격
) VALUES (
    ORDERS_ITEM_SEQ.NEXTVAL,
  	2,      --:ordersPk,
    1,      --:itemPk,
    'DELIVERD',       -- :quantity,
    30000    --:itemPrice * :quantity

여기 수량 자리에 내가 문자를 넣어서 생긴 오류다 수량은 숫자로만 값이 들어가야하는데 문자를 넣어서 오류가생긴것이었다

현재 주문의 상태는 주문 테이블에 필요한것이지 주문상세테이블에 필요한것이 아니다

🛠️해결방법

현재 INSERT문에서 문자를 삭제하고 올바른 수량의 값을 입력하면 에러는 해결된다

INSERT INTO ORDERS_ITEM (
    ORDERS_ITEM_PK,
    ORDERS_PK,
    ITEM_PK,
    ORDERS_ITEM_QUANTITY,
    ORDERS_ITEM_PRICE
) VALUES (
    ORDERS_ITEM_SEQ.NEXTVAL,
    2,       -- 존재하는 ORDERS_PK
    1,       -- 존재하는 ITEM_PK
    1,       -- 수량
    30000    -- 가격
);

🐞ORA-00947: not enough values🐞

INSERT 실행시 컬럼개수와 입력한 값이 틀릴때 나는 오류다

🔎원인분석

현재 INSERT 문을 보면 컬럼은 4개인데 값은 3개를 넣고있다

INSERT INTO ORDERS (
    ORDERS_PK, -- 주문pk
    ACCOUNT_PK, --회원pk
    ORDERS_DATE, --주문날자
    ADDRESS_PK --주소pk
) VALUES (
    ORDERS_SEQ.NEXTVAL,
    1,
    1
);

 따라서 현재 넣은 값에 주문날자에 해당하는 값이 빠져있었기때문에 발생했다

🛠️해결방법

현재 주문 테이블을 보면 주문날자 컬럼이 DEFAULT SYSDAET로 설정되어있다

ORDERS_DATE DATE DEFAULT SYSDATE,

따라서 INSERT 실행시 주문날자 컬럼을 제거해도 날자가 기본으로 들어가게 되어있다 그래서 기존 INSERT 문에서 삭제해주고 다시 실행시키면 에러없이 잘 진행된다

INSERT INTO ORDERS (
    ORDERS_PK,
    ACCOUNT_PK,
    ADDRESS_PK
) VALUES (
    ORDERS_SEQ.NEXTVAL,
    1,
    1
);

🐞ORA-02291: integrity constraint (KEVIN.FK_ACCOUNT_ADDRESS) violated - parent key not found🐞

해당에러는 외래키가 가리키는 부모(PK)가 존재하지 않는다는 에러로 지금 INSERT/UPDATE 하는 행에서 넣은 값이
FK 제약조건이 걸린 부모 테이블에 없다 는 뜻이다

🔎 원인분석

지금 에러문구를 보면 FK의 이름이 ACCOUNT_ADDRES인데 이것은 주소테이블이 회원PK를 참조할때 걸리는

외래키제약임을 알수있다 즉 주소테이블에 회원pk가 회원테이블에 없다는 말이된다

주문내역은 회원 -> 주소 -> 주문의 흐름으로 진행되어야 하기때문에 부모키인 회원과 주소가 모두 존재해야 주문내역을 만들수 있다

🛠️해결방법

회원테이블에 INSERT를 실행해서 회원정보를 만들어준다

회원가입
INSERT INTO ACCOUNT (
	ACCOUNT_PK,ACCOUNT_ID,ACCOUNT_PASSWORD,ACCOUNT_NAME,ACCOUNT_EMAIL,
	ACCOUNT_PHONE
)
VALUES(
	ACCOUNT_SEQ.NEXTVAL,'user01','1234','홍길동','user01@TEST.COM','01012345678'
);

여기서 만들어진 회원PK를 가지고 주소테이블에 INSERT를 해준다

-- 배송지 등록
-- 필요한거 사용자 pk,주소PK,배송지이름,우편번호,기본주소지여부,기본주소,상세주소
INSERT INTO ADDRESS (
    ADDRESS_PK, ACCOUNT_PK, ADDRESS_NAME, ADDRESS_POSTAL_CODE,
    ADDRESS_IS_DEFAULT, ADDRESS_LINE1, ADDRESS_LINE2
) VALUES (
    ADDRESS_SEQ.NEXTVAL, 8000, '집', '12345', '1', '서울시 강남구', '4층'
);

그 다음에 주문테이블에서 주문내역을 만들면 해결된다

INSERT INTO ORDERS (
    ORDERS_PK, -- 주문 pk
    ACCOUNT_PK, -- 회원 pk
    ORDERS_DATE, -- 주문날자 
    ADDRESS_PK -- 주소pk
) VALUES (
    ORDERS_SEQ.NEXTVAL,
    8000,
    SYSDATE,
    1002
);