ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 검증 유의사항
    공부 2016. 10. 17. 16:14


    기존에 짜여진 코드를 새로운 언어로 변경하여 검증을 할 때 신경써야 하는 부분이 정말 많습니다. 이 중에서 우선순위를 두어 순차적으로 문제해결하는 방법을 설명하겠습니다.

    기존에 진행하면서 애먹었던 경험을 기반으로 작성한 주관적인 글입니다.

    단계별 중요도

    1) 이전 코드와 정확한 동작을 하는 프로세스인지 확인

    가장 기본이 되는 부분입니다. 기존 코드와 변경한 코드가 동일한 동작을 하는 것이 맞는지 확인을 해야 합니다.

    2) 각 언어의 정책 확인

    여기서 중요하게 봐야할 점은 데이터 타입빌트인 함수의 동작syntax error 등이 있습니다.

    이전에 기존 소스를 새로Go라는 언어로 개발하여 데이터를 검증한 경험이 있는데 Go의 경우 그냥 int를 사용하면 os에 영향을 받아 int 32일 수도 있고 int 64일 수도 있습니다. 이와 같이 데이터 타입을 먼저 확인해야 하고 빌트인 함수가 기존 언어의 동작과 동일한지 확인해야 합니다. 동일한 함수명일지라도 동작하는 형식이 조금 씩 다를 수 있습니다.

    한마디로 기존에 사용하던 언어와 변경할 언어의 정책을 확인해야 합니다.

    3) 인코딩

    1)번과 2)번이 다른 테스트 케이스를 통해 동일하게 동작하는 것이 확인되면 이제 데이터에 대해 의심을 해야 합니다. 먼저 인코딩을 같은 코드로 했는지 먼저 확인합니다. 윈도우 메모장을 압축하여 해당 파일을 전달한 다음 디비에 밀어 넣는다면 UTF8-BOM 문제로 인해 골치아플 것입니다. 

    4) 데이터베이스간 정책 확인

    위 까지 동일하다면 데이터베이스간 취하는 정책을 확인해야 합니다. 동일한 쿼리여도 어느 데이터베이스에서는 동작하는데 다른 데이터베이스에서는 동작하지 않는 쿼리가 있습니다. 또한 order by 정책이 달라 나오는 순서가 다르다던지 aggregate 함수가 존재하는데 group by나 aggregate 함수로 감싸지 않은 필드에서 그대로 데이터가 나오는 둥 여러 문제가 있습니다. 앞에서 다 말했지만 다음 sqlite와 postgresql 정책 차이를 예로 들겠습니다.

    SQLite, PostgreSQL 정책 비교


    SQLitePostgreSQL
    문자열 우선순위가 달라 order by의 순서가 동일하지 않음

    문자열 가장 첫 글자부터 순서대로 크기 비교
    100보다 99가 더 큰 문자열로 나옴 - 첫 번째 문자을 비교하면 1과 9이기 때문

    **만약 문자열이 숫자가 아닌 한글이라면?
    1. 숫자와 마찬가지로 가장 첫 문자끼리 비교 (길이 상관 x)
    2. 첫 문자가 같다면 다음 문자 비교
    3. 다른 문자 값이 나올 때까지 비교

    문자열 가장 첫 글자부터 순서대로 크기 비교
    100보다 99가 더 큰 문자열로 나옴 - 첫 번째 문자을 비교하면 1과 9이기 때문

    **만약 문자열이 숫자가 아닌 한글이라면?
    1. 먼저 글자의 길이대로 정렬
    2. 길이가 같다면 첫 번째 문자끼리 비교
    3. 첫 번째 문자가 같다면 다음 문자 비교
    4. 다른 문자 값이 나올때까지 반복

    [가, 나, 다, 바, 가나다, 나다, 가나바] 정렬 결과

    [가,가나다,가나바,나,나다,다,바]

    [가,나,다,바,나다,가나다,가나바]
    select name, date from test group by date; - 쿼리의 동작 여부

    해당 쿼리가 동작함

    원래는 동작하면 안되는 쿼리지만 SQLite 내에서 group by 나 aggregation function이 필요한 부분에 기본값으로 max()함수를 씌워서 출력

    해당쿼리가 동작하지 않음

    원칙대로 name에 aggregation function이나 group by로 묶여있지 않기 때문에 에러를 출력

    SQLite만 가지고 있는 특징

    위 쿼리의 select 부분에 max(count)를 추가하면 나오는 결과가 변경됨

    aggregation function이 추가되면 name에 max()를 씌우는 것이 아니라 date가 같은 로우들을 전부 오름차순으로 정렬 (여기서 정렬 순서는 group by에 나열된 순서 혹은 select에 명시한 필드명 순서 같음)한 다음 가장 첫 번째 로우를 뽑아서 출력

    그런거없음


    댓글