Laravel

Laravel Model (라라벨 모델)과 Eloquent ORM 기본

itsdev 2025. 4. 29. 21:39

Laravel에서는 데이터베이스와의 상호작용을 쉽고 직관적으로 처리하기 위해 Model(모델) ORM(Object-Relational Mapping) 방식을 사용한다. 특히, Laravel이 기본으로 제공하는 Eloquent ORM은 복잡한 SQL 쿼리를 직접 작성하지 않고도 데이터베이스 작업을 간결하게 수행할 수 있도록 지원한다.

1. 모델(Model)이란 무엇인가?

모델(Model)은 데이터베이스 테이블과 1:1로 매핑되는 PHP 클래스이다. Laravel에서는 각 테이블을 대표하는 모델 클래스를 만들어, 데이터를 조회하거나 저장할 때 모델을 통해 객체 지향적으로 접근하게 된다.

✅ 기본 개념

  • 모델은 데이터베이스 레코드(한 줄)를 하나의 객체(Object)로 표현한다.
  • 모델을 이용하면 SQL 쿼리를 직접 작성하지 않고 메서드 호출만으로 데이터를 다룰 수 있다.
  • 모델 클래스 내부에는 해당 테이블과 관련된 비즈니스 로직을 함께 구현할 수 있다.

✅ Laravel 모델 규칙

  • Model명은 단수형(Singular), Table명은 복수형(Plural)이어야 한다.
  • Model  파일은 app/Models 디렉터리에 위치한다.
  • 기본적으로 Table명 은 Model명 의 복수형으로 자동 매칭된다. (예외 상황에서는 protected $table 속성으로 수동 지정 가능)

예시:

  • 테이블 이름: posts
  • 모델 클래스: Post
  • 파일 위치: app/Models/Post.php

✅ 모델의 주요 역할

  • 데이터 조회(Read) – 데이터베이스에서 레코드를 가져온다.
  • 데이터 저장(Create/Update) – 폼 입력이나 API 요청으로 받은 데이터를 데이터베이스에 저장한다.
  • 데이터 삭제(Delete) – 특정 레코드를 삭제하거나 논리 삭제(Soft Delete)한다.
  • 비즈니스 로직 수행 – 데이터와 관련된 규칙을 모델 안에 메서드로 정의할 수 있다.

✅ 실제 모델 기본 구조

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

    // 추가 설정: $fillable, 관계 정의 등
}

Laravel의 모델은 기본적으로 Illuminate\Database\Eloquent\Model을 상속받아 Eloquent ORM 기능을 사용할 수 있다.

app/Models/Post.php
app/Models/Post.php

2. ORM(Object-Relational Mapping) 기본 개념

ORM(Object-Relational Mapping)이란, 객체(Object)와 관계형 데이터베이스(Relational Database) 간의 매핑(Mapping)을 자동으로 관리해주는 기술이다. 즉, 개발자는 SQL 쿼리를 직접 작성하지 않고도 객체 지향 방식으로 데이터베이스 작업을 수행할 수 있다.

ORM을 사용하면 데이터베이스의 테이블이나 레코드를 PHP 클래스와 객체로 다루게 되며, 코드의 직관성과 유지보수성이 크게 향상된다.

✅ Laravel의 Eloquent ORM

Laravel은 기본적으로 Eloquent ORM을 제공한다. Eloquent를 사용하면 PHP 클래스(모델)를 통해 데이터베이스 레코드를 조작할 수 있으며, CRUD(Create, Read, Update, Delete) 작업을 간단한 메서드 호출만으로 처리할 수 있다.

✅ ORM의 핵심 개념 요약

  • 객체 ↔ 테이블 매핑: PHP 클래스 하나가 데이터베이스 테이블 하나에 매칭된다.
  • 객체 속성 ↔ 테이블 컬럼 매핑: 클래스의 속성(property)이 테이블의 컬럼(column)과 매칭된다.
  • 메서드 호출로 데이터베이스 작업: SQL 없이 메서드를 통해 데이터 조회, 삽입, 수정, 삭제를 수행한다.

✅ ORM 사용의 이점

  • 생산성 향상 – SQL 문을 직접 작성하지 않고 빠르게 개발할 수 있다.
  • 코드 가독성 증가 – 복잡한 쿼리를 객체 지향 코드로 표현할 수 있어 읽고 이해하기 쉽다.
  • 보안 강화 – SQL Injection 공격을 방지할 수 있다.
  • 테스트 용이성 – 테스트 환경에서도 객체 기반으로 쉽게 테스트할 수 있다.

✅ Eloquent ORM 사용 예시

1) 데이터 조회
// posts 테이블의 모든 레코드 조회
$posts = Post::all();

// id가 1인 레코드 조회
$post = Post::find(1);
2) 데이터 삽입
$post = new Post;
$post->title = '새 글 제목';
$post->contents = '글 내용입니다.';
$post->save();
3) 데이터 수정
$post = Post::find(1);
$post->title = '수정된 제목';
$post->save();
4) 데이터 삭제
$post = Post::find(1);
$post->delete();

✅ ORM을 사용할 때 주의할 점

  • 모델과 데이터베이스 테이블 매칭 규칙을 정확히 이해해야 한다. (모델명은 단수, 테이블명은 복수)
  • Mass Assignment 보호를 위해 $fillable 또는 $guarded 속성을 반드시 설정해야 한다.
  • 복잡한 쿼리가 필요한 경우 쿼리 빌더(Query Builder)Raw Query를 적절히 사용할 수 있다.

3. 모델 생성하기 (artisan 명령어)

Laravel에서는 artisan 명령어를 사용해 쉽게 모델 클래스를 생성할 수 있다. artisan은 Laravel에 내장된 명령어 기반 도구로, 모델, 컨트롤러, 마이그레이션 파일 등을 빠르게 생성할 수 있도록 지원한다.

✅ 기본 모델 생성 명령어

php artisan make:model Post

위 명령어를 실행하면 app/Models/Post.php 파일이 생성된다. 생성된 Post 모델은 기본적으로 데이터베이스의 posts 테이블과 연결된다.

  • Laravel의 네이밍 규칙: 모델명은 단수(Singular), 테이블명은 복수(Plural)
  • 모델 이름은 첫 글자 대문자(CamelCase)를 사용하는 것이 일반적

✅ 모델 파일 기본 구조

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;
}

모델 클래스는 Illuminate\Database\Eloquent\Model을 상속받아 Eloquent ORM의 모든 기능을 사용할 수 있다.

📌 모델 생성과 동시에 마이그레이션 파일 만들기

모델과 테이블 생성용 마이그레이션 파일을 한 번에 만들고 싶다면, --migration 또는 -m 옵션을 추가한다:

php artisan make:model Post --migration

이 명령어를 실행하면:

  • app/Models/Post.php 모델 파일 생성
  • database/migrations/2024_04_28_000000_create_posts_table.php 마이그레이션 파일 생성

※ 날짜와 시간은 자동으로 현재 타임스탬프 기준으로 생성된다.

✅ 추가 옵션 정리

옵션 설명
 --migration (-m) 모델과 함께 마이그레이션 파일 생성
 --controller (-c) 모델과 함께 컨트롤러 생성
 --resource 리소스 컨트롤러 생성 (CRUD 메서드 포함)
 --factory 팩토리 클래스(더미 데이터 생성용) 생성
 --seed 시더 클래스(초기 데이터 삽입용) 생

✅ 모델 생성 흐름 요약

  1. artisan 명령어로 모델 파일 생성
  2. 필요시 동시에 마이그레이션 파일도 생성
  3. 모델 내부에 $fillable 설정 및 관계(Relationship) 정의 추가
  4. 컨트롤러나 서비스에서 모델을 사용해 데이터베이스 작업 수행

✅ 모델 이름 짓기 팁

  • 항상 단수형으로 명명한다. (Post, User, Product)
  • 파일 이름과 클래스 이름은 일치시킨다. (Post.php 안에 Post 클래스)
  • 상태를 나타내는 이름보다는, 실제 데이터의 종류를 나타내는 이름을 사용한다.

4. Eloquent ORM을 통한 기본 데이터 조작

Laravel의 Eloquent ORM을 사용하면 복잡한 SQL 쿼리 없이 간단한 메서드 호출만으로 데이터베이스의 레코드를 쉽게 조작할 수 있다. 아래에서는 Eloquent ORM을 이용한 CRUD(Create, Read, Update, Delete) 작업의 기본 흐름을 정리한다.

✅ 데이터 조회 (Read)

// posts 테이블의 모든 글 가져오기
$posts = Post::all();
  • Post::all()은 posts 테이블의 모든 레코드를 가져와 Collection 객체로 반환한다.
  • 반환된 결과는 반복문(@foreach 등)으로 순회할 수 있다.
// 특정 글 하나 가져오기 (id 기준)
$post = Post::find(1);
  • Post::find(1)은 기본키(id)가 1인 레코드를 조회한다.
  • 찾지 못하면 null을 반환하므로 주의가 필요하다.

✅ 데이터 저장 (Create)

$post = new Post;
$post->title = '새 글 제목';
$post->contents = '글 내용입니다.';
$post->save();
  • new Post로 인스턴스를 생성한 후, 필요한 필드를 채운다.
  • $post->save()를 호출하면 INSERT 쿼리가 실행되어 데이터베이스에 저장된다.

✅ 데이터 수정 (Update)

$post = Post::find(1);
$post->title = '수정된 제목';
$post->save();
  • 먼저 수정할 레코드를 조회한 후, 속성을 변경하고 save()를 호출하면 UPDATE 쿼리가 실행된다.

✅ 데이터 삭제 (Delete)

$post = Post::find(1);
$post->delete();
  • delete() 메서드를 호출하면 해당 레코드가 데이터베이스에서 실제로 삭제된다.

✅ 추가 참고: 존재 여부를 먼저 확인하기

데이터를 수정하거나 삭제하기 전에 레코드가 존재하는지 확인하는 것이 안전하다.

$post = Post::find(1);

if ($post) {
    $post->title = '수정된 제목';
    $post->save();
} else {
    // 해당 ID의 글이 없음
}

✅ Eloquent의 대량 할당(Mass Assignment) 저장 방법

폼 데이터 전체를 한 번에 저장할 경우 create() 메서드를 사용할 수 있다. 이때는 모델의 $fillable 속성이 설정되어 있어야 한다.

Post::create([
    'title' => '폼으로부터 받은 제목',
    'contents' => '폼으로부터 받은 내용',
]);

 

📌 핵심 요약 

작업 메서드 설명
조회 all(), find(id)  전체 레코드 조회, 특정 레코드 조회
저장 save(), create() 새 레코드 저장
수정 save() 기존 레코드 수정 후 저장
삭제 delete() 특정 레코드 삭제

 

5. 모델에서 fillable 설정

Laravel Eloquent ORM에서는 대량 할당(Mass Assignment) 보안 문제를 방지하기 위해 모델에 $fillable 또는 $guarded 속성을 설정해야 한다.

Mass Assignment란, 사용자가 입력한 모든 폼 데이터를 한꺼번에 데이터베이스에 저장하는 방식이다. 만약 필드 제한을 두지 않으면, 의도치 않은 필드까지 조작당할 위험이 생길 수 있다.

✅ $fillable 속성

$fillable은 모델에 대해 mass assignment가 허용된 필드 목록을 명시하는 것이다. 지정한 필드만 사용자가 값을 할당할 수 있게 하여 보안을 강화한다.

간단한 예시:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

    protected $fillable = ['title', 'contents'];
}

위 설정을 하면 titlecontents 필드에 대해서만 mass assignment가 허용된다.

✅ mass assignment 예시

Post::create([
    'title' => '제목',
    'contents' => '내용',
]);

//$fillable에 등록된 필드만 저장되고, 다른 필드는 절대 조작 못함
// 정상 저장 OK

// 만약 $fillable 설정 없이 create()를 사용하면 에러 발생
// Illuminate\Database\Eloquent\MassAssignmentException

✅ $guarded 속성

$guardedmass assignment를 금지할 필드 목록을 명시한다. $fillable과 반대 개념이다.

protected $guarded = ['id'];
  • $guarded를 설정하면, 명시된 필드를 제외한 나머지 모든 필드는 mass assignment 허용
  • 완전히 허용하고 싶으면 protected $guarded = [];로 설정

✅ $fillable vs $guarded 차이점

구분 설명
$fillable 저장을 허용할 필드를 명시 (허용 리스트)
$guarded 저장을 금지할 필드를 명시 (금지 리스트)
권장 방식 $fillable 사용이 보안상 더 명확하고 안전함

✅ mass assignment 방지를 왜 해야 할까?

만약 보호 설정 없이 모든 필드를 mass assignment로 저장한다면, 사용자가 폼을 조작하여 admin 같은 필드를 강제로 조작할 수 있다. 이로 인해 심각한 보안 문제가 발생할 수 있다.

따라서 항상 $fillable을 이용해 명확하게 허용할 필드만 지정하는 습관을 들이는 것이 중요하다.

6. Eloquent ORM의 추가 기능

Laravel의 Eloquent ORM은 기본적인 CRUD(Create, Read, Update, Delete) 작업 외에도 현실적인 애플리케이션 개발에 필요한 다양한 고급 기능을 지원한다. 이를 통해 개발자는 더 복잡한 데이터 조작과 관리 작업을 효율적으로 수행할 수 있다.

✅ 쿼리 빌더(Query Builder) 연동

Eloquent는 내부적으로 쿼리 빌더(Query Builder)와 통합되어 있다. 따라서 복잡한 조건 검색, 정렬, 페이징 등도 간단하게 작성할 수 있다.

// 조건 검색
$posts = Post::where('title', 'like', '%라라벨%')
             ->orderBy('created_at', 'desc')
             ->paginate(10);
  • where() – 조건문 작성
  • orderBy() – 정렬
  • paginate() – 페이지네이션 처리

✅ 모델 간 관계(Relationship) 설정

Eloquent는 테이블 간 관계를 쉽게 정의할 수 있는 기능을 제공한다. 대표적으로 다음과 같은 관계를 설정할 수 있다:

  • hasOne – 일대일(1:1) 관계
  • hasMany – 일대다(1:N) 관계
  • belongsTo – 소속 관계 (자식 테이블에서 부모를 참조)
  • belongsToMany – 다대다(N:N) 관계
// Post 모델 (1개의 Post는 여러 개의 Comment를 가질 수 있다)
public function comments()
{
    return $this->hasMany(Comment::class);
}

관계를 정의하면 Eloquent는 $post->comments와 같은 간결한 문법으로 관련 데이터에 접근할 수 있게 해준다.

✅ 소프트 삭제(Soft Deletes)

데이터를 실제로 삭제하지 않고, 삭제된 것처럼 표시하는 기능이다. 이 기능을 사용하면 데이터를 복구할 수 있는 여지를 남길 수 있다.

📌 사용 방법
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    use SoftDeletes;
}
  • 테이블에 deleted_at 컬럼이 필요하다.
  • SoftDeletes를 적용하면 delete() 호출 시 실제 삭제가 아닌 deleted_at에 삭제 시간을 기록한다.
✅ 소프트 삭제된 레코드 조회
$posts = Post::withTrashed()->get(); // 삭제된 데이터 포함 조회
$posts = Post::onlyTrashed()->get(); // 삭제된 데이터만 조회

✅ 모델 팩토리(Model Factory)를 이용한 더미 데이터 생성

테스트나 개발 초기 단계에서는 대량의 테스트 데이터를 만들어야 할 때가 있다. Laravel의 모델 팩토리 기능을 이용하면 더미 데이터를 쉽게 생성할 수 있다.

📌 팩토리 생성 명령어
php artisan make:factory PostFactory --model=Post
📌 팩토리 기본 예시
namespace Database\Factories;

use App\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;

class PostFactory extends Factory
{
    protected $model = Post::class;

    public function definition()
    {
        return [
            'title' => $this->faker->sentence,
            'contents' => $this->faker->paragraph,
        ];
    }
}
📌 더미 데이터 생성
Post::factory()->count(50)->create();

위 코드를 실행하면 posts 테이블에 50개의 더미 레코드가 삽입된다.

728x90

정리하며

Laravel에서는 모델(Model)과 Eloquent ORM을 통해 데이터베이스와의 상호작용을 쉽고 효율적으로 처리할 수 있다. 모델은 테이블과 1:1로 매칭되며, 객체 지향 방식으로 데이터 조회, 저장, 수정, 삭제를 수행한다.

ORM을 활용하면 복잡한 SQL 없이도 직관적인 메서드 호출만으로 데이터 조작이 가능하며, mass assignment 보호를 위한 $fillable 설정과 모델 간 관계 설정, 소프트 삭제, 쿼리 빌더 통합 등의 기능으로 생산성과 보안성을 모두 확보할 수 있다.

또한, 팩토리를 활용한 더미 데이터 생성 기능을 통해 테스트 환경 구축도 간편하게 할 수 있다. 이러한 Eloquent ORM의 다양한 기능을 이해하고 활용하는 것은 Laravel 애플리케이션 개발의 기본기가 된다.


📌 다음 글 안내

모델과 Eloquent ORM을 통해 데이터베이스 작업을 이해했다면, 이제 데이터베이스 테이블을 직접 생성하고 초기 데이터를 삽입하는 방법을 배워야 한다. Laravel에서는 마이그레이션(Migration)과 시딩(Seeding)을 통해 데이터베이스 구조와 초기 데이터를 체계적으로 관리할 수 있다.

👉 다음 글: 마이그레이션과 시딩 바로 가기

👉 이전 글: Laravel View와 Blade 템플릿

728x90
반응형
이 포스팅은 제휴마케팅 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.