대머리개발자

고랭(goLand) 작업하기 본문

개발이야기

고랭(goLand) 작업하기

대머리개발자 2025. 12. 10. 16:09

 

생각보다 보일러 플레이트가 많으다.

반복적인 작업들을 공통으로 묶어 주는게 개발자의 몫이겠지..

 

context 에서 사용자의 id를 가져오는 로직을 만들라고 보니깐...하악하악. 

기본적으로 Go는 상속은 없다고 한다.

결국 (is-a) 관계가 아니라 (has-a) 관계로 풀면 되것다.

 

base_handler.go

package handler

import (
	"net/http"
	"user-community/internal/middleware" 
	"github.com/gin-gonic/gin"
)

// BaseHandler : 모든 핸들러의 부모 역할 (껍데기 구조체)
type BaseHandler struct{}

func (h *BaseHandler) UserIDOrAbort(c *gin.Context) (string, bool) {
	uid, exists := middleware.GetUserID(c)
	if !exists || uid == "" {
		// 공통 에러 응답 처리
		c.JSON(http.StatusUnauthorized, gin.H{"error": "로그인이 필요합니다."})
		c.Abort() // 더 이상 진행하지 않음
		return "", false
	}
	return uid, true
}

 

필요한 핸들러에 BaseHandler를 가진다!

type BoardHandler struct {
	BaseHandler  
	boardService   *service.BoardService
	historyService *service.HistoryService
}

func NewBoardHandler(s *service.BoardService, hs *service.HistoryService) *BoardHandler {
	return &BoardHandler{
		BaseHandler:    BaseHandler{},
		boardService: s, 
		historyService: hs,
	}
}

 

 

그럼 이제...사용자 정보가 없는 경우 야무지게 재활용할 수 있다!.

 

 

아.. 트랜젝션... ㅅㅂ @Transactional ...그립다.