프로젝트/SUFY

[도착 알리미 SUFY] 10. 설정한 알림 조회

kim-dev 2024. 2. 25. 18:12
반응형

 
이제 핵심 기능들은 거의 다 구현했고, 편의 기능들을 추가로 더 구현하면 될 것 같다.
첫 번째로는 내가 설정한 알림 목록을 조회하는 기능을 구현해보려고 한다!


일단 다음과 같이 '설정된 알림 조회' 버튼을 만들어 주고, 클릭 시 /searchAlarms로 이동하게 해주었다.
그리고 /searchAlarms 페이지로 이동하면, div에 접속한 유저가 설정한 알림들을 모두 보여주면 된다.
 
알림들을 보여주는 컨트롤러와 로직은 다음과 같다.

< HomeApiController.java >

@GetMapping("/alarmList")
public ArrayList<Alarm> alarmList(@RequestParam String username) {
    ArrayList<Alarm> alarms = homeService.alarmList(username);

    return alarms;
}
< HomeService.java >

@Transactional(readOnly = true)
public ArrayList<Alarm> alarmList(String username) {
    Account user = accountRepository.findByUsername(username);
    ArrayList<Alarm> alarms = alarmRepository.findAllByUser(user);

    return alarms;
}

 
그럼 이제 ajax로 "/alarmList" url로 GET요청을 보내면, 응답으로 알림 목록들을 반환해 준다.
그럼 프론트 측에서는 이 알림 목록들을 잘 다듬어서 보여주면 될 것!
 
나 같은 경우는 alarmList()라는 함수를 선언해서, 해당 함수를 호출하면 /alarmList로 요청을 보내도록 만들었다.
그리고 페이지가 로드되면 자동으로 alarmList()를 호출하도록 설정했다!

< searchAlarms.jsp >

function alarmList() {
    $.ajax({
        type: "GET",
        url: "https://kapi.kakao.com/v2/user/me",
        headers: {'Authorization': localStorage.getItem('Authorization'),
            'Content-type': "Content-type: application/x-www-form-urlencoded;charset=utf-8"}
    }).done(function (resp) {
        var idx = 1;
        const stationContainer = document.getElementById('stationContainer');

        let data = {
            username: "K" + resp.id,
        }
        $.ajax({
            type: "GET",
            url: "/alarmList",
            data: data
        }).done(function (alarms) {
            alarms.forEach(function (alarm) {
                const alarmDiv = document.createElement('div');
                alarmDiv.className = "alarmDiv";

                const alarmIdx = document.createElement('div');
                alarmIdx.className = "alarmIdx";
                alarmIdx.innerText = idx;
                idx++;

                const alarmContent = document.createElement('div');
                alarmContent.className = "alarmContent";
                alarmContent.innerText = "노선: " + alarm.subwayName + "\r\n열차번호: " + alarm.subwayNo + "\r\n목적지: " + alarm.stationName + " 역";

                const alarmDelete = document.createElement('div');
                alarmDelete.className = "alarmDelete";
                alarmDelete.innerText = "삭제";

                alarmDiv.appendChild(alarmIdx);
                alarmDiv.appendChild(alarmContent);
                alarmDiv.appendChild(alarmDelete);
                stationContainer.appendChild(alarmDiv);
            })
        })
    });
}

// 페이지가 로드되면 알림 목록을 불러온다.
document.addEventListener("DOMContentLoaded", function() {
    alarmList();
});

 
 
알림 삭제의 경우에도 똑같이 ajax를 보내서 삭제한 후, alarmList()를 호출해서 페이지를 갱신하면 된다.

< searchAlarms.jsp >

function alarmDelete2(alarmId, subwayLine, stationID) {
    let data = {
        alarmId: alarmId,
        subwayLine: subwayLine,
        stationID: stationID
    };
    $.ajax({
        type: "DELETE",
        url: "/alarmDelete",
        data: data
    }).done(function() {
        alert("알림이 삭제되었습니다.");
        document.getElementById('stationContainer').innerHTML = "";
        alarmList();
    }).fail(function(error) {
        alert("알림을 삭제하는 데 실패하였습니다. (콘솔 확인)");
        console.log(error);
    });
}

알림을 삭제하는 함수는 다음과 같이 만들어 주었다.
ajax를 사용해서 간단히 삭제 요청을 보내는 것!
 
그리고 아까 만든 알림 목록 div에서, 삭제 버튼을 누르면 alarmDelete2() 함수를 동작시키도록 만들어 준다.

alarmDelete.onclick = function() {alarmDelete2(alarm.id, alarm.subwayLine, alarm.stationID)};

여기서 매개변수로는 그 알림의 DB 상 id가 들어가며, 서버 측에서 이 id를 가지고 해당 알림을 삭제해 주면 된다.
 

< HomeApiController.java >

@DeleteMapping("/alarmDelete")
public void alarmDelete(@RequestParam int alarmId, @RequestParam int subwayLine, @RequestParam String stationID) {
    homeService.alarmDelete(alarmId, subwayLine, stationID);
}
< HomeService.java >

@Transactional
public void alarmDelete(int alarmId, int subwayLine, String stationID) {
    // 해당 알림을 DB에서 삭제
    alarmRepository.deleteById(alarmId);

    // 역에 등록된 알림 개수를 하나 감소
    Station station = stationRepository.findBySubwayIdAndStationId(subwayLine, stationID);
    station.setSettedAlarm(station.getSettedAlarm() - 1);
}

이렇게 해주면 알림 목록 조회 및 삭제는 구현이 모두 끝난다!