์†Œ์‹

> ๐Ÿš€ **Iris v14๊ฐ€ ๊ณง ๋‚˜์˜ต๋‹ˆ๋‹ค.** ๋‹ค์Œ ๋ฉ”์ด์ € ๋ฒ„์ „์€ ์ด ํ”„๋กœ์ ํŠธ ์—ญ์‚ฌ์ƒ ๊ฐ€์žฅ ํฐ ๋ฆด๋ฆฌ์Šค์ž…๋‹ˆ๋‹ค. Go ์ œ๋„ค๋ฆญ ์œ„์—์„œ ๋‹ค์‹œ ๋งŒ๋“  ํ”„๋ ˆ์ž„์›Œํฌ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฒ€์‚ฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋”, ๊ฒ€์ฆ๊นŒ์ง€ ๋Œ€์‹  ํ•ด์ฃผ๋Š” ์š”์ฒญ ํ—ฌํผ, ํ•˜๋‚˜์˜ ์ค‘์•™ ์—๋Ÿฌ ๋งต, ์„œ๋ฅธ ๊ฐœ์˜ ๊ธฐ๋ณธ ์ œ๊ณต ๋ฏธ๋“ค์›จ์–ด, ๊ทธ๋ฆฌ๊ณ  ์ €์žฅ์†Œ ์•ˆ์— ํ•จ๊ป˜ ๋‹ด๊ธด ์ฑ…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ [Iris v14์—์„œ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ](#-iris-v14์—์„œ-๋‹ฌ๋ผ์ง€๋Š”-๊ฒƒ)์„ ๋ณด์„ธ์š”. > > ์—ฌ๊ธฐ์„œ ์„ค๋ช…ํ•˜๋Š” **v12**๋Š” ๊ณ„์† ๋™์ž‘ํ•˜๊ณ  ๊ณ„์† ์ˆ˜์ •์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. v14๋Š” ์ƒˆ๋กœ์šด import ๊ฒฝ๋กœ๋กœ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์—, ์ถœ์‹œ๋˜๋Š” ๋‚  ์—ฌ๋Ÿฌ๋ถ„ ์ชฝ์—์„œ ๊นจ์ง€๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. # Iris Web Framework English ุงู„ุนุฑุจูŠุฉ [![build status](https://img.shields.io/github/actions/workflow/status/kataras/iris/ci.yml?branch=main&style=for-the-badge)](https://github.com/kataras/iris/actions/workflows/ci.yml) [![view examples](https://img.shields.io/badge/examples%20-285-a83adf.svg?style=for-the-badge&logo=go)](https://github.com/kataras/iris/tree/main/_examples) [![chat](https://img.shields.io/gitter/room/iris_go/community.svg?color=cc2b5e&logo=gitter&style=for-the-badge)](https://gitter.im/iris_go/community) [![donate](https://img.shields.io/badge/support-Iris-blue.svg?style=for-the-badge&logo=paypal)](https://iris-go.com/donate) โšก Iris๋Š” ๋‹จ์ˆœํ•˜๊ณ  ๋น ๋ฅด๋ฉฐ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๋งค์šฐ ํšจ์œจ์ ์ธ Go ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. โœจ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋‹ค์Œ ์›น์‚ฌ์ดํŠธ๋‚˜ API๋ฅผ ์œ„ํ•ด ์•„๋ฆ„๋‹ต๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๐ŸŒŸ [์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์˜ ์˜๊ฒฌ](https://www.iris-go.com/#review)์„ ๋‘˜๋Ÿฌ๋ณด๊ณ , ์ด ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์— **[์Šคํƒ€](https://github.com/kataras/iris/stargazers)**๋ฅผ ๋‚จ๊ฒจ์ฃผ์„ธ์š” [![](https://iris-go.com/static/images/reviews.gif)](https://iris-go.com/testimonials/) [![Benchmarks: Jul 18, 2020 at 10:46am (UTC)](https://iris-go.com/static/images/benchmarks.svg)](https://github.com/kataras/server-benchmarks) ```go package main import "github.com/kataras/iris/v12" func main() { app := iris.New() app.Use(iris.Compression) app.Get("/", func(ctx iris.Context) { ctx.HTML("Hello %s!", "World") }) app.Listen(":8080") } ``` ์–ด๋А [Go ๊ฐœ๋ฐœ์ž](https://twitter.com/dkuye/status/1532087942696554497)๊ฐ€ ๋งํ–ˆ๋“ฏ์ด, **Iris๋Š” ๋ชจ๋“  ๋ฉด์—์„œ ๋‹น์‹ ์„ ๋ฐ›์ณ์ฃผ๊ณ  ์˜ค๋žœ ์„ธ์›” ๊ตณ๊ฑดํžˆ ์„œ ์žˆ์Šต๋‹ˆ๋‹ค** โญ Iris๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค: * HTTP/2 (Push, ์ž„๋ฒ ๋””๋“œ ๋ฐ์ดํ„ฐ๊นŒ์ง€) * ๋ฏธ๋“ค์›จ์–ด (Accesslog, Basicauth, CORS, gRPC, Anti-Bot hCaptcha, JWT, MethodOverride, ModRevision, Monitor, PPROF, Ratelimit, Anti-Bot reCaptcha, Recovery, RequestID, Rewrite) * API ๋ฒ„์ €๋‹ * Model-View-Controller * Websockets * gRPC * Auto-HTTPS * ngrok ๊ธฐ๋ณธ ์ง€์›, ์•ฑ์„ ์ธํ„ฐ๋„ท์— ์˜ฌ๋ฆฌ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ• * :uuid, :string, :int ๊ฐ™์€ ํ‘œ์ค€ ํƒ€์ž…์˜ ๋™์  ๊ฒฝ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์›ํ•˜๊ณ  ์ง์ ‘ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋Š” ๊ณ ์œ ํ•œ ๋ผ์šฐํ„ฐ * ์••์ถ• * ๋ทฐ ์—”์ง„ (HTML, Django, Handlebars, Pug/Jade ๋“ฑ) * ์ง์ ‘ ํŒŒ์ผ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ณ  WebDAV ์„œ๋ฒ„๋ฅผ ํ˜ธ์ŠคํŒ… * ์บ์‹œ * ์ง€์—ญํ™” (i18n, sitemap) * ์„ธ์…˜ * ํ’๋ถ€ํ•œ ์‘๋‹ต (HTML, Text, Markdown, XML, YAML, Binary, JSON, JSONP, Protocol Buffers, MessagePack, Content Negotiation, Streaming, Server-Sent Events ๋“ฑ) * ์‘๋‹ต ์••์ถ• (gzip, deflate, brotli, snappy, s2) * ํ’๋ถ€ํ•œ ์š”์ฒญ (Bind URL Query, Headers, Form, Text, XML, YAML, Binary, JSON, Validation, Protocol Buffers, MessagePack ๋“ฑ) * ์˜์กด์„ฑ ์ฃผ์ž… (MVC, Handlers, API Routers) * ํ…Œ์ŠคํŒ… ์Šค์œ„ํŠธ * ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ... ์ฒซ๋‚ ๋ถ€ํ„ฐ ์ง€๊ธˆ๊นŒ์ง€ ๋น ๋ฅธ ๋‹ต๋ณ€๊ณผ ์ง€์›์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ## ๐Ÿš€ Iris v14์—์„œ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ Iris v14๋Š” ์ด ํ”„๋กœ์ ํŠธ ์—ญ์‚ฌ์ƒ ๊ฐ€์žฅ ํฐ ๋ฆด๋ฆฌ์Šค์ž…๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ Go ์ œ๋„ค๋ฆญ ์œ„์— ๋‹ค์‹œ ์„ธ์šฐ๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์กฐ๋ฆฝํ•˜๋Š” ๋ฐฉ์‹์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. `main`์—์„œ์˜ ๋ฐฐ์„ ์ด ์ค„๊ณ , ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์งง์•„์ง€๋ฉฐ, ์˜ˆ์ „์—๋Š” ๋ผ์šฐํŠธ๋งˆ๋‹ค ํฉ์–ด์ ธ ์žˆ๋˜ ๊ฒฐ์ •๋“ค์ด ํ•œ๊ณณ์œผ๋กœ ๋ชจ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‹น์žฅ ์‹ ๊ฒฝ ์“ธ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. v12๋Š” ๊ณ„์† ๋™์ž‘ํ•˜๊ณ  ๊ณ„์† ์ˆ˜์ •์„ ๋ฐ›์œผ๋ฉฐ, v14๋Š” ์ด๋ฆ„์ด ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋œ ๋ชจ๋“  API๋ฅผ ๋‹ค๋ฃจ๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ์™€ ํ•จ๊ป˜ ๋‚˜์˜ต๋‹ˆ๋‹ค. ### ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฒ€์‚ฌํ•˜๋Š” ํ•˜๋‚˜์˜ ์ฒด์ธ์— ๋‹ด๊ธด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด `iris.NewBuilder`๋Š” CORS, ์••์ถ•, ์•ก์„ธ์Šค ๋กœ๊น…, ํ—ฌ์Šค ์—”๋“œํฌ์ธํŠธ, ์—๋Ÿฌ ๋งต, ์„œ๋น„์Šค, API ๊ทธ๋ฃน์„ ํ•˜๋‚˜์˜ ํ‘œํ˜„์‹์œผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋‹จ๊ณ„ ์ˆœ์„œ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ•์ œํ•˜๋ฏ€๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋นŒ๋“œ๋˜๊ฑฐ๋‚˜ ์•„์˜ˆ ๋นŒ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ```go iris.NewBuilder(). Prefix("/api"). AllowOrigin("*"). Compression(true). LogRequests(true). Health(true, "production", "kataras"). Errors(errors.NewOptions(). MapErrors(errors.NotFound, catalog.ErrNotFound)). Services(catalog.NewRepository, catalog.NewService). API("/products", api.NewProductsAPI). Build(). Listen(":8080") ``` ### ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ๋””์ฝ”๋”ฉ, ๊ฒ€์ฆ, ์—๋Ÿฌ ๋ Œ๋”๋ง์ด ํ•ธ๋“ค๋Ÿฌ ๋ณธ๋ฌธ์—์„œ ๋น ์ ธ๋‚˜์˜ต๋‹ˆ๋‹ค. `rest.ReadJSON[T]`๋Š” ์š”์ฒญ์„ ๋””์ฝ”๋”ฉํ•˜๊ณ , ํƒ€์ž…์— `Validate() error`๊ฐ€ ์žˆ์œผ๋ฉด ์‹คํ–‰ํ•˜๋ฉฐ, 400 ์‘๋‹ต๊นŒ์ง€ ์ง์ ‘ ์”๋‹ˆ๋‹ค. ์‘๋‹ต ํ—ฌํผ๋Š” ์„ฑ๊ณต ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์“ฐ๊ฑฐ๋‚˜, ์ค‘์•™ ๋งต์ด ๊ทธ ์—๋Ÿฌ์— ๋Œ€ํ•ด ์ •ํ•œ ์‘๋‹ต์„ ์”๋‹ˆ๋‹ค. ```go func (api *ProductsAPI) create(ctx iris.Context) { input, ok := rest.ReadJSON[catalog.ProductInput](ctx) if !ok { return // 400์€ ์ด๋ฏธ ๊ธฐ๋ก๋จ: ์ž˜๋ชป๋œ JSON์ด๊ฑฐ๋‚˜ Validate ์‹คํŒจ. } id, err := api.svc.Create(ctx, input) rest.Created(ctx, id, err) // 201, ๋˜๋Š” ์ค‘์•™์—์„œ ๋งคํ•‘๋œ ์—๋Ÿฌ. } ``` `rest.OK`, `rest.NoContent`, `rest.Count`, `rest.Paginated`๊ฐ€ API๊ฐ€ ๋Œ๋ ค์ฃผ๋Š” ๋‚˜๋จธ์ง€ ํ˜•ํƒœ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ### ์—๋Ÿฌ๋Š” ํ•œ ๋ฒˆ๋งŒ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค ์ƒˆ `rest/errors` ํŒจํ‚ค์ง€๊ฐ€ ๋„๋ฉ”์ธ ์—๋Ÿฌ์™€ HTTP ์‘๋‹ต์˜ ๋Œ€์‘ ๊ด€๊ณ„๋ฅผ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๊ธฐ๊ณ„๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๋ฉ”์‹œ์ง€๋Š” ๋‚ด๋ถ€์— ๋‚จ์Šต๋‹ˆ๋‹ค. ์ฝœ๋ ‰ํ„ฐ๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ๋ชจ๋“  ์‹คํŒจ๊ฐ€ ํ•œ๊ณณ์—์„œ ๋กœ๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฌด์—‡์„ ์š”์ฒญํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ์—๋Ÿฌ๋ฅผ JSON์œผ๋กœ๋„, ๋ทฐ๋กœ๋„ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### MVC๋ฟ ์•„๋‹ˆ๋ผ ์–ด๋””์„œ๋‚˜ ์“ฐ๋Š” ์˜์กด์„ฑ ์ฃผ์ž… ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์„ ์„ ์–ธํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ, API ๊ทธ๋ฃน, ์ปจํŠธ๋กค๋Ÿฌ ๋ชจ๋‘ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. `Init(ctx context.Context) error`๋ฅผ ๊ตฌํ˜„ํ•œ ์„œ๋น„์Šค๋Š” `Build()` ์•ˆ์—์„œ ํ•œ ๋ฒˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‹ซ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์ข…๋ฃŒ ์‹œ ๋‹ซํž™๋‹ˆ๋‹ค. `hero` ํŒจํ‚ค์ง€๋Š” ์‚ฌ๋ผ์ง€๊ณ , ๋” ์ ์€ ์ฝ”๋“œ๋กœ ๋” ๋งŽ์€ ์ผ์„ ํ•˜๋Š” `dep`์™€ `rest`๊ฐ€ ๊ทธ ์ž๋ฆฌ๋ฅผ ๋Œ€์‹ ํ•ฉ๋‹ˆ๋‹ค. MVC ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ œ๋„ค๋ฆญ ์œ„์— ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ### ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์–ด์•ผ ํ•  ์ž๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค `sessions`, `cache`, `websocket`, `i18n`, `view`, `versioning`์ด ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. `mvc`๋Š” `controller` ์•„๋ž˜๋กœ ์˜ฎ๊ฒจ์ ธ ์ƒˆ ์ปจํŠธ๋กค๋Ÿฌ์ธ `fileserver`, `sitemap`, `apigraph` ์˜†์— ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค. `apigraph`๋Š” ๋ผ์šฐํŠธ ํŠธ๋ฆฌ๋ฅผ ๋Œ€ํ™”ํ˜• D3 ๊ทธ๋ž˜ํ”„๋กœ ๊ทธ๋ ค์ค๋‹ˆ๋‹ค. ์„œ๋ฅธ ๊ฐœ์˜ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ๋“ค์–ด ์žˆ๊ณ , ๊ทธ์ค‘ ์ƒˆ๋กœ์šด ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค: `httpcost`(์š”์ฒญ๋‹น ์‹œ๊ฐ„, ๋ฉ”๋ชจ๋ฆฌ, CPU๋ฅผ ์ธก์ •ํ•ด ์„ฑ๋Šฅ ๋ถ„์„์ด๋‚˜ ๊ณผ๊ธˆ์— ์‚ฌ์šฉ), `bodylimit`, `compress`, `counter`, `referrer`, `geolocation`, `ipaccess`, `servertiming`. ๋ทฐ ์—”์ง„ ๊ตฌํ˜„์€ [iris-contrib/views](https://github.com/iris-contrib/views)๋กœ ์˜ฎ๊ฒจ์กŒ์Šต๋‹ˆ๋‹ค. ### ์„ค์ •์€ ๋ถ€๋ถ„ ๋ฆฌํ„ฐ๋Ÿด์ž…๋‹ˆ๋‹ค `iris.Configuration`๊ณผ `With*` ์„ค์ •์ž๋“ค์ด `iris.Options`๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ๊ด€์‹ฌ ์žˆ๋Š” ํ•„๋“œ๋งŒ ์ง€์ •ํ•˜๋ฉด ๋‚˜๋จธ์ง€๋Š” ๊ธฐ๋ณธ๊ฐ’์—์„œ ์˜ต๋‹ˆ๋‹ค. `Bind`๋Š” `SERVER_CONFIG` ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ ๋จผ์ €, ๊ทธ๋‹ค์Œ ํŒŒ์ผ์—์„œ YAML์„ ์ฝ์Šต๋‹ˆ๋‹ค. ```go app := iris.New(iris.Options{Name: "myapp", LogLevel: "debug"}) ``` ### ํ•˜๋Š” ์ผ์„ ๊ทธ๋Œ€๋กœ ๋งํ•˜๋Š” ์ด๋ฆ„ ์š”์ฒญ ํ—ค๋”๋ฅผ ์ฝ๋Š” ๊ฒƒ๊ณผ ์‘๋‹ต ํ—ค๋”๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๋”๋Š” ์˜๋ฏธ๊ฐ€ ์กฐ์šฉํžˆ ๋’ค์ง‘ํžˆ๋Š” ๊ฐ™์€ ์ ‘๋‘์‚ฌ๋ฅผ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. `ctx.Header`๋Š” ์š”์ฒญ์„ ์ฝ๊ณ , `ctx.SetHeader`์™€ `ctx.ResponseHeader`๋Š” ์‘๋‹ต์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. `Party`๋Š” `Router`๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. `ctx.URLParam`์€ `ctx.Query().Get`์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ด๋ฆ„ ๋ณ€๊ฒฝ์€ ๋Œ€์ฒด ํ•ญ๋ชฉ๊ณผ ํ•จ๊ป˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ์— ์ •๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์€ ์ฐพ์•„ ๋ฐ”๊พธ๊ธฐ ํ•œ ๋ฒˆ์ด๋ฉด ๋๋‚ฉ๋‹ˆ๋‹ค. ### ๊ธฐ๋ณธ์ด ์•ˆ์ „ํ•œ ์„ค์ • ์„ธ์…˜ ์ฟ ํ‚ค๋Š” `Secure`์™€ `SameSite=Lax`๋กœ ๋‚˜๊ฐ‘๋‹ˆ๋‹ค. ์š”์ฒญ ๋ณธ๋ฌธ ํฌ๊ธฐ ์ œํ•œ์ด ๋ชจ๋“  ์ฝ๊ธฐ ๊ฒฝ๋กœ์—์„œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ž˜๋œ ๋ฒ„๊ทธ๋“ค๋„ ํ•จ๊ป˜ ์žกํ˜”์Šต๋‹ˆ๋‹ค. ์ œํ•œ์„ ๊ธฐ๋ก๋งŒ ํ•˜๊ณ  ํ•œ ๋ฒˆ๋„ ์ ์šฉํ•˜์ง€ ์•Š๋˜ rate limiter์™€, ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ต์งธ๋กœ ์ฃฝ์ผ ์ˆ˜ ์žˆ๋˜ `Logout` ํ˜ธ์ถœ์ด ๊ทธ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ### ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„œ v14์—๋Š” ์ €์žฅ์†Œ ์•ˆ์— ๋‹ด๊ธด 23์žฅ์งœ๋ฆฌ ์ฑ…, ํ…Œ์ŠคํŠธ๊นŒ์ง€ ๊ฐ–์ถ˜ REST API๋ฅผ ๋ฌธ์„œ ํ•˜๋‚˜๋กœ ๋งŒ๋“ค์–ด๋ณด๋Š” ์‹œ์ž‘ ํŠœํ† ๋ฆฌ์–ผ, v12 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ, ๊ทธ๋ฆฌ๊ณ  ์†Œ์Šค์—์„œ ์ƒ์„ฑ๋˜์–ด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ๋ผ์ด๋ธŒ AI ์œ„ํ‚ค๊ฐ€ ํ•จ๊ป˜ํ•ฉ๋‹ˆ๋‹ค. ### ์—ฌ๋Ÿฌ๋ถ„์˜ v12 ์ฝ”๋“œ์—๋Š” ์–ด๋–ค ์˜๋ฏธ์ธ๊ฐ€ import ๊ฒฝ๋กœ๊ฐ€ `github.com/kataras/iris/v14`๊ฐ€ ๋˜๋ฏ€๋กœ v12์™€ v14๊ฐ€ ๋‚˜๋ž€ํžˆ ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ณ  ์ถœ์‹œ์ผ์— ๊นจ์ง€๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ํŽธํ•  ๋•Œ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์„ธ์š”. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ๋Š” import ๊ฒฝ๋กœ, ํŒจํ‚ค์ง€ ์ด๋™, ์ œ๊ฑฐ๋œ ๋ชจ๋“  API์™€ ๊ทธ ๋Œ€์ฒด, ๋™์ž‘ ๋ณ€๊ฒฝ์„ ๋‹ค๋ฃจ๋ฉฐ, ๊ธฐ๊ณ„์ ์ธ ๋ถ€๋ถ„์—๋Š” ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ๊ณต๊ฐœ๋œ ์ถœ์‹œ์ผ์€ ์—†์Šต๋‹ˆ๋‹ค. [๋ฆด๋ฆฌ์Šค](https://github.com/kataras/iris/releases)๋ฅผ ์ง€์ผœ๋ณด๊ฑฐ๋‚˜ [@iris_framework](https://twitter.com/iris_framework)๋ฅผ ํŒ”๋กœ์šฐํ•˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € ์†Œ์‹์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ## ๐Ÿ‘‘ ํ›„์›์ž ์—ฌ๋Ÿฌ๋ถ„์˜ ๋„์›€์œผ๋กœ ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค ์›น ๊ฐœ๋ฐœ์„ ๋” ๋‚ซ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

getsentry github lensesio thepunterbot h4rdc0m draFWM gf3 trading-peter AlbinoGeek basilarchia sumjoe simpleittools xiaozhuai Remydeme celsosz linxcoder jnelle TechMaster janwebdev altafino jakoubek alekperos day0ng hengestone thomasfr code-chimp CetinBasoz International Juanses SometimesMage ansrivas boreevyuri brentwilson camilbinas ekobayong lexrus li3p madhu72 mosorize se77en tstangenberg vincent-li DavidShaw sascha11110 clichi2002 derReineke Sirisap22 primadi agoncecelia chrisliang12 zyu hobysmith pluja antonio-pedrazzini clacroix njeff3 ixalender mubariz-ahmed Cesar th31nitiate stgrosshh Didainius DmarshalTU IwateKyle Little-YangYang Major2828 MatejLach amritpal042 andrefiorot boomhut cshum dtrifonov gadokrisztian geordee guanting112 iantuan ichenhe rodrigoghm icibiri jewe11er jfloresremar jingtianfeng kilarusravankumar leandrobraga lfbos lpintes macropas marcmmx mark2b miguel-devs mihado mmckeen75 narven odas0r olaf-lexemo pitexplore pr123 rsousacode sankethpb wixregiga GeorgeFourikis saz59 shadowfiga siriushaha skurtz97 srinivasganti syrm tuhao1020 BlackHole1 L-M-Sherlock claudemuller keymanye wahyuief xuyan2018 xvalen xytis ElNovi IpastorSan KKP4 Lernakow ernestocolombo francisstephan pixelheresy rcapraro soiestad spkarason thanasolykos ukitzmann DanielKirkwood colinf simonproctor FernandoLangOFC Firdavs9512 Flammable-Duck Gepetdo Hongjian0619 JoeD Jude-X Kartoffelbot KevinZhouRafael KrishManohar Laotanling Longf99999 Lyansun MihaiPopescu1985 TBNilles ajanicij aprinslo1 Mohammed8960 NA Neulhan kyoukhana spazzymoto victorgrey ArishSultan ehayun kukaki oshirokazuhide t6tg 15189573255 AGPDev AnatolyUA AwsIT NguyenPhuoc Oka00 PaddyFrenchman RainerGevers Ramblestsad SamuelNeves Scorpio69t Serissa4000 TianJIANG Ubun1 WangYajun39 XinYoungCN YukinaMochizuki a112121788 acdias aeonsthorn agent3bood ajb-neodynamics-io alessandromarotta algobot76 algoflows angelaahhu anhxuanpham annieruci antoniejiao artman328 b2cbd baoch254 bastengao beytullahakyuz bjoroen blackHoleNgc1277 bunnycodego carlos-enginner centratelemedia chrismalek civicwar cnzhangquan cuong48d damiensy danlanxiaohei dextercai dfaugusto dkzhang dloprodu donam-givita dph0899 dvitale ec0629 edwindna2 ekiyooka ekofedriyanto eli-yip eljefedelrodeodeljefe fenriz07 ffelipelimao frenchmajesty gastropulgite geGao123 globalflea gloudx gnosthi gogoswift goten002 guanzi008 hdezoscar93 hieungm hieunmg homerious hzxd inyellowbus iuliancarnaru iysaleh jackptoke jackysywk jeff2go jeremiahyan joelywz kamolcu kana99 edsongley katsubushiken kattaprasanth keeio keval6706 khasanovrs kkdaypenny knavels kohakuhubo korowiov kostasvk lafayetteDan lbsubash leki75 lemuelroberto liheyuan lingyingtan linuxluigi lipatti maikelcoke marek-kuticka marman-hp mattbowen maxgozou maxgozzz mitas mizzlespot mkell43 mnievesco mo3lyana motogo mtrense mukunhao mulyawansentosa nasoma ngseiyu nikharsaxena nronzel odelanno onlysumitg xPoppa yesudeep ymonk yonson2 yshengliao ytxmobile98 yusong-offx zhenggangpku zou8944 SergeShin - BelmonduS Diewald cty4ka martinjanda evan hazmi-e205 jtgoral ky2s lauweliam ozfive paulcockrell paulxu21 pesquive petros9282 phil535 pitt134 poscard qiepeipei qiuzhanghua rapita rbondi relaera remopavithran rfunix rhernandez-itemsoft rikoriswandha risallaw robivictor rubiagatra rubyangxg rxrw saleebm sbenimeli sebyno seun-otosho shobhitsinghal77 solohiroshi su1gen sukiejosh suresh16671 svirmi terjelafton thiennguyen93 unixedia vadgun valsorym vguhesan vpiduri vrocadev vuhoanglam walter-wang martinlindhe mdamschen letmestudy michaelsmanley Curtman SridarDhandapani madrigaltenor opusmagna ShahramMebashar b4zz4r bobmcallan fangli galois-tnp mblandr midhubalan netbaalzovf oliverjosefzimmer peacememories talebisinan valkuere lfaynman ArturWierzbicki aaxx crashCoder derekslenk dochoaj evillgenius75 gog200921 mauricedcastro mwiater sj671 statik supersherm5 thejones CSRaghunandan ndimorle rosales-stephanie shyyawn vcruzato wangbl11 wofka72 geoshan juanxme nguyentamvinhlong yoru74 xsokev oleang michalsz pomland-94 tejzpr theantichris tuxaanand raphael-brand willypuzzle dmcbane malcolm-white-dti HieuLsw carlosmoran092 yangxianglong

## ๐Ÿ“– Iris ๋ฐฐ์šฐ๊ธฐ ### ์„ค์น˜ ํ•„์š”ํ•œ ๊ฒƒ์€ [Go ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด](https://go.dev/dl/)๋ฟ์ž…๋‹ˆ๋‹ค. #### ์ƒˆ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ ```sh $ mkdir myapp $ cd myapp $ go mod init myapp $ go get github.com/kataras/iris/v12@latest # ๋˜๋Š” @v12.2.11 ```
๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— ์„ค์น˜ํ•˜๊ธฐ ```sh $ cd myapp $ go get github.com/kataras/iris/v12@latest ``` **์‹คํ–‰** ```sh $ go mod tidy -compat=1.23 # windows์—์„œ๋Š” -compat="1.23". $ go run . ```
![](https://www.iris-go.com/images/gifs/install-create-iris.gif) Iris๋Š” ๊ด‘๋ฒ”์œ„ํ•˜๊ณ  ๊ผผ๊ผผํ•œ **[๋ฌธ์„œ](https://www.iris-go.com/docs)** ๋ฅผ ๊ฐ–์ถ”๊ณ  ์žˆ์–ด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‰ฝ๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ๊ธฐ์ˆ  ๋ฌธ์„œ๋Š” [godocs](https://pkg.go.dev/github.com/kataras/iris/v12@v12.2.11)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋Š” ์ €์žฅ์†Œ์˜ [./_examples](_examples) ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ### Plexon AI๋กœ ๊ฐœ๋ฐœํ•˜๊ธฐ [Plexon AI](https://plexon.ai)๋Š” Hellenic Development๊ฐ€ ๋งŒ๋“  ํฌ๋กœ์Šค ํ”Œ๋žซํผ AI ์ฝ”๋”ฉ ์–ด์‹œ์Šคํ„ดํŠธ์ด๋ฉฐ, **Iris ์ „์šฉ ์Šคํ‚ฌ**์„ ํ•จ๊ป˜ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ ์ œ์ž‘์ž๊ฐ€ ์ง์ ‘ ์“ด v14 ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ๋กœ, ๋ผ์šฐํŒ…๊ณผ ๋งคํฌ๋กœ, ์ปจํ…์ŠคํŠธ API, `rest` ํ—ฌํผ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ, ์„œ๋ฅธ ๊ฐœ์˜ ๋ฏธ๋“ค์›จ์–ด ์ „๋ถ€, ๊ธฐ๋ณธ ์ œ๊ณต ์ปจํŠธ๋กค๋Ÿฌ, ์ธ์ฆ SDK, ๋ณด์•ˆ ๊ฐ•ํ™”, ๋ฐ์ดํ„ฐ ์˜์†์„ฑ, ์บ์‹ฑ, i18n, ๊ด€์ธก์„ฑ, ์„ฑ๋Šฅ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ, ๊ทธ๋ฆฌ๊ณ  v12์—์„œ v14๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋‹ค๋ฃจ๋Š” ์—ด์•„ํ™‰ ๊ฐœ์˜ ์ฐธ์กฐ ๋ฌธ์„œ๊ฐ€ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค. **Software Developer** ํŽ˜๋ฅด์†Œ๋‚˜๋ฅผ ์„ค์น˜ํ•˜๋ฉด Iris ์Šคํ‚ฌ์ด ํ•จ๊ป˜ ๋”ฐ๋ผ์˜ค๋ฉฐ, ์ด ํŽ˜๋ฅด์†Œ๋‚˜๊ฐ€ ํ™œ์„ฑํ™”ํ•˜๋Š” ์—”์ง€๋‹ˆ์–ด๋ง ์—์ด์ „ํŠธ๋“ค๊ณผ ๋‚˜๋ž€ํžˆ ๋†“์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–ด์‹œ์Šคํ„ดํŠธ๋Š” ํ•™์Šต ์ค‘์— ์šฐ์—ฐํžˆ ๋ณธ ๊ฒƒ์„ ์ง์ž‘ํ•˜๋Š” ๋Œ€์‹ , ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์˜๋„ํ•œ ๋ฐฉ์‹ ๊ทธ๋Œ€๋กœ Iris ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ### ์—ฌํ–‰ํ•˜๋ฉด์„œ ๋…์„œ๋ฅผ ์ฆ๊ธฐ์‹œ๋‚˜์š”? Book cover [![follow author on twitter](https://img.shields.io/twitter/follow/makismaropoulos?color=3D8AA3&logoColor=3D8AA3&style=for-the-badge&logo=twitter)](https://twitter.com/intent/follow?screen_name=makismaropoulos) [![follow Iris web framework on twitter](https://img.shields.io/twitter/follow/iris_framework?color=ee7506&logoColor=ee7506&style=for-the-badge&logo=twitter)](https://twitter.com/intent/follow?screen_name=iris_framework) [![follow Iris web framework on facebook](https://img.shields.io/badge/Follow%20%40Iris.framework-569-2D88FF.svg?style=for-the-badge&logo=facebook)](https://www.facebook.com/iris.framework) **Iris E-Book** (์ƒˆ ํŒ)์˜ PDF ๋ฒ„์ „๊ณผ ์˜จ๋ผ์ธ ์ ‘๊ทผ์„ ์˜ค๋Š˜ [์š”์ฒญ](https://www.iris-go.com/#ebookDonateForm)ํ•˜์‹œ๊ณ  Iris ๊ฐœ๋ฐœ์— ์ฐธ์—ฌํ•˜์„ธ์š”. ## ๐Ÿ™Œ ๊ธฐ์—ฌํ•˜๊ธฐ Iris ์›น ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! Iris ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [CONTRIBUTING.md](CONTRIBUTING.md) ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”. [๊ธฐ์—ฌ์ž ๋ชฉ๋ก](https://github.com/kataras/iris/graphs/contributors) ## ๐Ÿ›ก ๋ณด์•ˆ ์ทจ์•ฝ์  Iris์—์„œ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๋ฐœ๊ฒฌํ•˜์‹œ๋ฉด [iris-go@outlook.com](mailto:iris-go@outlook.com)์œผ๋กœ ๋ฉ”์ผ์„ ๋ณด๋‚ด์ฃผ์„ธ์š”. ๋ชจ๋“  ๋ณด์•ˆ ์ทจ์•ฝ์ ์€ ์‹ ์†ํžˆ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ## ๐Ÿ“ ๋ผ์ด์„ ์Šค ์ด ํ”„๋กœ์ ํŠธ๋Š” Go ํ”„๋กœ์ ํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ [BSD 3-clause ๋ผ์ด์„ ์Šค](LICENSE)๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ "Iris"๋Š” ๊ทธ๋ฆฌ์Šค ์‹ ํ™”์—์„œ ์˜๊ฐ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.