DTO DAO 정리 with 라라벨

2023. 4. 21. 13:12PHP

DTO와 DAO는 데이터베이스와 상호 작용하는데 사용되는 패턴입니다.

 

DTO(Data Transfer Object)

-  DTO는 데이터베이스와 통신하는 데 사용되는 객체

- 속성과 그 속서에 접근하기 위한 getter / setter 메소드를 이용

- 데이터 저장 및 타입변환 기능

class UserDTO {
   private $id;
   private $name;
   private $email;
   private $age;

   public function __construct($id, $name, $email, $age) {
      $this->id = $id;
      $this->name = $name;
      $this->email = $email;
      $this->age = $age;
   }

   public function getId() {
      return $this->id;
   }

   public function getName() {
      return $this->name;
   }

   public function getEmail() {
      return $this->email;
   }

   public function getAge() {
      return $this->age;
   }
}

 

DAO(Data Access Object)

- DAO는 데이터베이스와 상호 작용하며 CRUD의 기능을 사용

- DTO에서 가져온 데이터를 가지고 데이터베이스에 CRUD

- 실직적인 데이터의 조작 영역을 담당

class UserDAO {
   private $conn;

   public function __construct($conn) {
      $this->conn = $conn;
   }

   public function getUserById($id) {
      $stmt = $this->conn->prepare("SELECT * FROM users WHERE id = ?");
      $stmt->execute([$id]);
      $row = $stmt->fetch(PDO::FETCH_ASSOC);

      if ($row) {
         return new UserDTO($row['id'], $row['name'], $row['email'], $row['age']);
      }

      return null;
   }

   public function createUser(UserDTO $user) {
      $stmt = $this->conn->prepare("INSERT INTO users (name, email, age) VALUES (?, ?, ?)");
      $stmt->execute([$user->getName(), $user->getEmail(), $user->getAge()]);
      $user->setId($this->conn->lastInsertId());
   }

   public function updateUser(UserDTO $user) {
      $stmt = $this->conn->prepare("UPDATE users SET name = ?, email = ?, age = ? WHERE id = ?");
      $stmt->execute([$user->getName(), $user->getEmail(), $user->getAge(), $user->getId()]);
   }

   public function deleteUser(UserDTO $user) {
      $stmt = $this->conn->prepare("DELETE FROM users WHERE id = ?");
      $stmt->execute([$user->getId()]);
   }
}

 

라라벨에서는 어떻게 적용되어있는지?

보통 라라벨은 ORM를 이용하게 되는데 ORM은 Model Class가 데이터를 저장하고 검색하는데 사용되어 DTO의 역할을 수행합니다.

또한 DAO는 라라벨에서 Repository class에서 따로 기능을 담당할 수 있습니다.

아래 예시 코드에서는 User Model이 DAO이면서 User Repository가 DTO의 역할을 수행하고 있습니다.

User Model은 DAO처럼 객체를 저장하는 클래스를 생성하지 않으며 ORM자체 적으로 데이터를 객체로 변환하고, 객체에서 데이터를 검색하고 저장할 수 있도록 합니다.

 

1. User Model

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model {
   protected $table = 'users';
   protected $fillable = ['name', 'email', 'age'];
}

 

2. User Repository

namespace App\Repositories;

use App\Models\User;

class UserRepository {
   public function getUserById($id) {
      $user = User::find($id);

      if ($user) {
         return $user;
      }

      return null;
   }

   public function createUser($userData) {
      return User::create($userData);
   }

   public function updateUser($id, $userData) {
      $user = User::find($id);

      if ($user) {
         $user->fill($userData);
         $user->save();
      }

      return $user;
   }

   public function deleteUser($id) {
      $user = User::find($id);

      if ($user) {
         $user->delete();
      }
   }
}