Eloquent์— ์œ ์šฉํ•œ ์ €์žฅ์†Œ๊ฐ€ ์žˆ๋‚˜์š”?

์ง€๋‚œ์ฃผ์— ๊ธ€์„ ์ผ์–ด์š” Eloquent ์—”ํ„ฐํ‹ฐ์— ๋Œ€ํ•œ ์ €์žฅ์†Œ ํ…œํ”Œ๋ฆฟ์˜ ์“ธ๋ชจ ์—†์Œ์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Š” ๊ทธ๊ฒƒ์„ ๋ถ€๋ถ„์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‚˜์—๊ฒŒ ์•Œ๋ ค์ฃผ๊ฒ ๋‹ค๊ณ  ์•ฝ์†ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ์—์„œ ์ด ํ…œํ”Œ๋ฆฟ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๋ถ„์„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €์žฅ์†Œ์— ํ•„์š”ํ•œ ์ตœ์†Œ ๋ฉ”์†Œ๋“œ ์„ธํŠธ:

<?php
interface PostRepository
{
    public function getById($id): Post;
    public function save(Post $post);
    public function delete($id);
}

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ ๋ ˆ์ฝ”๋“œ ๊ฒ€์ƒ‰ ๋ฐฉ๋ฒ•์ด ์ €์žฅ์†Œ์— ์ถ”๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

<?php
interface PostRepository
{
    public function getById($id): Post;
    public function save(Post $post);
    public function delete($id);

    public function getLastPosts();
    public function getTopPosts();
    public function getUserPosts($userId);
}

์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋Š” Eloquent ๋ฒ”์œ„๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์—”ํ„ฐํ‹ฐ ํด๋ž˜์Šค์— ์ž์‹ ์„ ๊ฐ€์ ธ์˜ค๋Š” ์ฑ…์ž„์„ ์˜ค๋ฒ„๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ์ตœ์„ ์˜ ์•„์ด๋””์–ด๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ด ์ฑ…์ž„์„ ์ €์žฅ์†Œ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๊นŒ? ์ €๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ์“ฐ๊ธฐ ์ž‘์—…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ‘œ์ค€ ์“ฐ๊ธฐ ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ƒˆ๋กœ์šด ์‚ฌ๋ฌผ์˜ ๊ฑด์„ค๊ณผ ๋„์ „ PostRepository::์ €์žฅ
  • PostRepository::getById, ๊ฐœ์ฒด ์กฐ์ž‘ ๋ฐ ์†Œํ™˜ PostRepository::์ €์žฅ
  • ๋„์ „ PostRepository::์‚ญ์ œ

์“ฐ๊ธฐ ์ž‘์—…์—์„œ๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ž‘์—…์—์„œ๋Š” get* ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์— ๋Œ€ํ•ด ์ฝ์œผ๋ฉด ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›๋ฆฌ (ํŽธ์ง€ I ะฒ ๊ณ ์ฒด), ๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋„ˆ๋ฌด ํฌ๊ณ  ์ ์–ด๋„ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆŒ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ• getById ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘์— ํ•„์š”ํ•˜์ง€๋งŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋”์šฑ ๋ณต์žกํ•ด์ง€๋ฉด ๊ตฌํ˜„ ๋ฐฉ์‹๋„ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์กฐ๊ธˆ ๋‚˜์ค‘์— ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ „ ๊ธ€์—์„œ ์“ฐ๊ธฐ ๋ถ€๋ถ„์˜ ์“ธ๋ชจ์—†์Œ์— ๋Œ€ํ•ด ์ผ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๊ทธ๋ƒฅ ์žŠ์–ด๋ฒ„๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฝ๊ธฐ ๋ถ€๋ถ„์€ ๊ทธ๋‹ค์ง€ ์“ธ๋ชจ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Eloquent์˜ ๊ฒฝ์šฐ์—๋„ ์—ฌ๊ธฐ์— ์—ฌ๋Ÿฌ ๊ตฌํ˜„์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ˆ˜์—… ์ด๋ฆ„์„ ๋ฌด์—‡์œผ๋กœ ํ• ๊นŒ์š”? ํ•  ์ˆ˜ ์žˆ๋‹ค ์ฝ๊ธฐํฌ์ŠคํŠธ์ €์žฅ์†Œ, ๊ทธ๋Ÿฌ๋‚˜ ํ…œํ”Œ๋ฆฟ์— ์ €์žฅ์†Œ ๊ทธ๋Š” ์ด๋ฏธ ๊ด€๋ จ์„ฑ์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๊ฒŒ์‹œ๋ฌผ ์ฟผ๋ฆฌ:

<?php
interface PostQueries
{
    public function getById($id): Post;
    public function getLastPosts();
    public function getTopPosts();
    public function getUserPosts($userId);
}

Eloquent๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค:

<?php
final class EloquentPostQueries implements PostQueries
{
    public function getById($id): Post
    {
        return Post::findOrFail($id);
    }

    /**
    * @return Post[] | Collection
    */
    public function getLastPosts()
    {
        return Post::orderBy('created_at', 'desc')
            ->limit(/*some limit*/)
            ->get();
    }
    /**
    * @return Post[] | Collection
    */
    public function getTopPosts()
    {
        return Post::orderBy('rating', 'desc')
            ->limit(/*some limit*/)
            ->get();
    }

    /**
    * @param int $userId
    * @return Post[] | Collection
    */
    public function getUserPosts($userId)
    {
        return Post::whereUserId($userId)
            ->orderBy('created_at', 'desc')
            ->get();
    }
}

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„๊ณผ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•ฑ ์„œ๋น„์Šค ์ œ๊ณต์ž:

<?php
final class AppServiceProvider extends ServiceProvider 
{
    public function register()
    {
        $this->app->bind(PostQueries::class, 
            EloquentPostQueries::class);
    }
}

์ด ์ˆ˜์—…์€ ์ด๋ฏธ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ์—”ํ„ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๊ตฌ์ œํ•จ์œผ๋กœ์จ ์ž์‹ ์˜ ์ฑ…์ž„์„ ๊นจ๋‹ซ์Šต๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<?php
final class PostsController extends Controller
{
    public function lastPosts(PostQueries $postQueries)
    {
        return view('posts.last', [
            'posts' => $postQueries->getLastPosts(),
        ]);
    }
} 

๋ฐฉ๋ฒ• PostsController::lastPosts ๊ตฌํ˜„์„ ์š”์ฒญํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๋ฌผ ์ฟผ๋ฆฌ ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์œผ๋กœ ์ผํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์—ฐ๊ฒฐํ•œ ๊ณต๊ธ‰์ž์—์„œ ๊ฒŒ์‹œ๋ฌผ ์ฟผ๋ฆฌ ์ˆ˜์—…๊ณผ ํ•จ๊ป˜ EloquentPost์ฟผ๋ฆฌ ์ด ํด๋ž˜์Šค๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋งค์šฐ ์ธ๊ธฐ๋ฅผ ์–ป์—ˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค. ๋ถ„๋‹น ์ˆ˜์ฒœ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ตœ์‹  ์ถœํŒ๋ฌผ์ด ํฌํ•จ๋œ ํŽ˜์ด์ง€๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์ถœํŒ๋ฌผ๋„ ๋งค์šฐ ์ž์ฃผ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ด๋Ÿฌํ•œ ๋กœ๋“œ๋ฅผ ์ž˜ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ํ‘œ์ค€ ์†”๋ฃจ์…˜์ธ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์™ธ์—๋„ ํŠน์ • ๋ฐ์ดํ„ฐ ์Šค๋ƒ…์ƒท์€ ํŠน์ • ์ž‘์—…์— ์ตœ์ ํ™”๋œ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. memcached ๋˜๋Š” ํ™์ฑ„.

์บ์‹ฑ ๋กœ์ง์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋‹ค์ง€ ๋ณต์žกํ•˜์ง€ ์•Š์ง€๋งŒ EloquentPostQueries์—์„œ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ  ๋•Œ๋ฌธ์—). ๋‹จ์ผ ์ฑ…์ž„ ์›์น™). ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ธฐ๋ณธ ์ž‘์—…์˜ ์žฅ์‹์œผ๋กœ ์บ์‹ฑ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

<?php
use IlluminateContractsCacheRepository;

final class CachedPostQueries implements PostQueries
{
    const LASTS_DURATION = 10;

    /** @var PostQueries */
    private $base;

    /** @var Repository */
    private $cache;

    public function __construct(
        PostQueries $base, Repository $cache) 
    {
        $this->base = $base;
        $this->cache = $cache;
    }

    /**
    * @return Post[] | Collection
    */
    public function getLastPosts()
    {
        return $this->cache->remember('last_posts', 
            self::LASTS_DURATION, 
            function(){
                return $this->base->getLastPosts();
            });
    }

    // ะดั€ัƒะณะธะต ะผะตั‚ะพะดั‹ ะฟั€ะฐะบั‚ะธั‡ะตัะบะธ ั‚ะฐะบะธะต ะถะต
}

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฌด์‹œํ•˜์„ธ์š” ์ €์žฅ์†Œ ์ƒ์„ฑ์ž์—์„œ. ์•Œ ์ˆ˜ ์—†๋Š” ์ด์œ ๋กœ ๊ทธ๋“ค์€ Laravel์—์„œ ์บ์‹ฑ์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์„ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ง€์ •ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ์บ์‹œ๋œ ๊ฒŒ์‹œ๋ฌผ ์ฟผ๋ฆฌ ์บ์‹ฑ๋งŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. $this->์บ์‹œ->๊ธฐ์–ตํ•˜๊ธฐ ์ด ํ•ญ๋ชฉ์ด ์บ์‹œ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•˜๊ณ  ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ์บ์‹œ์— ์”๋‹ˆ๋‹ค. ๋‚จ์€ ๊ฒƒ์€ ์ด ํด๋ž˜์Šค๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์„ ์š”์ฒญํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์žˆ๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๋ฌผ ์ฟผ๋ฆฌ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ›๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค ์บ์‹œ๋œ ๊ฒŒ์‹œ๋ฌผ ์ฟผ๋ฆฌ. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์ž์‹ ์€ ์บ์‹œ๋œ ๊ฒŒ์‹œ๋ฌผ ์ฟผ๋ฆฌ ์ƒ์„ฑ์ž๋Š” ํด๋ž˜์Šค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. EloquentPost์ฟผ๋ฆฌ"์‹ค์ œ" ๊ตฌํ˜„ ์—†์ด๋Š” ์ž‘๋™ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ณ€ํ™”ํ•œ๋‹ค ์•ฑ ์„œ๋น„์Šค ์ œ๊ณต์ž:

<?php
final class AppServiceProvider extends ServiceProvider 
{
    public function register()
    {
        $this->app->bind(PostQueries::class, 
            CachedPostQueries::class);

        $this->app->when(CachedPostQueries::class)
            ->needs(PostQueries::class)
            ->give(EloquentPostQueries::class);
    }
}

๋‚ด ๋ชจ๋“  ์†Œ์›์€ ๊ณต๊ธ‰์ž์—๊ฒŒ ์•„์ฃผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์š”์ฒญ์— ๋Œ€ํ•œ ์บ์‹ฑ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์บ์‹ฑ์„ ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‚ญ์ œ๋œ ๊ธ€์ด ์‚ฌ์ดํŠธ์— ํ•œ๋™์•ˆ ๋จธ๋ฌผ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์‚ญ์ œ๋˜๋„๋ก ๋ฌดํšจํ™”๋„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ๋“ค์€ ์‚ฌ์†Œํ•œ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.

๊ฒฐ๋ก : ์šฐ๋ฆฌ๋Š” ํ•˜๋‚˜๊ฐ€ ์•„๋‹Œ ๋‘ ๊ฐœ์˜ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฌ๋ณธ CQRS(๋ช…๋ น ์ฟผ๋ฆฌ ์ฑ…์ž„ ๋ถ„๋ฆฌ) ์ธํ„ฐํŽ˜์ด์Šค ์ˆ˜์ค€์—์„œ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ž‘์—…์„ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋ฅผ ํ†ตํ•ด ๊ทธ์—๊ฒŒ ์™”์Šต๋‹ˆ๋‹ค ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›๋ฆฌ, ์ด๋Š” ํŒจํ„ด๊ณผ ์›๋ฆฌ๋ฅผ ๋Šฅ์ˆ™ํ•˜๊ฒŒ ์กฐ์ž‘ํ•˜๊ณ  ํ•˜๋‚˜๋ฅผ ์ •๋ฆฌ๋กœ ๋„์ถœํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค :) ๋ฌผ๋ก  ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ์—”ํ„ฐํ‹ฐ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ์ถ”์ƒํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ทธ ์š”๋ น์„ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ, ๊ฐ„๋‹จํžˆ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๊ฒŒ์‹œ๋ฌผ ์ฟผ๋ฆฌ Eloquent๋ฅผ ํ†ตํ•œ ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„:

<?php
final class PostQueries
{
    public function getById($id): Post
    {
        return Post::findOrFail($id);
    }

    // ะดั€ัƒะณะธะต ะผะตั‚ะพะดั‹
}

์บ์‹ฑ์ด ํ•„์š”ํ•  ๋•Œ ๊ฐ„๋‹จํ•œ ์ด๋™์œผ๋กœ ์ด ํด๋ž˜์Šค ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค(๋˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค)๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๋ฌผ ์ฟผ๋ฆฌ, ํ•ด๋‹น ๊ตฌํ˜„์„ ํด๋ž˜์Šค์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. EloquentPost์ฟผ๋ฆฌ ์•ž์„œ ์„ค๋ช…ํ•œ ๊ตฌ์„ฑํ‘œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ์˜์กด์„ฑ ์ฃผ์ž… ะธ CQRS ์— ์ž์„ธํžˆ ์„ค๋ช… ๋‚ด ์ฑ… "๋ณต์žกํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•„ํ‚คํ…์ฒ˜". ์ด ๊ธฐ์‚ฌ์˜ ์˜ˆ์ œ์— ์žˆ๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๊ฐ€ ์ตœ์ข… ํด๋ž˜์Šค๋กœ ํ‘œ์‹œ๋˜๋Š” ์ด์œ ์— ๋Œ€ํ•œ ์ˆ˜์ˆ˜๊ป˜๋ผ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€