[에러 발생 상황]
별점을 선택하고 댓글 작성 시
에러가 발생하며 팅기는 현상 발생

해당 오류는 자바에서 JDBC를 통해
데이터베이스를 다룰 때 발생하는 예외 중 하나로,
무결성 제약 조건(Integrity Constraint) 위반 오류다.
DB가 허용하지 않는 데이터를 넣거나
변경하려고 했을 때 발생하는 오류이므로
코드에서 잘못 설정된 데이터가 있는지 검토하였다.
▼ 기존 jsp코드 (오류 발생)
$(function() {
const maxStars = 5;
// 페이지 로드 시 기본 5점 활성화
$('.star_rating .star').removeClass('on');
//안전장치 설정 > 별점 모두 비우기
$('.star_rating .star:lt(' + maxStars + ')').addClass('on');
//기본 값을 5점으로 설정하였으므로 maxStars 대입하여 5점으로 설정
// 별점 클릭 이벤트
$('.star_rating > .star').click(function() {
const index = $(this).index();
const score = index + 1;
//인덱스 0~4이므로 점수로 치환하려면 +1을 하여 1~5로 변환
$(this).parent().children('span').removeClass('on');
//선택하면 일단 모든 별점을 지우고
$(this).addClass('on').prevAll('span').addClass('on');
//선택된 별과 그 이전까지 있는 모든 별을 채우기
// hidden input 생성/업데이트
// JS에 추가하여 동적 생성을 체험해보기
// 원래 인풋 타입 히든은 HTML에 추가하고 .val(score)로 업데이트해도 된다.
if ($('#star_point').length === 0) {
$('<input>').attr({
type: 'hidden',
id: 'star_point',
name: 'star_point',
value: score
}).appendTo('#reviewForm');
} else {
$('#star_point').val(score);
}
});
});
[오류 원인 파악]
별점을 선택하고 댓글을 작성할 때
실제 별점의 값(=score)을 DB로 보내기 위해
input type="hidden" 이 필요하다.
보통은 HTML에서 form 라인에 만들지만
동적 생성을 실행해보기 위해 JS에 추가하였는데
위 코딩을 그대로 사용할 경우
별점을 선택하지 않으면 히든 타입이
생성되지 않아 score값을 담지 못하고
DB로 전송되어 제약 조건을 위반한 것이다.
▼ 오류 해결 완료
// 폼 제출 전에 별점 체크
$('#reviewForm').submit(function() {
if ($('#star_point').length === 0) {
$('<input>').attr({
type: 'hidden',
id: 'star_point',
name: 'star_point',
value: maxStars // 별점 선택 안 했으면 기본 5점
}).appendTo('#reviewForm');
}
});
위와 같이 폼을 제출할 때
별점이 체크되어 있지 않으면,
디폴트 값을 5로 갖는 히튼 타입을 생성하고
제출하도록 로직을 추가하였다.
그런데!!!!!

2차 에러 발생 상황...
데이터를 잘 담았다고 생각했는데
속성을 찾을 수 없다는 오류가 연이어 발생하고 있다.
[2차 오류 원인 파악]
댓글을 출력 할 때
별점 데이터를 불러와야 하는데
<!-- 채워진 별 --><c:forEach var="i" begin="1" end="${data.star_Point}">
<!-- 빈 별 --><c:forEach var="i" begin="1" end="${5 - data.star_Point}">
JSTL Core 태그로 구성된 for Each에서
data.star_Point로 기재하여 불러오는데
ReplyDTO 클래스에 star_point라는
속성(getter/setter)이 없어서 발생한 오류로
DTO와의 컬럼명을 일치시켜야 한다.
public class ReplyDTO {
private int rid;
private String content;
private String writer;
private int bid;
private int starPoint;
컬럼 starPoint에 맞게
forEach문도 수정해주자.
${data.star_Point} ▶ ${data.starPoint}
<!-- 채워진 별 -->
<c:forEach var="i" begin="1" end="${data.starPoint}">
<img src="images/star_fill.png" class="star_icon">
</c:forEach>
<!-- 빈 별 -->
<c:forEach var="i" begin="1" end="${5 - data.starPoint}">
<img src="images/star_empty.png" class="star_icon">
</c:forEach>
추가로 replyDAO의 오탈자도 수정해야한다.
아래 메서드 코드를 보면 셋터에 오탈자가 있다.
ReplyDAO replyDAO = new ReplyDAO();
ReplyDTO replyDTO = new ReplyDTO();
replyDTO.setContent(request.getParameter("content"));
replyDTO.setWriter(request.getParameter("writer"));
replyDTO.setBid(Integer.parseInt(request.getParameter("bid")));
replyDTO.setBid(Integer.parseInt(request.getParameter("star_point")));
ActionForward forward = new ActionForward();
star_point를 겟 파라미터로 갖고오지만
setBid를 동일하게 사용하고 있다.
replyDTO.setStarPoint(Integer.parseInt(request.getParameter("star_point")));
로 수정하면 이제 별점 리뷰가
정상 실행되는 모습을 확인할 수 있다.
▼ 정상 출력되는 별점 리뷰

'개주 훈련일지 > 🔥 히노카미 코구라(오류 수정)' 카테고리의 다른 글
| 오류내역) CKEditor5 - CDN 오류와 다양한 해결 시도(커스텀 빌드 추천 이유) (1) | 2025.12.12 |
|---|---|
| 오류내역) java.lang.NullPointerException: Cannot invoke "java.sql.PreparedStatement.executeQuery()" because "pstmt" is null (0) | 2025.12.03 |
| 오류내역) Failed to load resource: the server responded with a status of 404 () (0) | 2025.11.27 |
| 오류내역) 에러 발생 시 예외처리하기 (0) | 2025.11.17 |
| 오류내역) HTTP 상태 500 – 내부 서버 오류 (0) | 2025.11.14 |