Symfony: ์žฌ๊ท€์  ๋น„์ •๊ทœํ™”๋Š” object_to_populate๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 02์›” 18์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: symfony/symfony

| ์งˆ๋ฌธ | ใ…
| ---------------- | ------
| ๋ฒ„๊ทธ ๋ณด๊ณ ? | ์•„๋‹ˆ์š”
| ๊ธฐ๋Šฅ ์š”์ฒญ? | ๋„ค
| BC ๋ธŒ๋ ˆ์ดํฌ ๋ฆฌํฌํŠธ? | ์•„๋‹ˆ์š”
| RFC? | ์•„๋‹ˆ์š”
| ์‹ฌํฌ๋‹ˆ ๋ฒ„์ „ | 3.3.0

๊ฐ์ฒด๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์—ญ์ง๋ ฌํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ์ •๋ง ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

class User
{

    /**
     * Set Name.
     *
     * <strong i="15">@param</strong> Name $name
     */
    public function setName(Name $name) : self
    {
        $this->name = $name;

        return $this;
    }
}

์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ๋Š” Name ์—์„œ ๋น„์ •๊ทœํ™”๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋Œ€์‹  setName() ์— ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— "'์ด๋ฆ„' ์œ ํ˜•์˜ ์˜ˆ์ƒ ์ธ์ˆ˜, '๋ฐฐ์—ด'์ด ์ œ๊ณต๋จ"์ด๋ผ๋Š” ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ Symfony\Component\Serializer\Exception\UnexpectedValueException ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. Name ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ๊ฒฐ๊ณผ๋ฅผ setName() ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด ๋ฉ”์„œ๋“œ๊ฐ€ Name ๋ฐ array๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค์Œ์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.
1) ๊ธฐ์กด ์ด๋ฆ„ ๊ฐœ์ฒด ์ฑ„์šฐ๊ธฐ
2) ์•ก์„ธ์Šค์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ทธ๋ฃน.

์ด ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฏธ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ(ํด๋ž˜์Šค)์˜ ํƒ€์ž…ํžŒํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„ ์Šค์นผ๋ผ ํƒ€์ž… ํžŒํŠธ๊ฐ€ setter์—์„œ ๋ฐœ๊ฒฌ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
1) ์œ ํ˜• ํžŒํŠธ ํด๋ž˜์Šค๋ฅผ ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์ •๊ทœํ™” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
2) ๋™์ผํ•œ ๊ทธ๋ฃน์„ ๋ถ€๋ชจ์—์„œ ์ž์‹์œผ๋กœ ์ „๋‹ฌ
3) ์†์„ฑ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋ฉด object_to_populate ์˜ ํ•ด๋‹น ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( object_to_populate ๊ฐ€ ์ƒ์œ„ ํ•ญ๋ชฉ์— ์„ค์ •๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •).

Feature Serializer

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ธ€์Ž„, ์ด๊ฒƒ์€ ์ฆ‰์‹œ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/symfony/symfony/blob/3.2/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml#L25

๊ทธ๋Ÿฌ๋ฉด ProperyInfo ๊ตฌ์„ฑ ์š”์†Œ ๋ฅผ ์„ค์น˜ํ•˜๊ณ  config.yml ์—์„œ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

framework:
    property_info:
        enabled: true

์ด๊ฒƒ์€ _๋Œ€๋ถ€๋ถ„_ ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์žฌ๊ท€๋ฅผ ์ง€์›ํ•˜๊ณ  ๊ทธ๋ฃน์„ ์ง€์›ํ•˜์ง€๋งŒ object_to_populate ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ Symfony๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์›ํ•˜๋Š” ์žฌ๊ท€ ์ž์ฒด๋ณด๋‹ค๋Š” ๊ทธ์— ๊ด€ํ•œ ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋น„๋ก ๋ฌธ์„œํ™”๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ).

๋ชจ๋“  3 ๋Œ“๊ธ€

๊ธ€์Ž„, ์ด๊ฒƒ์€ ์ฆ‰์‹œ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/symfony/symfony/blob/3.2/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml#L25

๊ทธ๋Ÿฌ๋ฉด ProperyInfo ๊ตฌ์„ฑ ์š”์†Œ ๋ฅผ ์„ค์น˜ํ•˜๊ณ  config.yml ์—์„œ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

framework:
    property_info:
        enabled: true

์ด๊ฒƒ์€ _๋Œ€๋ถ€๋ถ„_ ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์žฌ๊ท€๋ฅผ ์ง€์›ํ•˜๊ณ  ๊ทธ๋ฃน์„ ์ง€์›ํ•˜์ง€๋งŒ object_to_populate ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ Symfony๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์›ํ•˜๋Š” ์žฌ๊ท€ ์ž์ฒด๋ณด๋‹ค๋Š” ๊ทธ์— ๊ด€ํ•œ ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋น„๋ก ๋ฌธ์„œํ™”๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ).

ํฌํ•จ๋œ ๊ฐœ์ฒด๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•˜๊ธฐ ์œ„ํ•ด PropertyInfo๋ฅผ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฌธ์„œ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์ด๋ฏธ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/symfony/symfony-docs/issues/7387

์„ธ ๋ฒˆ์งธ ๋ฌธ์ œ(์ง€๊ธˆ์€ ์œ ์ผํ•œ ๋ฌธ์ œ)์— ๋Œ€ํ•ด object_to_populate๋Š” ์ƒˆ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฐœ์ฒด๋ฅผ ์—…๋ฐ์ดํŠธ/์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ถ€๋ชจ๊ฐ€ ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํฌํ•จ๋œ ๊ฐœ์ฒด๋„ ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๊ฐœ์ฒด๋ฅผ ์†์„ฑ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๊ธฐ์กด ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด์„œ ๊ฐœ์ฒด์ธ ๋ชจ๋“  ์†์„ฑ์ด "์ฑ„์šธ ๊ฐœ์ฒด"(์ด๋ฏธ ๊ธฐ์กด ๊ฐœ์ฒด)์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ๋ถ€๋ชจ ๊ฐ์ฒด์— ์ถ”๊ฐ€ํ•  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ "object_to_populate"๋ฅผ ๋ชจ๋“  ์†์„ฑ์œผ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ์œ ํšจํ•œ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค.
  2. ๋”ฐ๋ผ์„œ ์–ด๋–ค ์†์„ฑ์ด "์ฑ„์šธ ๊ฐœ์ฒด"์ธ์ง€ ์‹๋ณ„ํ•˜๊ณ  ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฐœ์ฒด์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋ฉฐ ์ด ๊ฐ’์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์œ ํ•˜๊ณ  ๋ณดํŽธ์ ์ธ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. , API ๋ฆฌ์†Œ์Šค์—์„œ, ์‹ฌ์ง€์–ด ๋ฉ”๋ชจ๋ฆฌ์˜ ์ผ๋ถ€ ํ•ด์‹œ๋งต์—์„œ๋„. ์˜ˆ๋ฅผ ๋“ค์–ด API ํ”Œ๋žซํผ ํ”„๋กœ์ ํŠธ์—์„œ ํฌํ•จ๋œ ๊ด€๊ณ„๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์—ญ์ฐธ์กฐ ๊ฐ€๋Šฅํ•œ IRI๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค( https://api-platform.com/docs/core/serialization-groups-and-relations#embedding -relations). ๊ทธ๋ฆฌ๊ณ  ์ด ๊ฒฝ์šฐ์—๋„ ํฌํ•จ๋œ ๊ฐœ์ฒด๋ฅผ ๋ณ€๊ฒฝ/์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด ๊ฐœ์ฒด๋ฅผ ๋‹ค๋ฅธ ๊ฐœ์ฒด์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@davidbarratt ์˜ ์˜๊ฒฌ์€ PropertyInfoComponent \DateTime ์†์„ฑ์œผ๋กœ ๊ฐœ์ฒด๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก Serializer์— ๋Œ€ํ•œ framework.property_info.enabled ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง๋ ฌํ™”์— ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ทธ๊ฒƒ์„ ์–ธ๊ธ‰ํ•˜๋Š” ๋ฌธ์„œ์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ์—†์œผ๋ฉด \DateTime ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ฒด๋ฅผ ์ง๋ ฌํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€๋งŒ ์งํ›„์— ์—ญ์ง๋ ฌํ™”ํ•˜๋Š” ๊ฒƒ์€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. \DateTime ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ฒด๋ฅผ ์ง๋ ฌํ™” _๋ฐ ์—ญ์ง๋ ฌํ™” _ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์˜ ์ขŒ์ ˆ๊ณผ ๊ด‘๋ž€์˜ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋ฌธ์„œ์—์„œ ์ด๋ฅผ ์–ธ๊ธ‰ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰