개주 훈련일지/🔥 히노카미 코구라(오류 수정)

오류내역) java.sql.SQLIntegrityConstraintViolationException

lshfood2 2025. 11. 28. 16:31

[에러 발생 상황]

별점을 선택하고 댓글 작성 시

에러가 발생하며 팅기는 현상 발생

 

 

해당 오류는 자바에서 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")));

로 수정하면 이제 별점 리뷰가

정상 실행되는 모습을 확인할 수 있다.

 

▼ 정상 출력되는 별점 리뷰