DTO DAO 정리 with 라라벨
2023. 4. 21. 13:12ㆍPHP
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();
}
}
}
'PHP' 카테고리의 다른 글
락 전략 with Laravel (0) | 2024.10.21 |
---|---|
[Laravel] beginTransaction, lockForUpdate 활용 (일관성, 동시성) with. ORM (0) | 2024.08.12 |
라라벨 서비스컨테이너와 서비스프로바이더 with DIP (0) | 2023.03.17 |
라라벨 가바지 컬렉션 처리 (0) | 2023.03.17 |
Eloquent ORM 이란 (0) | 2022.12.14 |