ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SW 정글 102일차] 나만의 무기 10일차 (생명체 사망 API)
    기타/SW 사관학교 정글 2021. 11. 13. 03:28

    이전 글에 쓴 AWS RDS 서버시간 변경을 완료하고 어제 해결하지 못한 생명체 사망 API를 완성하려고 시도했다.

    모든 조원들이 나오기 전까지는 AWS에 대해 얄팍한 지식이라도 쌓고 싶어서 AWS에서 쓰여지는 용어, 그리고 EC2에 대해 알아보다가 중간에 멈추고 API 설계를 다시 고민했다.

     

    고민하면서 나온 방법은 아래와 같다.

    인증관련table과 생명체관련table을 join해서 정각에 사망처리(삭제)해야하는데 어떻게 해야할까?

    일단은 사망처리해야하는 생명체는 인증조자 하지 않은 생명체, 인증은 했는데 수락을 받지 못한 생명체이다.

    인증은 했는데 수락을 받지 못한 생명체는 인증관련table에서 isAuth라는 column에서 boolean 타입으로 수락을 받았으면 1, 받지 못했으면 0으로 관리를 해주기 때문에 해당하는 생명체를 뽑아오기는 쉬웠다.

     

    하지만, 인증조차하지않은 생명체는 표시를 해주는 table이 없었다.

    조원과 같이 고민을 하면서 나온 방법은 인증관련table과 생명체관련table을 어떠한 방법을 통해 여집합을 구하는 것이다.

    즉, 인증관련table에 정보가 없다는 것은 인증조차 하지 않은 생명체이니까 집합개념을 도입하면 생명체table-인증관련table을 해서 여집합을 구하면 된다는 것이다.

     

    위 방법 이외에 생명체관련table에서 인증을 요청한 생명체를 표시하기 위한 column을 추가해서 여집합을 구하는 것을 피해볼까?했는데 그게 더 복잡하다는 생각이 들었다.

     

     

    그래서 위 방법으로 일단은 시도해보자!했지만 혼자 API를 구현하려 하는데 더 좋은 방법이 있을 것 같았다.

    그래서 계속 고민을 해보다가 새로운 방법을 찾았다.

    새로 찾은 방법은 생명체관련table에서 모든 처리를 할 수 있게 해주는 것이다.

    일단은 3가지 column이 생명체 관련 table에 추가된다.

    하나는 한 주에 인증 완료(상대방까지 수락)한 수를 저장하는 column, 하나는 주에 몇 회 시행하는지를 저장하는 column, 하나는 초기화 기점요일이 언제인지 저장하는 column이다.

     

    우리의 기획이 주 n회 즉, 일주일에 몇 일 무엇을 목표로 잡고 달성하자이다.

    예를 들어 주 3회 저녁먹고 산책하기라고 하고 각자 시작하는 요일이 다르므로 일주일이라는 기점을 설정해준다.

    그러면 주 몇 회 시행하는지 column에는 3, 초기화 기점요일 column은 요일, 한 주에 인증 완료 column에는 default로 0이 들어간다.

    여기서, 요일은 월요일, 화요일 같이 VARCHAR로 들어가는 것이 아니라 INT로 들어갔다.

    0: 일, 1: 월, 2: 화, 3: 수, 4: 목, 5: 금, 6: 토, 7: 매일

     

    이렇게 INT로 한 이유는 다음과 같다.

    let today = new Date();
    let day = today.getDay();

    위 코드로 해당 시점의 요일을 가져올 수 있는데 반환값이 0: 일, 1: 월, 2: 화, 3: 수, 4: 목, 5: 금, 6: 토 이기 때문이다.

     

     

    이렇게 생명체관련 table에 3개의 column을 추가해주면 원하는 생명체 사망 API를 완성할 수 있다.

    const j = schedule.scheduleJob({hour: 00, minute: 00}, function(){
        let today = new Date();
        let day = today.getDay();
        console.log(day);
        connection.query('INSERT INTO Alien_dead (user_info_id, Challenge_id, createDate, alienName, Alien_image_url, accuredAuthCnt, failureCnt) SELECT user_info_id, Challenge_id, createDate, alienName, Alien_image_url, accuredAuthCnt, failureCnt FROM Alien where week_auth_cnt < total_auth_cnt AND (auth_day = 7 OR auth_day = ?)', [day], function(err, results){
            if (err) {
                console.error(err);
            }
            console.log('success insert dead_alien!!!!!!!!!', results);
        });
        connection.query('INSERT INTO dead_authentification SELECT Authentification.id, Authentification.user_info_id, Alien_id, Authentification.Challenge_id, requestDate, responseDate, requestUserNickname, responseUserNickname, isAuth, imgURL FROM Authentification LEFT JOIN Alien ON Alien.id = Authentification.Alien_id where week_auth_cnt < total_auth_cnt AND (auth_day = 7 OR auth_day = ?)', [day], function(err, results){
            if (err) {
                console.error(err);
            }
            console.log('success insert dead_authentification!!!!!!!!!', results);
        });
        connection.query('DELETE FROM Authentification USING Alien LEFT JOIN Authentification ON Alien.id = Authentification.Alien_id where week_auth_cnt < total_auth_cnt AND (auth_day = 7 OR auth_day = ?)', [day], function(err, results){
            if (err) {
                console.error(err);
            }
            console.log('success delete authentification!!!!!!!!!', results);
        });
        connection.query('DELETE FROM Alien where week_auth_cnt < total_auth_cnt AND (auth_day = 7 OR auth_day = ?)', [day], function(err, results){
            if (err) {
                console.error(err);
            }
            console.log('success delete Alien!!!!!!!!!', results);
        });
        connection.query('UPDATE Alien SET week_auth_cnt = 0 where week_auth_cnt < total_auth_cnt AND (auth_day = 7 OR auth_day = ?)', [day], function(err, results){
            if (err) {
                console.error(err);
            }
            console.log('success update Alien!!!!!!!!!', results);
        });
        
    });

    00시 00분 정각에 채워야할 인증을 못채우고 인증을 매일해야하거나 기점일이 today인 생명체를 찾아와서 dead_alien 테이블에 insert한다.

    alien table은 authentification과 1:N관계이므로 alien테이블에서 삭제를 바로하지 못한다.

    그래서 authentification에 관련된 row를 삭제해야하는데 죽은 생명체의 history도 관리해주어야하기에 dead_authentification에 해당 데이터를 옮겨준다.

    그리고 authentification에서 삭제 생명체 관련 데이터를 삭제해주고 alien에서도 삭제해준다.

    마지막으로 alien테이블에서 주 인증 횟수를 다시 0으로 초기화해주면 API 구현이 완성된다.

     

     

    막상 이렇게 쿼리로 짜고 다시보니 몇 시간만에 할 수 있었을 것 같다는 생각이 들었다...

    처음이이니까 당연히 시간이 오래 걸렸을 것이고 해냈다는 것에 의미를 두고 성장하고 있다고 생각해야겠다.

    내일은 챌린지 진행 중인 생명체를 저장해주는 API와 메인화면에 랜덤으로 물고기를 띄어주는 API를 구현해야한다.

    댓글

Designed by Tistory.