본문 바로가기
업무 기록/ETC

Data too long for column 장애 처리 과정

by code2772 2023. 12. 7.

[ 목차 ]

    728x90
    반응형

    <장애처리>

    이번에 웹을 마이그레이션 후 서비스를오픈 하고 고객 측에서 로그인이 안된다는 문제가 있었다. 


    해당 로그인이 안되는 계정 정보를 전달 받은 후 해당 WAS 서버의 로그를 확인해보니 로그인 하는 경우 해당 아이디의 정보에 따라 oracle에 저장되어 있는 발신번호가 mysql에 저장되는 구조로 그 정보를 웹단에서 활용하는 부분이다. 근데 한 계정에 발신번호가 5000건 이상 있어 mysql에 Insert 되는데 발생하는 문제점이였다. 기존 통합한 사이트는 WEB 계정만 사용을 하고 나머지 AGENT , MESSANGER, API, RESELLER 계정은 (구)웹사이트를 사용하는 중이였다. WEB 계정의 경우 1000건 이상되는 발신번호를 가진 계정이 없어 이 문제를 몰랐다가 합처지면서 여러 계정이 들어 오던 중 이 문제가 발생 한것이였다. 

     


    해당 에러를 해결했던 순서 이다. 

     

    먼저 grep명령어를 사용해서 해당 오류코드와 계정아이디 등을 확인하고 해당 시간데를 확인하여 오류가 발생한 로그로 이동하였다.

     

    해당 위치를 찾아가서 오류코드를 보았다. 여기서 자세한 오류코드를 올리기는 문제가 있고 간단하게 내가 바꾼 코드를 보면 index13번이 발신번호가 들어있는 부분이다.

     

     

     이 부분이 문제가 있다는 것을 먼저 확인하였고 해당 오류를 보니 SQL 문제로 Data too long for column 을 보니 해당 부분이 이상이 있다는 것을 확인할 수 있다. 

    이제 WAS 쪽 코드로 넘어가면 해당 계정이 로그인 하던 중 mysql 쪽으로 데이터를 넘기는 부분을 확인하면 문제는 해결된다는 것을 알 수 있다.

     

     

    <코드예시>

    생각을 해보니 내가 마이그레이션 한 부분은 발신번호를 mysql 에서 사용하지 않는 부분이였다. 그렇기 때문에 읽어오는 SQL 쿼리 부분에서 테이블을 JOIN 후 CASE 문으로 상황에 맞게 넣어주기만 하면 문제가 해결 될거라고 생각하였고 그 생각은 정답이였다.

     

    public List<MunjaCallbackInfoVO> selectLoginCallbackInfos(String dbName, String userId) {
        String sql = 
                "SELECT "
                + "CASE WHEN a.Client_Kind <> 'WEB' THEN NULL ELSE c.CALLBACK END AS NEW_CALLBACK_NAME, "
                + "c.NEW_REG_FLAG_NAME, c.NEW_REG_DATE_NAME "
                + "FROM "
                + dbName + ".TBL_CALLBACK c "
                + "JOIN " + dbName + ".TBL_CPINFO a ON c.CPID = a.CPID "
                + "WHERE "
                + "c.CPID = ? "
                + "ORDER BY c.NEW_REG_DATE_NAME DESC";
        
        if ("3".equals(dbSelect(dbName))) {
            return jdbcMultiTemplate.query(sql, new MunjaCallbackInfoRowMapper(), userId);
        } else if ("2".equals(dbSelect(dbName))) {
            return jdbcSubTemplate.query(sql, new MunjaCallbackInfoRowMapper(), userId);
        } else {
            return jdbcTemplate.query(sql, new MunjaCallbackInfoRowMapper(), userId);
        }
    }

     

     

    CASE 문

     + "CASE WHEN a.Client_Kind <> 'WEB' THEN NULL ELSE c.CALLBACK END AS NEW_CALLBACK_NAME, "

     

    조인한 cpinfo 테이블의 컬럼인 Client_Kind 의 값이 WEB 고객이 아닌 것은 Callback 즉 발신번호가 null로 표현을 하면 자동으로 mysql에 있는 callback값을 사용하지 않아도 되는 Agent, Messanger, Resseler 고객들의 값은 0이 나와 에러가 발생하지 않게 되었다.

     


    기존에도 장애처리는 해보았지만 처음으로 내가 배포한 서비스가 고객에게 연락이 왔는데 처음이라 너무 재미있었다. 간단한 오류였지만 실력이 어제보다 조금 상승한거같다.

    반응형

    '업무 기록 > ETC' 카테고리의 다른 글

    vi, vim 편집기 명령어 [Linux]  (1) 2023.12.12
    [Tomcat] work/catalina/localhost 폴더  (0) 2023.12.11
    개발자 경력 기술서  (3) 2023.12.02
    리눅스 크론탭(Crontab) 이란  (1) 2023.10.07
    Linux grep 간단한 명령어  (0) 2023.09.14