무지개곰
article thumbnail
반응형

1. 목차

  1. controller - service - repository 란?
  2. 폴더
  3. 참고 자료

2. controller - service - repository 란?

소프트웨어 디자인 패턴 중 하나로 계층 구조를 활용하여 각 계층이 특정 역할을 수행하도록 구조화하는 방식

2.1. controller

사용자의 입력을 받아 해당하는 서비스 메서드를 호출

2.2. service

비즈니스 로직을 처리하고 데이터의 가공 및 처리를 담당

2.3. repository

데이터베이스나 외부의 데이터에 접근하여 CRUD 연산을 담당

  • 장점
    • 코드의 재사용성이 높아진다.
    • 작업이 분리되어 있기에 유지보수가 쉽다. (ex. DB문제면 repository를 확인, 로직 문제면 service를 확인)
    • 테스트하기 쉽다. (작업 단위로 메서드를 만들었기에 각 메서드를 테스트할 수 있다.)
    • 코드가 깔끔하다.
  • 단점
    • 아직 익숙하지 않아 작업이 오래 걸린다.

3. 폴더

3.1. handler

사용자의 요청을 처리한 후 뷰에 모델 객체를 넘겨주는 역할

<code />
// users handler func (u *UsersHandler)RegisterHandlers(r *mux.Router) { r.HandleFunc("/info", u.User.GetInfo).Methods("GET") r.HandleFunc("/profiles/{id}/personaldatas", u.Profile.GetUserProfile).Methods("GET") r.HandleFunc("/profiles/{id}/personaldatas", u.ProfilesMiddleware.CheckAccess(u.Profile.UpdateUserProfile)).Methods("PUT") r.HandleFunc("/profiles/techlist",u.Techs.GetTechList).Methods("GET") r.HandleFunc("/profiles/{id}/techs", u.Techs.GetUserTechList).Methods("GET") r.HandleFunc("/profiles/{id}/techs", u.ProfilesMiddleware.CheckAccess(u.Techs.UpdateUserTechList)).Methods("PUT") }

요청의 경로에 따라 실행할 service의 메서드를 구별하여 실행
필요시 미들웨어를 사용하여 접근 권한 등을 확인

3.2. service

controller에 의하여 호출되고 사용자의 요구사항을 처리하는 역할

<code />
// service - profile 정보 제공 func (p *Profile)GetUserProfile(res http.ResponseWriter, req *http.Request) { vars := mux.Vars(req) id := vars["id"] tx, err := mysql.DB.Begin() if err != nil { log.Println("service/profiles.go : DB Begin 오류", err) tx.Rollback() http.Error(res, "Internal Server Error", http.StatusInternalServerError) return }

요청에 대하여 server에서 처리할 작업을 실행하며 DB가 필요한 경우 tx를 생성하여 repository 메서드에 tx를 전달

3.3. repository

service에 의하여 호출되고 DB의 CRUD 작업

<code />
// repository - profile 테이블에 user id와 profile id를 Insert func (p *ProfileRepository)Create(tx *sql.Tx, id string) (string, error) { query := "INSERT INTO profile(id, user_info_User_id) VALUE(?, ?)" _, err := tx.Exec(query, id, id) if err != nil { return "", err } return id, nil }

각 메서드가 실행시킬 query문을 가지고 있고 결과를 반환하도록 설계

3.4. DTO (Data Transfer Object)

데이터를 전송하기 위한 객체

<code />
package dto type Personaldata struct { Id string `json:"id"` Nickname string `json:"nickname"` One_line_introduce string `json:"oneLineIntroduce,omitempty"` Hashtag []string `json:"hashtag,omitempty"` }

client에 전달할 정보에 대한 자료 구조와 json 변환에 대한 key 정의


4. 참고 자료

반응형
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!