spine

package module
v0.2.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 21, 2026 License: MIT Imports: 4 Imported by: 0

README ยถ

ํ•œ๊ตญ์–ด | English

๐Ÿฆด Spine

Spine

Spine is the execution backbone of a backend system.

Spine defines how a request is resolved, executed, and completed โ€” explicitly.

Spine๋Š” ์š”์ฒญ์ด ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋˜๋Š”์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ๋“œ๋Ÿฌ๋‚ด๋Š” ๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.


Spine์„ ์‰ฝ๊ฒŒ ๋ฐฐ์›Œ๋ณด์„ธ์š”

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

Spine์˜ ๋ฌธ์ œ์˜์‹

๋Œ€๋ถ€๋ถ„์˜ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์‹คํ–‰ ํ๋ฆ„์„ ์ˆจ๊น๋‹ˆ๋‹ค.

  • ์š”์ฒญ์ด ์–ด๋””์„œ ์‹œ์ž‘๋˜๋Š”์ง€
  • ๋ˆ„๊ฐ€ ์ธ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š”์ง€
  • ์–ธ์ œ ๋น„์ฆˆ๋‹ˆ์Šค ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€
  • ๋ฐ˜ํ™˜๊ฐ’์ด ์–ด๋–ป๊ฒŒ ์‘๋‹ต์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š”์ง€

์ด ๋ชจ๋“  ๊ณผ์ •์€ ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด๋ถ€ ๊ทœ์น™๊ณผ ๊ด€์Šต, ์•”๋ฌต์  ๋™์ž‘์— ๋ฌปํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค.

Spine๋Š” ์ด ํ๋ฆ„์„ ์ˆจ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์‹คํ–‰ ์ˆœ์„œ์™€ ์ฑ…์ž„์„ ์ฝ”๋“œ ๊ตฌ์กฐ๋กœ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค.


ํ•œ๊ตญ๊ณผ Spine

ํ•œ๊ตญ์—๋Š” ์ž์ฒด IoC + ์‹คํ–‰ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.
์ „์ž์ •๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ์กฐ์ฐจ Spring IoC ์œ„์˜ ์กฐํ•ฉ๋ฌผ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

NestJS, Spring, FastAPI, Django๋Š” ๋ชจ๋‘ ํ•ด์™ธ ์„ค๊ณ„ ์ฒ ํ•™์˜ ์ˆ˜์ž…์ž…๋‹ˆ๋‹ค.

Spine๋Š” ํ•œ๊ตญ์—์„œ ๊ฑฐ์˜ ์ฒ˜์Œ ์‹œ๋„๋˜๋Š”,
Execution Pipeline ์ค‘์‹ฌ์˜ ํ˜„๋Œ€์ ์ธ ๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.


Spine์œผ๋กœ ๋งŒ๋“  ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ

๐Ÿ‘‰ https://github.com/NARUBROWN/spine-user-demo


Spine์€ ๋ฌด์—‡์ด ์•„๋‹Œ๊ฐ€

  • โŒ HTTP Engine์ด ์•„๋‹™๋‹ˆ๋‹ค
  • โŒ Router ์ค‘์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค
  • โŒ Annotation / Decorator ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค
  • โŒ Convention over Configuration์„ ์ฑ„ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
  • โŒ Controller์— ์‹คํ–‰ ์ฑ…์ž„์„ ์œ„์ž„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

Spine๋Š” Execution Pipeline์ž…๋‹ˆ๋‹ค.


์ „์ฒด ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”

HTTP Transport (Echo)
        โ”‚
        โ–ผ
ExecutionContext
        โ”‚
        โ–ผ
Pipeline
  โ”œโ”€ Router
  โ”œโ”€ ParameterMeta Builder
  โ”œโ”€ ArgumentResolver Chain
  โ”œโ”€ Interceptor (preHandle)
  โ”œโ”€ Invoker (Controller Method Call)
  โ”œโ”€ ReturnValueHandler
  โ””โ”€ Interceptor (postHandle)
        โ”‚
        โ–ผ
ResponseWriter

์ด ๊ตฌ์กฐ๋Š” ์„ค์ •์ด ์•„๋‹ˆ๋ผ ์‹คํ–‰ ๋ชจ๋ธ ๊ทธ ์ž์ฒด์ž…๋‹ˆ๋‹ค.


Execution Pipeline

๋ชจ๋“  ์š”์ฒญ์€ ๋‹ค์Œ ์ˆœ์„œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

  1. Pipeline ์ง„์ž…
  2. Router๋ฅผ ํ†ตํ•œ HandlerMeta ์„ ํƒ
  3. ParameterMeta ์ƒ์„ฑ
  4. ArgumentResolver ์ฒด์ธ ์‹คํ–‰
  5. Interceptor.preHandle
  6. Controller Method ํ˜ธ์ถœ (Invoker)
  7. ReturnValueHandler ์‹คํ–‰
  8. Interceptor.postHandle
  9. ResponseWriter๋ฅผ ํ†ตํ•œ ์‘๋‹ต ๊ธฐ๋ก

์ด ์ˆœ์„œ๋Š” ์ˆจ๊ฒจ์ง€์ง€ ์•Š์œผ๋ฉฐ, ์•”๋ฌต์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


Controller ์„ค๊ณ„ ์ฒ ํ•™

Spine์˜ ์›์น™

Controller๋Š” ์‹คํ–‰ ๋ชจ๋ธ์„ ๋ชจ๋ฅธ๋‹ค.
ํ•˜์ง€๋งŒ ์ž…๋ ฅ์˜ ์ถœ์ฒ˜๋Š” ํƒ€์ž…์œผ๋กœ ๋ช…์‹œํ•œ๋‹ค.

Controller๋Š” ๋‹ค์Œ์— ์˜์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • path.* : Path Parameter ์˜๋ฏธ ํƒ€์ž…
  • query.* : Query Parameter ์˜๋ฏธ ํƒ€์ž…
  • httperr.* : HTTP Error ์˜๋ฏธ ํƒ€์ž…

Controller๋Š” ๋‹ค์Œ์— ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

  • ExecutionContext
  • Pipeline
  • Router
  • Resolver
  • HTTP / Transport ํƒ€์ž…

Controller ์˜ˆ์‹œ
func (c *UserController) GetUser(userId path.Int) (User, error) {
    if userId.Value <= 0 {
        return User{}, httperr.BadRequest("์œ ํšจํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž ID์ž…๋‹ˆ๋‹ค")
    }

    user, err := c.repo.FindByID(userId.Value)
    if err != nil {
        return User{}, httperr.NotFound("์‚ฌ์šฉ์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค")
    }

    return user, nil
}

Controller๋Š”:

  • HTTP๋ฅผ ๋ชจ๋ฆ…๋‹ˆ๋‹ค
  • ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ชจ๋ฆ…๋‹ˆ๋‹ค
  • ๊ฐ’์˜ ์ถœ์ฒ˜๋งŒ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค

Signature-as-Contract

Spine์—์„œ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” API ๊ณ„์•ฝ ๊ทธ ์ž์ฒด์ž…๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ ์ƒ์„ฑ โ†’ ArgumentResolver
  • ์ถœ๋ ฅ ์ฒ˜๋ฆฌ โ†’ ReturnValueHandler

์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ณ€๊ฒฝ์€ ๊ณง API ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค.

Spine๋Š” ๋‹ค์Œ์„ ์˜๋„์ ์œผ๋กœ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค:

  • โŒ Annotation ๊ธฐ๋ฐ˜ ๋งคํ•‘
  • โŒ Convention ๊ธฐ๋ฐ˜ ์ž๋™ ์ถ”๋ก 
  • โŒ Primitive ํƒ€์ž…์˜ ์•”๋ฌต์  ์ฃผ์ž…

Context ๋ถ„๋ฆฌ

Spine๋Š” Context๋ฅผ ๋‘ ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ExecutionContext
  • ์‹คํ–‰ ํ๋ฆ„ ์ œ์–ด ์ „์šฉ
  • Router / Pipeline ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ
  • Controller ๋ฐ Resolver์— ๋…ธ์ถœ โŒ
RequestContext
  • ์ž…๋ ฅ ํ•ด์„ ์ „์šฉ (Path / Query / Body)
  • ArgumentResolver์—์„œ๋งŒ ์‚ฌ์šฉ
  • Controller์— ๋…ธ์ถœ โŒ

Path Parameter Binding Rule

Spine์˜ Path Parameter ๋ฐ”์ธ๋”ฉ์€ ์ˆœ์„œ ๊ธฐ๋ฐ˜(order-based) ์ž…๋‹ˆ๋‹ค.
์ด๋Š” Go ์–ธ์–ด ์ œ์•ฝ์„ ๊ณ ๋ คํ•œ ์˜๋„์ ์ด๊ณ  ๋ช…์‹œ์ ์ธ ๊ณ„์•ฝ์ž…๋‹ˆ๋‹ค.

๊ทœ์น™
Route Path Key ์„ ์–ธ ์ˆœ์„œ
=
Controller ์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ path.* ํŒŒ๋ผ๋ฏธํ„ฐ ์„ ์–ธ ์ˆœ์„œ
์˜ˆ์‹œ
// Route
/users/:userId/posts/:postId

// Controller
func GetPost(userId path.Int, postId path.Int)
์ •์ฑ…
  • ์ด๋ฆ„ ๋งค์นญ โŒ
  • annotation โŒ
  • primitive ํƒ€์ž… โŒ
  • ์ˆœ์„œ ๋ถˆ์ผ์น˜ ์‹œ ์ฆ‰์‹œ ์‹คํŒจ (Fail Fast)

Query ์ฒ˜๋ฆฌ ์›์น™

์˜๋ฏธ๊ฐ€ ๊ณ ์ •๋œ Query
func ListUsers(p query.Pagination)

Spine๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์˜๋ฏธ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋ณ€ Query
func SearchUsers(q query.Values)
  • Raw Query View ์ œ๊ณต
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํ•ด์„
  • DTO ์ž๋™ ๋งคํ•‘ โŒ

ReturnValueHandler & ResponseWriter

Controller๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

return User{...}

์‘๋‹ต ์ƒ์„ฑ์€ ์ „๋ถ€ ReturnValueHandler๊ฐ€ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
Transport๋Š” ResponseWriter๋งŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.


License

MIT

Documentation ยถ

Index ยถ

Constants ยถ

This section is empty.

Variables ยถ

This section is empty.

Functions ยถ

This section is empty.

Types ยถ

type App ยถ

type App interface {
	// ์ƒ์„ฑ์ž ์„ ์–ธ
	Constructor(constructors ...any)
	// ๋ผ์šฐํŠธ ์„ ์–ธ
	Route(method string, path string, handler any, opts ...router.RouteOption)
	// ์ธํ„ฐ์…‰ํ„ฐ ์„ ์–ธ
	Interceptor(interceptors ...core.Interceptor)
	// HTTP Transport ํ™•์žฅ (Echo ๋“ฑ)
	Transport(fn func(any))
	// ์‹คํ–‰
	Run(opts boot.Options) error
}

func New ยถ

func New() App

Directories ยถ

Path Synopsis
cmd
demo command
interceptor
internal
pkg

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL