코드이그나이터4 데이터베이스 다루기 - 6 - 모델 유효성 검사

koeunyeon·2021년 4월 1일
0

모델 유효성 검사

이번 챕터의 코드는 https://github.com/koeunyeon/ci4/tree/model-validation 에 있습니다.

모델 유효성 검사 규칙

컨트롤러와 마찬가지로 모델에서도 유효성을 검사할 수 있습니다. 컨트롤러와 모델, 둘 다 유효성을 검사할 수 있다면 어디에서 유효성을 검사해야 할 지 헷깔릴 수도 있는데요. 저는 아래와 같은 규칙으로 검사합니다.

  • 컨트롤러의 값이 모델에서 그대로 쓰인다면 모델에서 검사한다.
  • 컨트롤러의 값이 모델에서 쓰이지 않는다면 컨트롤러에서 검사한다.
  • 컨트롤러의 값이 모델에 그대로 쓰이지 않고 변형이 일어난다면 컨트롤러와 모델 둘 다 각자의 규칙에 맞게 검사한다.

이와 같이 사용하는 이유는, 원칙상으로는 데이터를 다루는 것은 모델의 역할이기 때문입니다. 다만, 실제 데이터베이스에 저장되는 값이 아니라 연산을 위한 값들은 모델에서 검사할 수 없으므로 컨트롤러에서 검사하는 것입니다.

모델에 유효성 규칙 설정하기

모델에서 유효성을 검사하는 방법을 알아보겠습니다. 풍부한 모델에서 사용한 RichModel.php 파일을 그대로 사용하겠습니다. 아래 코드 중 // 유효성 검사 규칙. 부분과 // 유효성 검사 실패시 에러 메세지. 부분을 추가합니다.
/app/Models/RichModel.php

class RichModel extends Model
{
    protected $table = 'sample_rich';
    protected $allowedFields = ['name', 'age'];
    protected $primaryKey = "sample_rich_id";

    protected $useSoftDeletes = true;
    protected $useTimestamps = true;

    // 유효성 검사 규칙.
    protected $validationRules = [ // (1)
        'name' => 'required|min_length[4]|max_length[10]',
        'age' => 'required|is_natural|less_than[150]',
    ];

    // 유효성 검사 실패시 에러 메세지.
    protected $validationMessages = [  // (2)
        'name' => [
            'required' => '이름이 필요합니다',
            'min_length' => '이름은 최소 4글자 이상입니다.',
            'max_length' => '이름은 최대 10글자 이하입니다.'
        ],
        'age' => [
            'required' => '필수값입니다',
            'is_natural' => "나이는 자연수여야 합니다.",
            'less_than' => "정말 150세 이상이신가요?"
        ]
    ];
}

컨트롤러에서 $this->validate 구문으로 유효성을 검사했던 것과 조금 모양이 다릅니다. 모델은 내부적으로 $validationRules 멤버변수와 $validationMessages 멤버변수를 이미 부모 클래스에서 내장하고 있기 때문입니다.
코드이그나이터4의 모델은 $validationRules 변수가 빈 배열[]이 아니라면 자동으로 insert,update,save 메소드 호출시 유효성을 먼저 검사합니다.

(1) name 유효성 검사 규칙을 정의합니다. 내용은 컨트롤러와 동일합니다.
(2) age 유효성 검사 규칙을 정의합니다. 내용은 컨트롤러와 동일합니다.

컨트롤러에서 모델 유효성 다루기

/app/Controllers/Rich.php 파일에 아래의 엔드포인트를 추가하겠습니다.
/app/Controllers/Rich.php

public function valid($name, $age)
{
    $richModel = new  RichModel();
    $save_result = $richModel->save([ // (1)
        'name' => $name,
        'age' => $age
    ]);

    $errors = $richModel->errors(); // (2)

    return $this->response->setJSON([
        'result' => $save_result,
        'errors' => $errors
    ]);
}

(1) insert,update,save 메소드가 실행되면 자동으로 유효성을 검사합니다. 만약 유효성 검사에 실패하면 쿼리는 실행되지 않고 false를 반환하게 됩니다.

(2) 오류 메세지를 가져옵니다. 만약 $save_resulttrue라면 모델->errors()는 빈 문자열("")을 리턴합니다. $save_resultfalse라면 오류 메세지를 연관배열로 반환합니다.


http://localhost:8080/rich/valid/a/3 주소에 접속해서 오류 데이터를 확인해 봅시다.

{
    "result": false,
    "errors": {
        "name": "이름은 최소 4글자 이상입니다."
    }
}

여러 개의 유효성 검사 조건을 만족시키지 못했을 때도 확인해 보겠습니다. http://localhost:8080/rich/valid/a/300 주소에 접속합니다.

{
    "result": false,
    "errors": {
        "name": "이름은 최소 4글자 이상입니다.",
        "age": "정말 150세 이상이신가요?"
    }
}

http://localhost:8080/rich/valid/abcd/3 주소에 접속해서 오류가 없을 때도 확인합니다.

{
    "result": true,
    "errors": ""
}
profile
스타트업에 관심이 많은 10 + n년차 웹 개발자. 자바 스프링 (혹은 부트), 파이썬 플라스크, PHP를 주로 다룹니다.

0개의 댓글