{"id":73906,"date":"2024-08-18T18:33:20","date_gmt":"2024-08-18T15:03:20","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/"},"modified":"2024-08-18T18:33:20","modified_gmt":"2024-08-18T15:03:20","slug":"using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/","title":{"rendered":"\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 SQLBoiler \u0648 Wire \u062f\u0631 \u0645\u0639\u0645\u0627\u0631\u06cc \u0644\u0627\u06cc\u0647 \u0627\u06cc \u0628\u0627 Go"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang <\/p>\n<p>  0. \u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639<\/p>\n<p>\u0645\u0646 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0631\u0627 \u062f\u0631 \u062d\u0627\u0644\u06cc \u0646\u0648\u0634\u062a\u0645 \u06a9\u0647 \u0645\u0639\u0645\u0627\u0631\u06cc \u0644\u0627\u06cc\u0647\u200c\u0627\u06cc \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0631\u062f\u0645 \u0648 \u062f\u0631 \u0639\u06cc\u0646 \u062d\u0627\u0644 \u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0631\u0627 \u06cc\u0627\u062f \u06af\u0631\u0641\u062a\u0645 Wire.<br \/>\n\u0642\u0628\u0644 \u0627\u0632 \u0627\u06cc\u0646 \u06a9\u0627\u0631\u060c \u0641\u0627\u06cc\u0644 Docker Compose \u0628\u0627 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 Go backend\u060c MySQL \u0648 Adminer \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a.<br \/>\n\u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u062a\u0646\u0638\u06cc\u0645\u0627\u062a SQLBoiler \u0648 Wire \u0646\u06cc\u0632 \u062a\u06a9\u0645\u06cc\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a.<br \/>\n\u0627\u06cc\u0646 \u0633\u0627\u062e\u062a\u0627\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0627\u0633\u062a.<\/p>\n<p>|   .gitignore<br \/>\n|   docker-compose.yml<br \/>\n|   README.md<br \/>\n|<br \/>\n+&#8212;backend<br \/>\n|   |   .air.toml<br \/>\n|   |   Dockerfile<br \/>\n|   |   go.mod<br \/>\n|   |   go.sum<br \/>\n|   |   main.go<br \/>\n|   |   sqlboiler.toml<br \/>\n|   |<br \/>\n|   +&#8212;domain<br \/>\n|   |   +&#8212;entity<br \/>\n|   |   |       book.go<br \/>\n|   |   |<br \/>\n|   |   \\&#8212;repository<br \/>\n|   |           book.go<br \/>\n|   |<br \/>\n|   +&#8212;infrastructure<br \/>\n|   |   \\&#8212;repositoryImpl<br \/>\n|   |           book.go<br \/>\n|   |<br \/>\n|   +&#8212;interface<br \/>\n|   |   \\&#8212;handler<br \/>\n|   |           book.go<br \/>\n|   |           rooter.go<br \/>\n|   |<br \/>\n|   +&#8212;mysql<br \/>\n|   |       db.go<br \/>\n|   |<br \/>\n|   +&#8212;sqlboiler (auto generated)<br \/>\n|   |       boil_queries.go<br \/>\n|   |       boil_table_names.go<br \/>\n|   |       boil_types.go<br \/>\n|   |       books.go<br \/>\n|   |       mysql_upsert.go<br \/>\n|   |<br \/>\n|   |<br \/>\n|   +&#8212;usecase<br \/>\n|   |       book_repository.go<br \/>\n|   |<br \/>\n|   \\&#8212;wire<br \/>\n|           wire.go<br \/>\n|           wire_gen.go<br \/>\n|<br \/>\n\\&#8212;initdb<br \/>\n        init.sql<\/p>\n<p>  1. initdb\/init.sql<\/p>\n<p>\u0628\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc docker-entrypoint-initdb.d \u062f\u0631 \u0641\u0627\u06cc\u0644 docker-compose.yaml\u060c \u062c\u062f\u0627\u0648\u0644 \u0628\u0647\u200c\u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u0634\u0648\u0646\u062f.<\/p>\n<p>CREATE TABLE books (<br \/>\n    id INT PRIMARY KEY,<br \/>\n    name VARCHAR(255) NOT NULL<br \/>\n);<\/p>\n<p>  2. \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc sqlboiler \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f sqlboiler mysql<\/p>\n<p>\u0641\u0627\u06cc\u0644 \u0647\u0627 \u062f\u0631 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u0634\u0648\u0646\u062f \/sqlboiler<\/p>\n<p>  3. NewDB \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u0645\u0646 \u0631\u0648\u0634 \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u0645.<br \/>\n\/mysql\/db.go<\/p>\n<p>package mysql<\/p>\n<p>import (<br \/>\n    &#8220;database\/sql&#8221;<br \/>\n    &#8220;fmt&#8221;<\/p>\n<p>    _ &#8220;github.com\/go-sql-driver\/mysql&#8221;<br \/>\n)<\/p>\n<p>type DBConfig struct {<br \/>\n    User     string<br \/>\n    Password string<br \/>\n    Host     string<br \/>\n    Port     int<br \/>\n    DBName   string<br \/>\n}<\/p>\n<p>func NewDB() (*sql.DB, error) {<br \/>\n    cfg := DBConfig{<br \/>\n        User:     &#8220;sample&#8221;,<br \/>\n        Password: &#8220;sample&#8221;,<br \/>\n        Host:     &#8220;sample&#8221;,<br \/>\n        Port:     3306,<br \/>\n        DBName:   &#8220;sample&#8221;,<br \/>\n    }<\/p>\n<p>    dsn := fmt.Sprintf(&#8220;%s:%s@tcp(%s:%d)\/%s&#8221;, cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.DBName)<br \/>\n    db, err := sql.Open(&#8220;mysql&#8221;, dsn)<br \/>\n    if err != nil {<br \/>\n        return nil, err<br \/>\n    }<\/p>\n<p>    if err := db.Ping(); err != nil {<br \/>\n        return nil, err<br \/>\n    }<\/p>\n<p>    return db, nil<br \/>\n}<\/p>\n<p>  4. \u062f\u0627\u0645\u0646\u0647\u060c Usecase\u060c \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0648 \u0631\u0627\u0628\u0637 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/p>\n<p>  \/domain\/entity\/book.go<\/p>\n<p>package entity<\/p>\n<p>type Book struct {<br \/>\n    Id int<br \/>\n    Name string<br \/>\n}<\/p>\n<p>  \/domain\/repository\/book.go<\/p>\n<p>package repository<\/p>\n<p>import &#8220;main\/domain\/entity&#8221;<\/p>\n<p>type BookRepository interface {<br \/>\n    Save(book *entity.Book) error<br \/>\n}<\/p>\n<p>  \/usecase\/book.go<\/p>\n<p>package usecase<\/p>\n<p>import (<br \/>\n    &#8220;main\/domain\/entity&#8221;<br \/>\n    &#8220;main\/domain\/repository&#8221;<br \/>\n)<\/p>\n<p>type BookUsecase interface {<br \/>\n    Save(book *entity.Book) error<br \/>\n}<\/p>\n<p>type bookUsecaseImpl struct {<br \/>\n    bookRepository repository.BookRepository<br \/>\n}<\/p>\n<p>func NewBookUsecaseImpl(br repository.BookRepository) BookUsecase {<br \/>\n    return &amp;bookUsecaseImpl{bookRepository: br}<br \/>\n}<br \/>\nfunc (bu *bookUsecaseImpl) Save(book *entity.Book) error {<br \/>\n    if err := bu.bookRepository.Save(book); err != nil {<br \/>\n        return err<br \/>\n    }<br \/>\n    return nil<br \/>\n}<\/p>\n<p>  \/infrastructure\/repositoryImpl\/book.go<\/p>\n<p>package repositoryImpl<\/p>\n<p>import (<br \/>\n    &#8220;context&#8221;<br \/>\n    &#8220;database\/sql&#8221;<br \/>\n    &#8220;main\/domain\/entity&#8221;<br \/>\n    &#8220;main\/domain\/repository&#8221;<br \/>\n    &#8220;main\/sqlboiler&#8221;<\/p>\n<p>    &#8220;github.com\/volatiletech\/sqlboiler\/v4\/boil&#8221;<br \/>\n)<\/p>\n<p>type bookRepositoryImpl struct {<br \/>\n    db *sql.DB<br \/>\n}<\/p>\n<p>func NewBookRepositoryImpl(db *sql.DB) repository.BookRepository {<br \/>\n    return &amp;bookRepositoryImpl{db: db}<br \/>\n}<\/p>\n<p>func (br *bookRepositoryImpl) Save(book *entity.Book) error {<br \/>\n    bookModel := &amp;sqlboiler.Book{<br \/>\n        ID:   book.Id,<br \/>\n        Name: book.Name,<br \/>\n    }<br \/>\n    err := bookModel.Insert(context.Background(), br.db, boil.Infer())<br \/>\n    if err != nil {<br \/>\n        return err<br \/>\n    }<br \/>\n    return nil<br \/>\n}<\/p>\n<p>  \/interface\/handler\/book.go<\/p>\n<p>\u0628\u0631\u0627\u06cc API\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u0632\u06cc\u0631 \/book \u062f\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u0645\u06cc \u0634\u0648\u0646\u062f\u060c \u062f\u0631 \u0627\u06cc\u0646 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u062e\u0648\u0627\u0647\u0646\u062f \u0634\u062f.<\/p>\n<p>package handler<\/p>\n<p>import (<br \/>\n    &#8220;main\/domain\/entity&#8221;<br \/>\n    &#8220;main\/usecase&#8221;<br \/>\n    &#8220;net\/http&#8221;<\/p>\n<p>    &#8220;github.com\/labstack\/echo\/v4&#8221;<br \/>\n)<\/p>\n<p>type BookHandler struct {<br \/>\n    bookUsecase usecase.BookUsecase<br \/>\n}<\/p>\n<p>func (bh *BookHandler) RegisterRoutes(e *echo.Echo) {<br \/>\n    e.POST(&#8220;\/book&#8221;, bh.SaveBook)<br \/>\n}<\/p>\n<p>func NewBookHandler(bu usecase.BookUsecase) *BookHandler {<br \/>\n    return &amp;BookHandler{bookUsecase: bu}<br \/>\n}<\/p>\n<p>func (bh *BookHandler) SaveBook(c echo.Context) error {<\/p>\n<p>    book := new(entity.Book)<br \/>\n    if err := c.Bind(book); err != nil {<br \/>\n        return c.JSON(http.StatusBadRequest, map[string]string{&#8220;error&#8221;: &#8220;invalid request&#8221;})<br \/>\n    }<br \/>\n    if err := bh.bookUsecase.Save(book); err != nil {<br \/>\n        return c.JSON(http.StatusInternalServerError, map[string]string{&#8220;error&#8221;: err.Error()})<br \/>\n    }<br \/>\n    return c.JSON(http.StatusOK, book)<br \/>\n}<\/p>\n<p>  \/interface\/handler\/router.go<\/p>\n<p>\u0645\u0646 router.go \u0631\u0627 \u0628\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u06cc\u062c\u0627\u062f \u0686\u0646\u062f\u06cc\u0646 API \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u0645.<\/p>\n<p>package handler<\/p>\n<p>import (<br \/>\n    &#8220;github.com\/labstack\/echo\/v4&#8221;<br \/>\n)<\/p>\n<p>func RegisterRoutes(e *echo.Echo, bookHandler *BookHandler) {<br \/>\n    bookHandler.RegisterRoutes(e)<br \/>\n}<\/p>\n<p>func NewEchoInstance(bookHandler *BookHandler) *echo.Echo {<br \/>\n    e := echo.New()<br \/>\n    RegisterRoutes(e, bookHandler)<br \/>\n    return e<br \/>\n}<\/p>\n<p>  5. wire.go \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u0645\u0646 wire.go \u0631\u0627 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0634\u062f\u0647 \u0628\u0627 \u062a\u0632\u0631\u06cc\u0642 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u0645. \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 router.go \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u062f e\u060c \u0627\u06cc\u0646 \u0642\u0633\u0645\u062a \u0646\u06cc\u0632 \u062f\u0631 wire.go \u0642\u0631\u0627\u0631 \u062e\u0648\u0627\u0647\u062f \u06af\u0631\u0641\u062a.<br \/>\n\u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f \/\/go:build wireinject \u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0641\u0627\u06cc\u0644 \u0641\u0642\u0637 \u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u062a\u0648\u0644\u06cc\u062f \u06a9\u062f \u0628\u0627 Wire \u06af\u0646\u062c\u0627\u0646\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a \u0648 \u0627\u0632 \u0633\u0627\u062e\u062a \u0646\u0647\u0627\u06cc\u06cc \u062d\u0630\u0641 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p>\/\/go:build wireinject<\/p>\n<p>package wire<\/p>\n<p>import (<br \/>\n    &#8220;main\/infrastructure\/repositoryImpl&#8221;<br \/>\n    &#8220;main\/interface\/handler&#8221;<br \/>\n    &#8220;main\/mysql&#8221;<br \/>\n    &#8220;main\/usecase&#8221;<\/p>\n<p>    &#8220;github.com\/google\/wire&#8221;<br \/>\n    &#8220;github.com\/labstack\/echo\/v4&#8221;<br \/>\n)<\/p>\n<p>func InitializeEcho() (*echo.Echo, error) {<br \/>\n    wire.Build(<br \/>\n        mysql.NewDB,<br \/>\n        repositoryImpl.NewBookRepositoryImpl,<br \/>\n        usecase.NewBookUsecaseImpl,<br \/>\n        handler.NewBookHandler,<br \/>\n        handler.NewEchoInstance,<br \/>\n    )<br \/>\n    return nil, nil<br \/>\n}<\/p>\n<p>  6. wire_gen.go \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<p>wire_gen.go \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0628\u0647 \u0635\u0648\u0631\u062a \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0645\u0634\u062e\u0635 \u0634\u062f\u0647 \u062f\u0631 wire.go \u0627\u0633\u062a.<\/p>\n<p>\u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f wire \u062f\u0631 \/wire.<\/p>\n<p>wire.go  \u0628\u0647 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u062a\u0648\u0644\u06cc\u062f \u062e\u0648\u0627\u0647\u062f \u0634\u062f.<\/p>\n<p>\/\/ Code generated by Wire. DO NOT EDIT.<\/p>\n<p>\/\/go:generate go run -mod=mod github.com\/google\/wire\/cmd\/wire<br \/>\n\/\/go:build !wireinject<br \/>\n\/\/ +build !wireinject<\/p>\n<p>package wire<\/p>\n<p>import (<br \/>\n    &#8220;github.com\/labstack\/echo\/v4&#8221;<br \/>\n    &#8220;main\/infrastructure\/repositoryImpl&#8221;<br \/>\n    &#8220;main\/interface\/handler&#8221;<br \/>\n    &#8220;main\/mysql&#8221;<br \/>\n    &#8220;main\/usecase&#8221;<br \/>\n)<\/p>\n<p>\/\/ Injectors from wire.go:<\/p>\n<p>func InitializeEcho() (*echo.Echo, error) {<br \/>\n    db, err := mysql.NewDB()<br \/>\n    if err != nil {<br \/>\n        return nil, err<br \/>\n    }<br \/>\n    bookRepository := repositoryImpl.NewBookRepositoryImpl(db)<br \/>\n    bookUsecase := usecase.NewBookUsecaseImpl(bookRepository)<br \/>\n    bookHandler := handler.NewBookHandler(bookUsecase)<br \/>\n    echoEcho := handler.NewEchoInstance(bookHandler)<br \/>\n    return echoEcho, nil<br \/>\n}<\/p>\n<p>  7. \u062a\u0627\u06cc\u06cc\u062f<\/p>\n<p>\u067e\u0633 \u0627\u0632 \u0627\u0631\u0633\u0627\u0644 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0632 \u0637\u0631\u06cc\u0642 API\u060c \u062a\u0648\u0627\u0646\u0633\u062a\u0645 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u0645 \u06a9\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>  8. \u062f\u0631 \u0646\u062a\u06cc\u062c\u0647<\/p>\n<p>\u0645\u0645\u0646\u0648\u0646 \u06a9\u0647 \u062e\u0648\u0627\u0646\u062f\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u067e\u0633\u062a\u060c \u0645\u0646 \u06cc\u06a9 API \u0633\u0627\u062f\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Wire \u0648 SQLBoiler \u062f\u0631 \u06cc\u06a9 \u0645\u0639\u0645\u0627\u0631\u06cc \u0644\u0627\u06cc\u0647 \u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0645. \u0645\u0646 \u0647\u0645\u0686\u0646\u06cc\u0646 \u06cc\u0627\u062f \u06af\u0631\u0641\u062a\u0645 \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 Wire \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627 \u0631\u0627 \u0633\u0627\u062f\u0647 \u062a\u0631 \u06a9\u0646\u062f\u060c \u062d\u062a\u06cc \u0627\u06af\u0631 \u067e\u06cc\u0686\u06cc\u062f\u0647 \u062a\u0631 \u0634\u0648\u0646\u062f. \u0627\u06af\u0631 \u0645\u062a\u0648\u062c\u0647 \u0627\u0634\u062a\u0628\u0627\u0647\u06cc \u0634\u062f\u06cc\u062f\u060c \u0644\u0637\u0641\u0627\u064b \u0628\u0647 \u0645\u0646 \u0627\u0637\u0644\u0627\u0639 \u062f\u0647\u06cc\u062f.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u062a\u063a\u06cc\u06cc\u0631 \u0648\u0636\u0639\u06cc\u062a \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#0_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%B4%D8%B1%D9%88%D8%B9\" >0. \u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#1_initdbinitsql\" >1. initdb\/init.sql<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#2_%D9%81%D8%A7%DB%8C%D9%84_%D9%87%D8%A7%DB%8C_sqlboiler_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >2. \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc sqlboiler \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#3_NewDB_%D8%B1%D8%A7_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\" >3. NewDB \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#4_%D8%AF%D8%A7%D9%85%D9%86%D9%87%D8%8C_Usecase%D8%8C_%D8%B2%DB%8C%D8%B1%D8%B3%D8%A7%D8%AE%D8%AA_%D9%88_%D8%B1%D8%A7%D8%A8%D8%B7_%D8%B1%D8%A7_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\" >4. \u062f\u0627\u0645\u0646\u0647\u060c Usecase\u060c \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0648 \u0631\u0627\u0628\u0637 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#domainentitybookgo\" >\/domain\/entity\/book.go<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#domainrepositorybookgo\" >\/domain\/repository\/book.go<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#usecasebookgo\" >\/usecase\/book.go<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#infrastructurerepositoryImplbookgo\" >\/infrastructure\/repositoryImpl\/book.go<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#interfacehandlerbookgo\" >\/interface\/handler\/book.go<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#interfacehandlerroutergo\" >\/interface\/handler\/router.go<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#5_wirego_%D8%B1%D8%A7_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\" >5. wire.go \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#6_wire_gengo_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >6. wire_gen.go \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#7_%D8%AA%D8%A7%DB%8C%DB%8C%D8%AF\" >7. \u062a\u0627\u06cc\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/nabfollower.com\/blog\/using-sqlboiler-and-wire-in-a-layered-architecture-with-go-1dgm\/#8_%D8%AF%D8%B1_%D9%86%D8%AA%DB%8C%D8%AC%D9%87\" >8. \u062f\u0631 \u0646\u062a\u06cc\u062c\u0647<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"0_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%B4%D8%B1%D9%88%D8%B9\"><\/span>\n<p>  0. \u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u0646 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0631\u0627 \u062f\u0631 \u062d\u0627\u0644\u06cc \u0646\u0648\u0634\u062a\u0645 \u06a9\u0647 \u0645\u0639\u0645\u0627\u0631\u06cc \u0644\u0627\u06cc\u0647\u200c\u0627\u06cc \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0631\u062f\u0645 \u0648 \u062f\u0631 \u0639\u06cc\u0646 \u062d\u0627\u0644 \u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0631\u0627 \u06cc\u0627\u062f \u06af\u0631\u0641\u062a\u0645 <code>Wire<\/code>.<br \/>\n\u0642\u0628\u0644 \u0627\u0632 \u0627\u06cc\u0646 \u06a9\u0627\u0631\u060c \u0641\u0627\u06cc\u0644 Docker Compose \u0628\u0627 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 Go backend\u060c MySQL \u0648 Adminer \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a.<br \/>\n\u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u062a\u0646\u0638\u06cc\u0645\u0627\u062a SQLBoiler \u0648 Wire \u0646\u06cc\u0632 \u062a\u06a9\u0645\u06cc\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a.<br \/>\n\u0627\u06cc\u0646 \u0633\u0627\u062e\u062a\u0627\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0627\u0633\u062a.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>|   .gitignore\n|   docker-compose.yml\n|   README.md\n|        \n+---backend\n|   |   .air.toml\n|   |   Dockerfile\n|   |   go.mod\n|   |   go.sum\n|   |   main.go\n|   |   sqlboiler.toml\n|   |       \n|   +---domain\n|   |   +---entity\n|   |   |       book.go\n|   |   |       \n|   |   \\---repository\n|   |           book.go\n|   |           \n|   +---infrastructure\n|   |   \\---repositoryImpl\n|   |           book.go\n|   |           \n|   +---interface\n|   |   \\---handler\n|   |           book.go\n|   |           rooter.go\n|   |           \n|   +---mysql\n|   |       db.go\n|   |       \n|   +---sqlboiler (auto generated)\n|   |       boil_queries.go\n|   |       boil_table_names.go\n|   |       boil_types.go\n|   |       books.go\n|   |       mysql_upsert.go\n|   |       \n|   |       \n|   +---usecase\n|   |       book_repository.go\n|   |       \n|   \\---wire\n|           wire.go\n|           wire_gen.go\n|           \n\\---initdb\n        init.sql\n<\/code><\/pre>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"1_initdbinitsql\"><\/span>\n<p>  1. initdb\/init.sql<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc docker-entrypoint-initdb.d \u062f\u0631 \u0641\u0627\u06cc\u0644 docker-compose.yaml\u060c \u062c\u062f\u0627\u0648\u0644 \u0628\u0647\u200c\u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u0634\u0648\u0646\u062f.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"n\">books<\/span> <span class=\"p\">(<\/span>\n    <span class=\"n\">id<\/span> <span class=\"nb\">INT<\/span> <span class=\"k\">PRIMARY<\/span> <span class=\"k\">KEY<\/span><span class=\"p\">,<\/span>\n    <span class=\"n\">name<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">255<\/span><span class=\"p\">)<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span>\n<span class=\"p\">);<\/span>\n<\/code><\/pre>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"2_%D9%81%D8%A7%DB%8C%D9%84_%D9%87%D8%A7%DB%8C_sqlboiler_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  2. \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc sqlboiler \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f <code>sqlboiler mysql<\/code><\/p>\n<p>\u0641\u0627\u06cc\u0644 \u0647\u0627 \u062f\u0631 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u0634\u0648\u0646\u062f <code>\/sqlboiler<\/code><\/p>\n<h2><span class=\"ez-toc-section\" id=\"3_NewDB_%D8%B1%D8%A7_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  3. NewDB \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u0646 \u0631\u0648\u0634 \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u0645.<br \/>\n<code>\/mysql\/db.go<\/code>\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">package<\/span> <span class=\"n\">mysql<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">(<\/span>\n    <span class=\"s\">\"database\/sql\"<\/span>\n    <span class=\"s\">\"fmt\"<\/span>\n\n    <span class=\"n\">_<\/span> <span class=\"s\">\"github.com\/go-sql-driver\/mysql\"<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">DBConfig<\/span> <span class=\"k\">struct<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">User<\/span>     <span class=\"kt\">string<\/span>\n    <span class=\"n\">Password<\/span> <span class=\"kt\">string<\/span>\n    <span class=\"n\">Host<\/span>     <span class=\"kt\">string<\/span>\n    <span class=\"n\">Port<\/span>     <span class=\"kt\">int<\/span>\n    <span class=\"n\">DBName<\/span>   <span class=\"kt\">string<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">NewDB<\/span><span class=\"p\">()<\/span> <span class=\"p\">(<\/span><span class=\"o\">*<\/span><span class=\"n\">sql<\/span><span class=\"o\">.<\/span><span class=\"n\">DB<\/span><span class=\"p\">,<\/span> <span class=\"kt\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">cfg<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">DBConfig<\/span><span class=\"p\">{<\/span>\n        <span class=\"n\">User<\/span><span class=\"o\">:<\/span>     <span class=\"s\">\"sample\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">Password<\/span><span class=\"o\">:<\/span> <span class=\"s\">\"sample\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">Host<\/span><span class=\"o\">:<\/span>     <span class=\"s\">\"sample\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">Port<\/span><span class=\"o\">:<\/span>     <span class=\"m\">3306<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">DBName<\/span><span class=\"o\">:<\/span>   <span class=\"s\">\"sample\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"n\">dsn<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">fmt<\/span><span class=\"o\">.<\/span><span class=\"n\">Sprintf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"%s:%s@tcp(%s:%d)\/%s\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">cfg<\/span><span class=\"o\">.<\/span><span class=\"n\">User<\/span><span class=\"p\">,<\/span> <span class=\"n\">cfg<\/span><span class=\"o\">.<\/span><span class=\"n\">Password<\/span><span class=\"p\">,<\/span> <span class=\"n\">cfg<\/span><span class=\"o\">.<\/span><span class=\"n\">Host<\/span><span class=\"p\">,<\/span> <span class=\"n\">cfg<\/span><span class=\"o\">.<\/span><span class=\"n\">Port<\/span><span class=\"p\">,<\/span> <span class=\"n\">cfg<\/span><span class=\"o\">.<\/span><span class=\"n\">DBName<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">db<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">sql<\/span><span class=\"o\">.<\/span><span class=\"n\">Open<\/span><span class=\"p\">(<\/span><span class=\"s\">\"mysql\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">dsn<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">db<\/span><span class=\"o\">.<\/span><span class=\"n\">Ping<\/span><span class=\"p\">();<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span><span class=\"p\">,<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"n\">db<\/span><span class=\"p\">,<\/span> <span class=\"no\">nil<\/span>\n<span class=\"p\">}<\/span>\n\n<\/code><\/pre>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"4_%D8%AF%D8%A7%D9%85%D9%86%D9%87%D8%8C_Usecase%D8%8C_%D8%B2%DB%8C%D8%B1%D8%B3%D8%A7%D8%AE%D8%AA_%D9%88_%D8%B1%D8%A7%D8%A8%D8%B7_%D8%B1%D8%A7_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  4. \u062f\u0627\u0645\u0646\u0647\u060c Usecase\u060c \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0648 \u0631\u0627\u0628\u0637 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"domainentitybookgo\"><\/span>\n<p>  \/domain\/entity\/book.go<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">package<\/span> <span class=\"n\">entity<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">Book<\/span> <span class=\"k\">struct<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">Id<\/span> <span class=\"kt\">int<\/span>\n    <span class=\"n\">Name<\/span> <span class=\"kt\">string<\/span>\n<span class=\"p\">}<\/span>\n\n\n<\/code><\/pre>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"domainrepositorybookgo\"><\/span>\n<p>  \/domain\/repository\/book.go<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">package<\/span> <span class=\"n\">repository<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"s\">\"main\/domain\/entity\"<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">BookRepository<\/span> <span class=\"k\">interface<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">Save<\/span><span class=\"p\">(<\/span><span class=\"n\">book<\/span> <span class=\"o\">*<\/span><span class=\"n\">entity<\/span><span class=\"o\">.<\/span><span class=\"n\">Book<\/span><span class=\"p\">)<\/span> <span class=\"kt\">error<\/span>\n<span class=\"p\">}<\/span>\n\n<\/code><\/pre>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"usecasebookgo\"><\/span>\n<p>  \/usecase\/book.go<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">package<\/span> <span class=\"n\">usecase<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">(<\/span>\n    <span class=\"s\">\"main\/domain\/entity\"<\/span>\n    <span class=\"s\">\"main\/domain\/repository\"<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">BookUsecase<\/span> <span class=\"k\">interface<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">Save<\/span><span class=\"p\">(<\/span><span class=\"n\">book<\/span> <span class=\"o\">*<\/span><span class=\"n\">entity<\/span><span class=\"o\">.<\/span><span class=\"n\">Book<\/span><span class=\"p\">)<\/span> <span class=\"kt\">error<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">bookUsecaseImpl<\/span> <span class=\"k\">struct<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">bookRepository<\/span> <span class=\"n\">repository<\/span><span class=\"o\">.<\/span><span class=\"n\">BookRepository<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">NewBookUsecaseImpl<\/span><span class=\"p\">(<\/span><span class=\"n\">br<\/span> <span class=\"n\">repository<\/span><span class=\"o\">.<\/span><span class=\"n\">BookRepository<\/span><span class=\"p\">)<\/span> <span class=\"n\">BookUsecase<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">bookUsecaseImpl<\/span><span class=\"p\">{<\/span><span class=\"n\">bookRepository<\/span><span class=\"o\">:<\/span> <span class=\"n\">br<\/span><span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"k\">func<\/span> <span class=\"p\">(<\/span><span class=\"n\">bu<\/span> <span class=\"o\">*<\/span><span class=\"n\">bookUsecaseImpl<\/span><span class=\"p\">)<\/span> <span class=\"n\">Save<\/span><span class=\"p\">(<\/span><span class=\"n\">book<\/span> <span class=\"o\">*<\/span><span class=\"n\">entity<\/span><span class=\"o\">.<\/span><span class=\"n\">Book<\/span><span class=\"p\">)<\/span> <span class=\"kt\">error<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">bu<\/span><span class=\"o\">.<\/span><span class=\"n\">bookRepository<\/span><span class=\"o\">.<\/span><span class=\"n\">Save<\/span><span class=\"p\">(<\/span><span class=\"n\">book<\/span><span class=\"p\">);<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span>\n<span class=\"p\">}<\/span>\n\n<\/code><\/pre>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"infrastructurerepositoryImplbookgo\"><\/span>\n<p>  \/infrastructure\/repositoryImpl\/book.go<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">package<\/span> <span class=\"n\">repositoryImpl<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">(<\/span>\n    <span class=\"s\">\"context\"<\/span>\n    <span class=\"s\">\"database\/sql\"<\/span>\n    <span class=\"s\">\"main\/domain\/entity\"<\/span>\n    <span class=\"s\">\"main\/domain\/repository\"<\/span>\n    <span class=\"s\">\"main\/sqlboiler\"<\/span>\n\n    <span class=\"s\">\"github.com\/volatiletech\/sqlboiler\/v4\/boil\"<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">bookRepositoryImpl<\/span> <span class=\"k\">struct<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">db<\/span> <span class=\"o\">*<\/span><span class=\"n\">sql<\/span><span class=\"o\">.<\/span><span class=\"n\">DB<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">NewBookRepositoryImpl<\/span><span class=\"p\">(<\/span><span class=\"n\">db<\/span> <span class=\"o\">*<\/span><span class=\"n\">sql<\/span><span class=\"o\">.<\/span><span class=\"n\">DB<\/span><span class=\"p\">)<\/span> <span class=\"n\">repository<\/span><span class=\"o\">.<\/span><span class=\"n\">BookRepository<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">bookRepositoryImpl<\/span><span class=\"p\">{<\/span><span class=\"n\">db<\/span><span class=\"o\">:<\/span> <span class=\"n\">db<\/span><span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"p\">(<\/span><span class=\"n\">br<\/span> <span class=\"o\">*<\/span><span class=\"n\">bookRepositoryImpl<\/span><span class=\"p\">)<\/span> <span class=\"n\">Save<\/span><span class=\"p\">(<\/span><span class=\"n\">book<\/span> <span class=\"o\">*<\/span><span class=\"n\">entity<\/span><span class=\"o\">.<\/span><span class=\"n\">Book<\/span><span class=\"p\">)<\/span> <span class=\"kt\">error<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">bookModel<\/span> <span class=\"o\">:=<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">sqlboiler<\/span><span class=\"o\">.<\/span><span class=\"n\">Book<\/span><span class=\"p\">{<\/span>\n        <span class=\"n\">ID<\/span><span class=\"o\">:<\/span>   <span class=\"n\">book<\/span><span class=\"o\">.<\/span><span class=\"n\">Id<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">Name<\/span><span class=\"o\">:<\/span> <span class=\"n\">book<\/span><span class=\"o\">.<\/span><span class=\"n\">Name<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">bookModel<\/span><span class=\"o\">.<\/span><span class=\"n\">Insert<\/span><span class=\"p\">(<\/span><span class=\"n\">context<\/span><span class=\"o\">.<\/span><span class=\"n\">Background<\/span><span class=\"p\">(),<\/span> <span class=\"n\">br<\/span><span class=\"o\">.<\/span><span class=\"n\">db<\/span><span class=\"p\">,<\/span> <span class=\"n\">boil<\/span><span class=\"o\">.<\/span><span class=\"n\">Infer<\/span><span class=\"p\">())<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">err<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"k\">return<\/span> <span class=\"no\">nil<\/span>\n<span class=\"p\">}<\/span>\n\n<\/code><\/pre>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"interfacehandlerbookgo\"><\/span>\n<p>  \/interface\/handler\/book.go<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0631\u0627\u06cc API\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u0632\u06cc\u0631 \/book \u062f\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u0645\u06cc \u0634\u0648\u0646\u062f\u060c \u062f\u0631 \u0627\u06cc\u0646 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u062e\u0648\u0627\u0647\u0646\u062f \u0634\u062f.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight go\"><code><span class=\"k\">package<\/span> <span class=\"n\">handler<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">(<\/span>\n    <span class=\"s\">\"main\/domain\/entity\"<\/span>\n    <span class=\"s\">\"main\/usecase\"<\/span>\n    <span class=\"s\">\"net\/http\"<\/span>\n\n    <span class=\"s\">\"github.com\/labstack\/echo\/v4\"<\/span>\n<span class=\"p\">)<\/span>\n\n<span class=\"k\">type<\/span> <span class=\"n\">BookHandler<\/span> <span class=\"k\">struct<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">bookUsecase<\/span> <span class=\"n\">usecase<\/span><span class=\"o\">.<\/span><span class=\"n\">BookUsecase<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"p\">(<\/span><span class=\"n\">bh<\/span> <span class=\"o\">*<\/span><span class=\"n\">BookHandler<\/span><span class=\"p\">)<\/span> <span class=\"n\">RegisterRoutes<\/span><span class=\"p\">(<\/span><span class=\"n\">e<\/span> <span class=\"o\">*<\/span><span class=\"n\">echo<\/span><span class=\"o\">.<\/span><span class=\"n\">Echo<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">e<\/span><span class=\"o\">.<\/span><span class=\"n\">POST<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\/book\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">bh<\/span><span class=\"o\">.<\/span><span class=\"n\">SaveBook<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"n\">NewBookHandler<\/span><span class=\"p\">(<\/span><span class=\"n\">bu<\/span> <span class=\"n\">usecase<\/span><span class=\"o\">.<\/span><span class=\"n\">BookUsecase<\/span><span class=\"p\">)<\/span> <span class=\"o\">*<\/span><span class=\"n\">BookHandler<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">BookHandler<\/span><span class=\"p\">{<\/span><span class=\"n\">bookUsecase<\/span><span class=\"o\">:<\/span> <span class=\"n\">bu<\/span><span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">func<\/span> <span class=\"p\">(<\/span><span class=\"n\">bh<\/span> <span class=\"o\">*<\/span><span class=\"n\">BookHandler<\/span><span class=\"p\">)<\/span> <span class=\"n\">SaveBook<\/span><span class=\"p\">(<\/span><span class=\"n\">c<\/span> <span class=\"n\">echo<\/span><span class=\"o\">.<\/span><span class=\"n\">Context<\/span><span class=\"p\">)<\/span> <span class=\"kt\">error<\/span> <span class=\"p\">{<\/span>\n\n    <span class=\"n\">book<\/span> <span class=\"o\">:=<\/span> <span class=\"nb\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">entity<\/span><span class=\"o\">.<\/span><span class=\"n\">Book<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">c<\/span><span class=\"o\">.<\/span><span class=\"n\">Bind<\/span><span class=\"p\">(<\/span><span class=\"n\">book<\/span><span class=\"p\">);<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">c<\/span><span class=\"o\">.<\/span><span class=\"n\">JSON<\/span><span class=\"p\">(<\/span><span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"n\">StatusBadRequest<\/span><span class=\"p\">,<\/span> <span class=\"k\">map<\/span><span class=\"p\">[<\/span><span class=\"kt\">string<\/span><span class=\"p\">]<\/span><span class=\"kt\">string<\/span><span class=\"p\">{<\/span><span class=\"s\">\"error\"<\/span><span class=\"o\">:<\/span> <span class=\"s\">\"invalid request\"<\/span><span class=\"p\">})<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">err<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">bh<\/span><span class=\"o\">.<\/span><span class=\"n\">bookUsecase<\/span><span class=\"o\">.<\/span><span class=\"n\">Save<\/span><span class=\"p\">(<\/span><span class=\"n\">book<\/span><span class=\"p\">);<\/span> <span class=\"n\">err<\/span> <span class=\"o\">!=<\/span> <span class=\"no\">nil<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">c<\/span><span class=\"o\">.<\/span><span class=\"n\">JSON<\/span><span class=\"p\">(<\/span><span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"n\">StatusInternalServerError<\/span><span class=\"p\">,<\/span> <span class=\"k\">map<\/span><span class=\"p\">[<\/span><span class=\"kt\">string<\/span><span class=\"p\">]<\/span><span class=\"kt\">string<\/span><span class=\"p\">{<\/span><span class=\"s\">\"error\"<\/span><span class=\"o\">:<\/span> <span class=\"n\">err<\/span><span class=\"o\">.<\/span><span class=\"n\">Error<\/span><span class=\"p\">()})<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"k\">return<\/span> <span class=\"n\">c<\/span><span class=\"o\">.<\/span><span class=\"n\">JSON<\/span><span class=\"p\">(<\/span><span class=\"n\">http<\/span><span class=\"o\">.<\/span><span class=\"n\">StatusOK<\/span><span class=\"p\">,<\/span> <span class=\"n\">book<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n\n<\/code><\/pre>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"interfacehandlerroutergo\"><\/span>\n<p>  \/interface\/handler\/router.go<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0645\u0646 router.go \u0631\u0627 \u0628\u0627 \u0627\u0646\u062a\u0638\u0627\u0631 \u0627\u06cc\u062c\u0627\u062f \u0686\u0646\u062f\u06cc\u0646 API \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u0645.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>package handler\n\nimport (\n    \"github.com\/labstack\/echo\/v4\"\n)\n\nfunc RegisterRoutes(e *echo.Echo, bookHandler *BookHandler) {\n    bookHandler.RegisterRoutes(e)\n}\n\nfunc NewEchoInstance(bookHandler *BookHandler) *echo.Echo {\n    e := echo.New()\n    RegisterRoutes(e, bookHandler)\n    return e\n}\n\n<\/code><\/pre>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"5_wirego_%D8%B1%D8%A7_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  5. wire.go \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u0646 wire.go \u0631\u0627 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0634\u062f\u0647 \u0628\u0627 \u062a\u0632\u0631\u06cc\u0642 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u0645. \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 router.go \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u062f <code>e<\/code>\u060c \u0627\u06cc\u0646 \u0642\u0633\u0645\u062a \u0646\u06cc\u0632 \u062f\u0631 wire.go \u0642\u0631\u0627\u0631 \u062e\u0648\u0627\u0647\u062f \u06af\u0631\u0641\u062a.<br \/>\n\u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f <code>\/\/go:build wireinject<\/code> \u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0641\u0627\u06cc\u0644 \u0641\u0642\u0637 \u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u062a\u0648\u0644\u06cc\u062f \u06a9\u062f \u0628\u0627 Wire \u06af\u0646\u062c\u0627\u0646\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a \u0648 \u0627\u0632 \u0633\u0627\u062e\u062a \u0646\u0647\u0627\u06cc\u06cc \u062d\u0630\u0641 \u0645\u06cc \u0634\u0648\u062f.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\/\/go:build wireinject\n\npackage wire\n\nimport (\n    \"main\/infrastructure\/repositoryImpl\"\n    \"main\/interface\/handler\"\n    \"main\/mysql\"\n    \"main\/usecase\"\n\n    \"github.com\/google\/wire\"\n    \"github.com\/labstack\/echo\/v4\"\n)\n\nfunc InitializeEcho() (*echo.Echo, error) {\n    wire.Build(\n        mysql.NewDB,\n        repositoryImpl.NewBookRepositoryImpl,\n        usecase.NewBookUsecaseImpl,\n        handler.NewBookHandler,\n        handler.NewEchoInstance,\n    )\n    return nil, nil\n}\n\n<\/code><\/pre>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"6_wire_gengo_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  6. wire_gen.go \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>wire_gen.go \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0628\u0647 \u0635\u0648\u0631\u062a \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0645\u0634\u062e\u0635 \u0634\u062f\u0647 \u062f\u0631 wire.go \u0627\u0633\u062a.<\/p>\n<p>\u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f <code>wire<\/code> \u062f\u0631 <code>\/wire<\/code>.<\/p>\n<p><code>wire.go<\/code>  \u0628\u0647 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u062a\u0648\u0644\u06cc\u062f \u062e\u0648\u0627\u0647\u062f \u0634\u062f.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\/\/ Code generated by Wire. DO NOT EDIT.\n\n\/\/go:generate go run -mod=mod github.com\/google\/wire\/cmd\/wire\n\/\/go:build !wireinject\n\/\/ +build !wireinject\n\npackage wire\n\nimport (\n    \"github.com\/labstack\/echo\/v4\"\n    \"main\/infrastructure\/repositoryImpl\"\n    \"main\/interface\/handler\"\n    \"main\/mysql\"\n    \"main\/usecase\"\n)\n\n\/\/ Injectors from wire.go:\n\nfunc InitializeEcho() (*echo.Echo, error) {\n    db, err := mysql.NewDB()\n    if err != nil {\n        return nil, err\n    }\n    bookRepository := repositoryImpl.NewBookRepositoryImpl(db)\n    bookUsecase := usecase.NewBookUsecaseImpl(bookRepository)\n    bookHandler := handler.NewBookHandler(bookUsecase)\n    echoEcho := handler.NewEchoInstance(bookHandler)\n    return echoEcho, nil\n}\n\n<\/code><\/pre>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"7_%D8%AA%D8%A7%DB%8C%DB%8C%D8%AF\"><\/span>\n<p>  7. \u062a\u0627\u06cc\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u067e\u0633 \u0627\u0632 \u0627\u0631\u0633\u0627\u0644 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0632 \u0637\u0631\u06cc\u0642 API\u060c \u062a\u0648\u0627\u0646\u0633\u062a\u0645 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u0645 \u06a9\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1loecziud58mz07tlepc.png\" alt=\"\u062f\u0633\u06cc \u0628\u06cc\" width=\"645\" height=\"406\" title=\"\"><\/p>\n<h2><span class=\"ez-toc-section\" id=\"8_%D8%AF%D8%B1_%D9%86%D8%AA%DB%8C%D8%AC%D9%87\"><\/span>\n<p>  8. \u062f\u0631 \u0646\u062a\u06cc\u062c\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u0645\u0646\u0648\u0646 \u06a9\u0647 \u062e\u0648\u0627\u0646\u062f\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u067e\u0633\u062a\u060c \u0645\u0646 \u06cc\u06a9 API \u0633\u0627\u062f\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Wire \u0648 SQLBoiler \u062f\u0631 \u06cc\u06a9 \u0645\u0639\u0645\u0627\u0631\u06cc \u0644\u0627\u06cc\u0647 \u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0645. \u0645\u0646 \u0647\u0645\u0686\u0646\u06cc\u0646 \u06cc\u0627\u062f \u06af\u0631\u0641\u062a\u0645 \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 Wire \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627 \u0631\u0627 \u0633\u0627\u062f\u0647 \u062a\u0631 \u06a9\u0646\u062f\u060c \u062d\u062a\u06cc \u0627\u06af\u0631 \u067e\u06cc\u0686\u06cc\u062f\u0647 \u062a\u0631 \u0634\u0648\u0646\u062f. \u0627\u06af\u0631 \u0645\u062a\u0648\u062c\u0647 \u0627\u0634\u062a\u0628\u0627\u0647\u06cc \u0634\u062f\u06cc\u062f\u060c \u0644\u0637\u0641\u0627\u064b \u0628\u0647 \u0645\u0646 \u0627\u0637\u0644\u0627\u0639 \u062f\u0647\u06cc\u062f.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang 0. \u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u0645\u0646 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0631\u0627 \u062f\u0631 \u062d\u0627\u0644\u06cc \u0646\u0648\u0634\u062a\u0645 \u06a9\u0647 \u0645\u0639\u0645\u0627\u0631\u06cc \u0644\u0627\u06cc\u0647\u200c\u0627\u06cc \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0631\u062f\u0645 \u0648 \u062f\u0631 \u0639\u06cc\u0646 \u062d\u0627\u0644 \u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0631\u0627 \u06cc\u0627\u062f \u06af\u0631\u0641\u062a\u0645 Wire. \u0642\u0628\u0644 \u0627\u0632 \u0627\u06cc\u0646 \u06a9\u0627\u0631\u060c \u0641\u0627\u06cc\u0644 Docker Compose \u0628\u0627 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 Go backend\u060c MySQL \u0648 Adminer \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c &hellip;<\/p>\n","protected":false},"author":2,"featured_media":73907,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-73906","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/73906","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=73906"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/73906\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/73907"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=73906"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=73906"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=73906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}