테스트 사이트 - 개발 중인 베타 버전입니다

DB 수정 없이 여분필드 길이 및 갯수 늘리기

· 2년 전 · 2178 · 2

DB 수정 없이 여분필드 길이 및 갯수 늘리기

 

예전 그누보드도 그렇고 지금도 여분필드를 사용하면서 파이프라인(또는 짝대기라 부르는 요녀석 -> |)을 쓰거나 조금 관련 지식이 있다 하시는 분들은 JSON을 많이 사용하고 계실 겁니다.

 

여분필드를 많이 써야할땐 wr_* 로 시작하는 필드를 거의 무한정 늘리기도 하고요.

 

하지만... 호랑이는 죽어서 가죽을 남기고 사람은 죽어서 이름을 남긴다는 말 처럼(?) 원래의 프로그램 코드는 배제한 채 데이터베이스(DB)에 남은 기록만 가지고 데이터의 종류를 파악해야 하거나 또는 재구성, 마이그레이션, 복구 등을 진행해야 되는 상황이 오기 마련인데요.

 

이럴 땐 특정 문자(파이프라인 등)로 나눠놓은 필드나, wr_*로 무한정 늘려놓은 필드는 나쁜 걸림돌이 됩니다.

 

JSON의 경우 가장 호환성이 좋은 대안이긴 하지만, DB에서 한 줄로 쭉 나열하여 보았을 때 사람 입장에선 가독성이 좋은 양식은 아닌데다가 길이가 길어지면 결국 데이터타입을 수정해주어야 합니다.

 

그래서 이것을 피하기 위한 대안이 될 수 있는 팁을 적어보자 합니다.

 

1. 필드를 나눌 수 있는 표현형은 파이프라인 또는 JSON만 있는게 아니다

웹 브라우저에는 아주 재미있는 표현형이 있습니다. 아래와 같이 웹 브라우저에서 확인할 수 있습니다.

 

2283217713_1692202159.4976.png

 

뭔가 필드를 잘 나눠줄 것 같이 생기지 않았나요? 여기선 이것에 착안하여 key{N}=value{N}; 방식의 표현을 사용해보려고 합니다.

 

 

2. key{N}=value{N}; 표현을 처리할 수 있는 함수를 짜보자

 

define("DEFAULT_HTML_ENTITY_FLAGS", ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401);  // 상위에 정의하세요.

function darklion_build_stored_data($data) {
    $terms = array();
    foreach($data as $k=>$v) {
        $k = htmlentities($k, DEFAULT_HTML_ENTITY_FLAGS, 'UTF-8');
        $v = htmlentities($v, DEFAULT_HTML_ENTITY_FLAGS, 'UTF-8');
        array_push($terms, $k . '=' . $v);
    }
    return implode("; ", $terms);
}

function darklion_parse_stored_data($s) {
    $data = array();

    $terms = array_filter(array_map("trim", explode(";", $s)));
    foreach($terms as $term) {
        list($k, $v) = explode('=', $term);
        $k = html_entity_decode($k, DEFAULT_HTML_ENTITY_FLAGS, 'UTF-8');
        $v = html_entity_decode($v, DEFAULT_HTML_ENTITY_FLAGS, 'UTF-8');
        $data[$k] = $v;
    }

    return $data;
}

 

 

3. 여분필드에 정보를 기입해보자 (멤버 여분필드에 기입하는 예시)

 

$stored_data = darklion_build_stored_data(array(
    "a" => "1",
    "b" => "2"
))
$sql = " update {$g5['member_table']} set mb_10 = '{$stored_data}' where mb_id = '{$mb['mb_id']}' ";
sql_query($sql);

 

결과: 해당 사용자의 mb_10 필드에 a=1; b=2; 라는 값이 기록됨.

 

 

4. 여분필드의 길이 제한을 극복해보자

필드의 길이가 충분한 필드를 가진 DB 필드는 g5_memo의 me_memo 필드, g5_write_* 각 테이블의 wr_content에 있습니다. 이것을 활용하여 DB 수정 없이 필드의 길이를 늘릴 수 있습니다.

만약, 학창시절 컴퓨터 공학이나 그 비슷한걸 전공하셨다면 '포인터'가 생각날 수 있는 방식입니다.


(1) 쪽지를 생성하고 ID를 가져오는, 그리고 ID를 이용해 쪽지를 가져오는 함수 생성

 

function darklion_add_memo($mb_id, $recv_mb_id, $me_memo) {
    global $g5;
    
    $tmp_row = sql_fetch(" select max(me_id) as max_me_id from {$g5['memo_table']} ");
    $me_id = $tmp_row['max_me_id'] + 1;

    $sql = " insert into {$g5['memo_table']} ( me_recv_mb_id, me_send_mb_id, me_send_datetime, me_memo, me_read_datetime, me_type, me_send_ip ) values ( '{$recv_mb_id}', '{$mb_id}', '" . G5_TIME_YMDHIS . "', '{$me_memo}', '0000-00-00 00:00:00' , 'recv', '{$_SERVER['REMOTE_ADDR']}' ) ";
    sql_query($sql);

    return ($me_id == sql_insert_id() ? $me_id : 0);
 

function darklion_get_memo($me_id) {
    global $g5;

    $me = sql_fetch(" select me_memo from {$g5['memo_table']} where me_id = '{$me_id}' ");
    return $me['me_memo'];
}

 

(2) 해당 ID를 이용하여 여분필드에 번호 값 기록

 

$a_id = darklion_add_memo($mb['mb_id'], $mb['mb_id'], '1');
$b_id = darklion_add_memo($mb['mb_id'], $mb['mb_id'], '2');

// 회원 정보에 등록
if ($a_id > 0 && $b_id > 0) {
    $stored_data = darklion_build_stored_data(array(
        "a" => $a_id,
        "a" => $b_id
    ));
    $sql = " update {$g5['member_table']} set mb_10 = '{$stored_data}' where mb_id = '{$mb['mb_id']}' ";
    sql_query($sql);
}

 

(3) 이렇게 반영된 데이터를 조회하는 방법

 

$parsed_data = darklion_parse_stored_data($mb['mb_10']);
$a_id = darklion_get_memo($parsed_data['a_id']);
$b_id = darklion_get_memo($parsed_data['b_id']);

echo $a_id . '<br>';

echo $b_id . '<br>';


이렇게 하시면 여분필드의 길이나 갯수를 확장하기 위해 데이터베이스 구조를 수정하는 하는 일이 줄어들 수 있습니다.

이 팁이 실제 적용된 예시는 특정 플러그인에 있으니 참고 바랍니다. https://sir.kr/g5_plugin/10381

주의: 쪽지 테이블을 이용하는 경우 일정 기간이 지나면 자동 삭제될 수 있으므로, 영구 저장을 원하시는 경우 g5_write_*(게시판) 테이블을 별도 생성하여 진행하시기 바랍니다.

감사합니다.

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 2개

2년 전
호오... 멋진 팁 감사합니다.
2년 전
@비타주리 감사합니다 ㅎㅎ

게시글 목록

번호 제목
21184
21166
21157
21136
21132
21124
21119
21114
21106
21095
21069
21063
21060
21058
21053
21035
21032
21028
21009
21000
20994
20993
20984
20979
20958
20935
20934
20930
20913
20883