Django-rest-framework: OpenAPI ์Šคํ‚ค๋งˆ ์ƒ์„ฑ์„ ์œ„ํ•ด SerializerMethodField์—์„œ ํ•„๋“œ ์œ ํ˜•์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2020๋…„ 01์›” 13์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: encode/django-rest-framework

์ด ์“ธ๋ชจ์—†๋Š” ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

class MySerializer(serializers.Serializer):

    random_number = serializers.SerializerMethodField()

    def get_random_number(self):
        # Chosen by fair dice roll.
        # Guaranteed to be random.
        return 4

์ด ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ๋ฅผ ๋์ ์— ์ถ”๊ฐ€ํ•˜๊ณ  OpenAPI ์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

properties:
  random_number:
    type: string
  required:
  - random_number

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ์„œ type: number ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก DRF์— ์ง€์‹œํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์„ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • output_field ์†์„ฑ(์˜ˆ serializers.SerializerMethodField(output_field=serializers.IntegerField()) )์€ Django์˜ ์ฟผ๋ฆฌ ํ‘œํ˜„์‹ ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • openapi_type(serializers.SerializerMethodField(), serializers.IntegerField()) ์™€ ๊ฐ™์€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ
  • ๊ด€๋ฆฌ์ž ์ž‘์—…์— ๋Œ€ํ•œ ์„ค๋ช… ์„ค์ •๊ณผ ์œ ์‚ฌํ•œ ์†์„ฑ:

    random_number = serializers.SerializerMethodField()
    
    def get_random_number(self):
      return 4
    
    get_random_number.output_field = serializers.IntegerField()
    
  • ๋‹จ์ˆœํžˆ DRF๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๊ณ ๋กœ ์–ด๋”˜๊ฐ€์— ๋ฌธ์„œํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Enhancement Schema Generation

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

์ €์—๊ฒŒ ์žˆ์–ด ์„ ํ˜ธํ•˜๋Š” API๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ํ˜• ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

def get_foo(self, obj) -> int:
    return 1

ํ˜„์žฌ ์ง€์›๋˜๋Š” ๋ชจ๋“  Python ๋ฒ„์ „์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ์•„์ด๋””์–ด๋Š” https://github.com/encode/django-rest-framework/pull/7089 ์—์„œ ์‚ฌ์šฉ๋˜์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ PR๋กœ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ตฌํ˜„์„ ๋ณด๋ฉด ์ปฌ๋ ‰์…˜์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์‹œ์ ์—์„œ๋Š” ์ค‘์ฒฉ๋œ ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์ง€๋งŒ List[int] , List[str] , Dict[str, int] ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ง€์›๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@carlfarrington ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”? ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‹œ๋„ํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์‹œ๋„ํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ธฐ๋ณธ ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ค‘์ฒฉ ํ•„๋“œ๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ์„ ์–ป์„ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด๋ฅผ ์›ํ• ๊นŒ์š”(์ค‘์ฒฉ ์—ฌ๋ถ€)?

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

์•ˆ๋…•ํ•˜์„ธ์š” @Lucidiot์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฆ‰๊ฐ์ ์ธ ๋ฐฉ๋ฒ•์€ AutoSchema._map_field() ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์˜ˆ์ƒํ•˜๊ธฐ ์œ„ํ•ด ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ/๋ณด๊ธฐ๋ณ„๋กœ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ๋งํ•œ ๋Œ€๋กœ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ญ”๊ฐ€๋ฅผ ์ฐพ๊ฒŒ ๋  ๊ฒƒ์ด์ง€๋งŒ, ํ˜„์žฌ๋กœ์„œ๋Š” API ์ธก๋ฉด์—์„œ ์ตœ์„ ์˜ ์„ ํƒ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ €์—๊ฒŒ ์žˆ์–ด ์„ ํ˜ธํ•˜๋Š” API๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ํ˜• ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

def get_foo(self, obj) -> int:
    return 1

ํ˜„์žฌ ์ง€์›๋˜๋Š” ๋ชจ๋“  Python ๋ฒ„์ „์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ์•„์ด๋””์–ด๋Š” https://github.com/encode/django-rest-framework/pull/7089 ์—์„œ ์‚ฌ์šฉ๋˜์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ PR๋กœ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ตฌํ˜„์„ ๋ณด๋ฉด ์ปฌ๋ ‰์…˜์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์‹œ์ ์—์„œ๋Š” ์ค‘์ฒฉ๋œ ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์ง€๋งŒ List[int] , List[str] , Dict[str, int] ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ง€์›๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@carlfarrington ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”? ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‹œ๋„ํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์‹œ๋„ํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ธฐ๋ณธ ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ค‘์ฒฉ ํ•„๋“œ๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ์„ ์–ป์„ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด๋ฅผ ์›ํ• ๊นŒ์š”(์ค‘์ฒฉ ์—ฌ๋ถ€)?

3.12์—์„œ map_field() ๋ฅผ ํ™๋ณดํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๋กœ ๊ฐ€๋Š” ๊ธธ์ด ๋งž์Šต๋‹ˆ๋‹ค.

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