코드 작성시 초보가 실수하기 쉬운 것(주의할 부분)

망고고래 2025. 3. 28. 21:47

1. 문자 입력 이스케이프 처리

프로시저에서 json 문자열을 처리할 때 따옴표, 쌍따옴표, 백슬래시에 이스케이프 처리가 되어 있지 않으면 오류를 일으킨다.

문자 입력하는 곳마다 해놓는 게 속 편할 듯

//문자열에서 JSON 문자열 추출 및 이스케이프 처리(이스케이프 처리하는 함수를 따로 작성했을 경우 사용)
//따옴표 혹은 쌍따옴표로 감싸진 JSON 문자열을 찾아 match에 저장
const match = textData.match(/'(\{.*\})'/) || textData.match(/"(\{.*\})"/);
if (match) {
    const jsonStr = match[1];
    const escapedJsonStr = jsonStr
        .replace(/\\/g, '\\\\')  // 백슬래시 이스케이프
        .replace(/'/g, "\'")     // 작은따옴표 이스케이프
        .replace(/"/g, '\\"');   // 쌍따옴표 이스케이프
    textData = textData.replace(match[0], `'${escapedJsonStr}'`);
}

 

 

1) match()

(1) 함수 정의

- 정규 표현식과 일치하는 문자열을 찾는 함수

- 결과를 배열로 반환

(2) 반환값

- match[0]: 정규식과 완전히 일치한 전체 문자열(작은따옴표 또는 큰따옴표를 포함한 문자열)

- match[1]: 첫 번째 ()그룹에 해당하는 부분 문자열(작은따옴표 또는 큰따옴표를 제외한 JSON 데이터 자체)

 

예시

const proc = "CALL my_proc('{\"key\": \"value\"}')";

//match 실행
const match = proc.match(/'(\{.*\})'/);

//match에 들어가는 값
[
  "'{\"key\": \"value\"}'", // match[0] → 전체 문자열 (작은따옴표 포함)
  "{\"key\": \"value\"}"    // match[1] → JSON 부분만 (작은따옴표 제거됨)
]

 

 

2) replace()

textData에서 match[0]을 찾아 escapedJsonStr로 변환

 

2. api 통신 순차적 처리

async/then

 

 

3. 모달 닫고 열 때 form 데이터 초기화

document.getElementById('dataForm').reset();

 

+ 테이블 초기화

document.querySelector('#dataTable tbody').innerHTML = '';

 

4. form 데이터 저장을 위한 통신시 falsy값 처리

const data1 = savedData1 || '';

 

5. 값이 문자열 'null'로 전해지는 경우 처리

1) 프론트엔드에서 처리

const dataForJSON = {
    data1: row.dataset.data1 || '',
    data2: row.dataset.data2 || '',
    //...
}

Object.keys(dataForJSON).forEach(key => {
    if (dataForJSON[key] === '' ||
        dataForJSON[key] === 'null' ||
        dataForJSON[key] === null){
        delete dataForJSON[key];
    }
});

2) 데이터베이스에서 처리

*JSON으로 온 데이터를 프로시저에서 추출하는 과정

SET p_column_data = CASE 
    WHEN JSON_EXTRACT(p_json_data, '$.column_data') = 'null' THEN NULL
    ELSE JSON_EXTRACT(p_json_data, '$.column_data')
END;

 

6. 불필요한 엔터 입력 고려

엔터 입력시 폼 제출 막기

document.addEventListener('keydown', function(event){
    if(event.keyCode === 13){
        event.preventDefault();
    }
}, true);