에러모음 (임시)

Benjamin·2025년 4월 1일
  1. 회원가입 도중 취소 할 때 session에 담겨있던 정보때문에 filter에서 걸려버려서 indexpage로 돌아가지 않고 mainpage로 넘어가는 문제

  2. js가 있는데도 화면에 슬라이더가 출력이 안되는 문제

  1. 메인페이지에 목록이 나오지 않는데, 콘솔에 에러도 없는 상황

    원인: userDTO의 맴버이름과 다른 이름으로 접근하려고 해서 나온 상황으로 추정

const allUsers = ${userDatas}; // EL로 받은 JSON 데이터
    console.log(allUsers)
    let filteredUsers = allUsers.slice(); // 필터링된 사용자 데이터
// 필터 적용 함수
    function applyFilters() {
        const selectedGenders = $('input[name="gender"]:checked').map(function() { return $(this).val(); }).get();
        const selectedDistance = $('input[name="distance"]:checked').val();
        const ageRange = $('#age-slider-range').slider('values');
        const heightRange = $('#height-slider-range').slider('values');
        const selectedReligions = $('input[name="religion"]:checked').map(function() { return $(this).val(); }).get();
        const selectedSmoking = $('input[name="smoking"]:checked').map(function() { return $(this).val(); }).get();

        console.log("Selected Genders:", selectedGenders);
        console.log("Selected Distance:", selectedDistance);
        console.log("Age Range:", ageRange);
        console.log("Height Range:", heightRange);
        console.log("Selected Religions:", selectedReligions);
        console.log("Selected Smoking:", selectedSmoking);

        filteredUsers = allUsers.filter(user => {
            return (
                (selectedGenders.length === 0 || selectedGenders.includes(user.gender)) &&
                (user.distance <= selectedDistance || selectedDistance === '100') &&
                (user.age >= ageRange[0] && user.age <= ageRange[1]) &&
                (user.height >= heightRange[0] && user.height <= heightRange[1]) &&
                (selectedReligions.length === 0 || selectedReligions.includes(user.religion)) &&
                (selectedSmoking.length === 0 || selectedSmoking.includes(user.smoking))
            );
        });

        // 초기화 및 첫 9명 로드
        start = 0;
        $('#product-list').empty();
        loadInitialUsers();
    }

해결:

filteredUsers = allUsers.filter(user => {
            // userBirth를 나이로 변환 (예: "1990" -> 2025-1990=35)
            const birthYear = parseInt(user.userBirth) || 0;
            const userAge = currentYear - birthYear;

            // gender: true(male), false(female) -> "male", "female"로 변환
            const userGenderStr = user.userGender ? "male" : "female";
            // smoke: true(smoke), false(non) -> "smoke", "non"으로 변환
            const userSmokeStr = user.userSmoke ? "smoke" : "non";
            // region을 distance로 임시 사용 (필요 시 별도 거리 계산 로직 추가)
            const userDistance = parseInt(user.userRegion) || 0;

            return (
                (selectedGenders.length === 0 || selectedGenders.includes(userGenderStr)) &&
                (userDistance <= selectedDistance || selectedDistance === '100') &&
                (userAge >= ageRange[0] && userAge <= ageRange[1]) &&
                (user.userHeight >= heightRange[0] && user.userHeight <= heightRange[1]) &&
                (selectedReligions.length === 0 || selectedReligions.includes(user.userReligion)) &&
                (selectedSmoking.length === 0 || selectedSmoking.includes(userSmokeStr))
            );
        });
  1. 데이터는 받아왔는데 화면에서 나오지 않는 문제 2
<div class="col-md-4 col-sm-6 col-xs-12">
                        <div class="product-item">
                            <div class="pi-img-wrapper">
                                <%--<img src="${data.userProfile || 'default.jpg'}" class="img-responsive" alt="userImage">--%>
                                <div class="product-page-cart">
                                    <button class="btn btn-primary" type="submit">메시지 보내기</button>
                                    <a href="userDetailPage.do?userEmail=${data.userEmail}" class="btn btn-default">프로필 보기</a>
                                </div>
                            </div>
                            <h3><a href="userDetailPage.do?userEmail=${data.userEmail}">닉네임: ${data.userNickname}</a></h3>
                            <div class="height">키: ${data.userHeight || 'N/A'}cm</div>
                            <%--<div class="description">${data.userDescription || '설명 없음'}</div>--%>
                        </div>
                    </div>
                `;

EL문 때문에 일어난 오류.

해결책은 크게 3가지
var text = 오늘은 {'{day}'} 입니다.
var text = 오늘은 ${day} 입니다.
jsp내부에 있는 script 태그 내에서 일어나는 문제이므로
모듈화해서 js파일로 모듈화 시키면 된다

  1. 프리미엄 결제 안한 다른 회원으로 로그인 했는데 광고가 사라진 버그
    logout시 session에서 premium정보를 지우지 않고 있어서 생긴 버그
    session.invalidate로 전부 삭제

  2. 로그인시 소셜타입 확인하는데

    소셜로그인은 소셜타입을 받아오지만
    일반 로그인은 소셜타입이 없기 때문에 문제가 발생

  1. 출력시 나이를 계산해서 출력하는데, 그 값을 n/a로 출력하는 에러

    원인: 템플릿 리터럴에서 year || 'N/A'는 year가 falsy 값(예: 0, undefined, NaN, null)이면 'N/A'를 사용

해결: 예외처리를 안해버리면 된다

11.내가 받은 알림을 하나씩 클릭해서 읽음으로 바꾸는 로직인데, 모두 읽음 상태여야 '새 알림이 있습니다'가 숨겨져야하는데 하나만이라도 읽음으로 바꾸면 바로 숨겨지는 문제

function markAsRead(alertNumber) {
        // 클릭된 알림 번호를 로그에 출력
        console.log("로그: 알림 번호 [" + alertNumber + "]");

        // AJAX 요청을 통해 알림 상태를 "읽음"으로 변경
        $.ajax({
            url: "/updateAlertStatus",  // 상태를 업데이트할 URL
            type: "POST",
            data: {alertNumber: alertNumber},  // alertNumber만 쿼리 문자열로 보내기
            dataType: 'json',  // 서버에서 응답으로 받는 데이터 타입
            success: function (response) {
                console.log("로그: 상태 업데이트 성공 [" + response + "]");

                // 상태 업데이트 성공 시, UI에서 해당 알림의 상태를 '읽음'으로 변경
                $("#alert-" + alertNumber)
                    .find(".alert-status")
                    .css("background-color", "#4CAF50")  // '읽음' 색상으로 변경
                    .text("읽음");  // 텍스트를 '읽음'으로 변경

                // 매번 알림을 읽음으로 표시할 때마다 호출
                // 새 알림이 있습니다 숨기기 위한 함수
                checkAllAlertsRead();
            },
            error: function () {
                console.log("비동기 처리 실패");
            }
        });
    }

    // 알림 상태를 모두 확인하여 "새 알림이 있습니다" 메시지를 숨기기
    function checkAllAlertsRead() {
        // 모든 알림이 '읽음' 상태인지 확인
        let allRead = true;

        $(".alert-status").each(function () {
            if ($(this).text() === '읽지 않음') {
                allRead = false;
            }
        });

        // 모든 알림이 읽음이면 "새 알림이 있습니다" 메시지 숨기기
        if (allRead) {
            $(".top-cart-info").hide();  // "새 알림이 있습니다" 메시지를 숨김
        }
    }

해당 로직은 문제가 있음.

새로운 로직을 생각해냈는데, 매번 읽음으로 상태가 업데이트 될 때 마다 arraylist안에있는 데이터에 접근해서 모든 데이터가 읽음인지 확인하면 됨.
해당 로직을 적용하려면 일단 mainpageAction에서 데이터를 arraylist말고 json으로 변환해서 보내야함.
-> 데이터를 변환해서 보낼경우 html에서 직접 읽을수는 없음
동적으로 처리하는 방식을 택함 : js에서 html처리해서 출력하기로 결정
결론: 작동함


한 신고자가 같은 피신고자를 여러번 신고할 수 있는 버그
문제: ReportAction에서 막는 기능이 없었음
해결: 기능 만들고, reportDAO에 selectOne 만들어서 막기

오류표시 키기 끄기

0개의 댓글