{"id":22441461,"url":"https://github.com/mastprogs/go_server_framework","last_synced_at":"2025-03-27T10:15:15.809Z","repository":{"id":257756019,"uuid":"859110984","full_name":"MastProgs/go_server_framework","owner":"MastProgs","description":"파이썬 fast api 가 느린 부분이 있어서 만든, go 웹 서버 프레임워크","archived":false,"fork":false,"pushed_at":"2025-03-26T02:55:17.000Z","size":103,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-26T03:31:02.225Z","etag":null,"topics":["go","golang","server"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MastProgs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-18T05:25:32.000Z","updated_at":"2025-03-26T02:55:20.000Z","dependencies_parsed_at":null,"dependency_job_id":"c22616d2-3409-43b1-a5f0-6b35254027c2","html_url":"https://github.com/MastProgs/go_server_framework","commit_stats":null,"previous_names":["mastprogs/go_server_framework"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MastProgs%2Fgo_server_framework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MastProgs%2Fgo_server_framework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MastProgs%2Fgo_server_framework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MastProgs%2Fgo_server_framework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MastProgs","download_url":"https://codeload.github.com/MastProgs/go_server_framework/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245823316,"owners_count":20678173,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","golang","server"],"created_at":"2024-12-06T02:14:37.392Z","updated_at":"2025-03-27T10:15:15.802Z","avatar_url":"https://github.com/MastProgs.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Go 서버 프레임워크\n\n이 프레임워크는 Go 언어를 사용하여 빠르고 안정적인 웹 서버를 구축하기 위한 도구입니다. \n표준 라이브러리와 몇 가지 검증된 외부 패키지를 기반으로 성능과 확장성을 최적화했습니다.\n\n## 목차\n\n- [주요 기능](#주요-기능)\n- [시작하기](#시작하기)\n- [로깅 시스템](#로깅-시스템)\n  - [로거 초기화](#로거-초기화)\n  - [로그 레벨](#로그-레벨)\n  - [로그 포맷](#로그-포맷)\n  - [로그 대상](#로그-대상)\n  - [소스 위치 정보](#소스-위치-정보)\n  - [비동기 로깅](#비동기-로깅)\n  - [예제](#로깅-예제)\n- [라우터 시스템](#라우터-시스템)\n  - [라우터 초기화](#라우터-초기화)\n  - [엔드포인트 등록](#엔드포인트-등록)\n  - [미들웨어](#미들웨어)\n  - [요청 처리](#요청-처리)\n  - [응답 작성](#응답-작성)\n  - [예제](#라우터-예제)\n- [서버설정 시스템](#서버설정-시스템)\n- [에러 처리](#에러-처리)\n- [프로젝트 구조](#프로젝트-구조)\n- [기여 가이드](#기여-가이드)\n- [라이센스](#라이센스)\n\n## 주요 기능\n\n- **고성능 라우터**: 빠른 URL 라우팅과 요청 처리\n- **로깅 시스템**: 구조화된 로깅, 다양한 출력 옵션, 비동기 처리 지원\n- **미들웨어 지원**: 인증, 로깅, 요청/응답 변환을 위한 미들웨어 체인\n- **서버설정 관리**: TOML 기반 구성 파일 시스템\n- **에러 처리**: 일관된 에러 처리 및 사용자 정의 가능한 에러 응답\n- **보안 기능**: CORS, CSRF 방지, 입력 검증 지원\n\n## 시작하기\n\n### 기본 서버 실행\n\n```go\npackage services\n\nimport (\n\t\"go_server_framework/loghandle\"\n\t\"go_server_framework/router\"\n\t\"go_server_framework/services/test\"\n)\n\n// RegisterAllServices는 모든 서비스를 등록합니다\nfunc RegisterAllServices(manager *router.RouterManager) {\n\t// 테스트 서비스 등록\n\ttest.RegisterRoutes(manager)\n\tloghandle.Info(\"테스트 서비스 등록 완료\")\n\n\t// 여기에 추가 서비스 등록\n\t// 예: user.RegisterRoutes(manager)\n\t// 예: blog.RegisterRoutes(manager)\n\t// 예: shop.RegisterRoutes(manager)\n}\n\n```\n\n## 로깅 시스템\n\n로깅 시스템은 `loghandle` 패키지를 통해 제공됩니다. 이 시스템은 Go의 표준 `log/slog` 패키지를 기반으로 하며, 확장 기능을 추가했습니다.\n\n### 로거 초기화\n\n로거는 다음과 같은 방법으로 초기화할 수 있습니다:\n\n```go\n// 기본 설정으로 초기화\nlogger := loghandle.GetLogger()\n\n// 커스텀 설정으로 초기화\nlogConfig := loghandle.LogConfig{\n    Level:     loghandle.LevelInfo,    // 로그 레벨\n    Format:    loghandle.FormatJSON,   // 출력 형식\n    Output:    int(loghandle.OutputConsole) | int(loghandle.OutputFile), // 출력 대상\n    AddSource: true,                   // 소스 코드 위치 정보 추가\n    FileConfig: \u0026loghandle.FileLogConfig{\n        Filename:   \"logs/app.log\",    // 로그 파일 경로\n        MaxSize:    10,                // 최대 파일 크기 (MB)\n        MaxBackups: 5,                 // 보관할 백업 파일 수\n        MaxAge:     30,                // 보관 기간 (일)\n        Compress:   true,              // 로그 파일 압축 여부\n    },\n}\nlogger := loghandle.InitLogger(logConfig)\n```\n\n### 로그 레벨\n\n로그 레벨은 다음 네 가지를 지원합니다:\n\n- `LevelDebug`: 디버그 정보 (개발 중 상세한 정보)\n- `LevelInfo`: 일반 정보 (정상적인 애플리케이션 이벤트)\n- `LevelWarn`: 경고 (잠재적 문제)\n- `LevelError`: 오류 (실패한 작업)\n\n### 로그 포맷\n\n두 가지 로그 형식을 지원합니다:\n\n- `FormatText`: 사람이 읽기 쉬운 텍스트 형식\n- `FormatJSON`: 기계가 파싱하기 쉬운 JSON 형식 (로그 수집 시스템과 통합에 적합)\n\n### 로그 대상\n\n로그는 다음 대상으로 출력할 수 있습니다:\n\n- `OutputConsole`: 표준 출력 (콘솔)\n- `OutputFile`: 파일 (순환 로깅 지원)\n\n비트 OR 연산자를 사용하여 여러 대상을 결합할 수 있습니다:\n```go\nOutput: int(loghandle.OutputConsole) | int(loghandle.OutputFile)\n```\n\n### 소스 위치 정보\n\n`AddSource` 옵션을 `true`로 설정하면 로그 항목에 소스 파일 및 행 번호가 포함됩니다:\n\n```json\n{\"level\":\"INFO\",\"msg\":\"라우터 초기화 완료\",\"source\":\"init/router:28\",\"timestamp\":\"2025-03-18T03:56:52.3621425+09:00\"}\n```\n\n### 비동기 로깅\n\n성능이 중요한 애플리케이션의 경우 비동기 로깅을 활성화할 수 있습니다:\n\n```go\n// 기본 로거 초기화 후 비동기 모드 활성화\nloghandle.InitLogger(logConfig)\nloghandle.GetLogger().EnableAsync(1000) // 버퍼 크기 1000\n\n// 또는 한 번에 비동기 로거 초기화\nlogger := loghandle.InitLoggerWithAsync(logConfig, 1000)\n```\n\n비동기 로깅의 장점:\n- 로깅 작업이 메인 스레드를 차단하지 않음\n- 성능 향상, 특히 I/O 바인딩 작업에서\n\n주의사항:\n- 로그 메시지가 즉시 기록되지 않을 수 있음\n- 버퍼가 꽉 차면 새 로그 메시지가 동기적으로 처리됨\n\n비고:\n- 비동기여도 로깅 첫 함수 호출 시점으로 timestamp 가 작성됨\n- 시각이 기록된 이후, 로깅 큐에 추가되는 형태\n\n애플리케이션을 종료하기 전에 비동기 로거를 비활성화하는 것이 좋습니다:\n```go\nloghandle.GetLogger().DisableAsync()\n```\n\n### 로깅 예제\n\n네 가지 로그 레벨 사용 방법:\n\n```go\n// 패키지 레벨 함수 사용\nloghandle.Debug(\"디버그 메시지: %s\", \"상세 정보\")\nloghandle.Info(\"정보 메시지: %s\", \"일반 정보\")\nloghandle.Warn(\"경고 메시지: %s\", \"잠재적 문제\")\nloghandle.Error(\"오류 메시지: %s\", \"실패 내용\")\n\n// 또는 로거 인스턴스 직접 사용\nlogger := loghandle.GetLogger()\nlogger.Debug(\"디버그 메시지\")\nlogger.Info(\"정보 메시지\")\nlogger.Warn(\"경고 메시지\")\nlogger.Error(\"오류 메시지\")\n\n// 구조화된 로깅\nloghandle.Info(\"사용자 로그인\", \n    \"user_id\", 12345, \n    \"ip\", \"192.168.1.1\", \n    \"status\", \"success\")\n```\n\n로그 출력 예시 (JSON 형식):\n```json\n{\"level\":\"INFO\",\"msg\":\"서버 시작됨\",\"source\":\"main:25\",\"timestamp\":\"2025-03-18T03:56:52.3621425+09:00\"}\n{\"level\":\"INFO\",\"msg\":\"사용자 로그인\",\"user_id\":12345,\"ip\":\"192.168.1.1\",\"status\":\"success\",\"source\":\"auth/handler:42\",\"timestamp\":\"2025-03-18T03:56:55.1234567+09:00\"}\n```\n\n## 라우터 시스템\n\n라우터 시스템은 HTTP 요청을 처리하기 위한 경량 프레임워크를 제공합니다.\n\n### 라우터 초기화\n\n```go\n// 기본 라우터 생성\nr := router.NewRouter()\n\n// 또는 맞춤 설정으로 생성\nr := router.NewRouterWithConfig(router.RouterConfig{\n    TrustedProxies: []string{\"127.0.0.1\"},\n    MaxRequestSize: 1024 * 1024 * 10, // 10MB\n})\n```\n\n### 응답 작성\n\n다양한 형식으로 응답을 보낼 수 있습니다:\n\n```go\n// JSON 응답\nc.JSON(200, map[string]interface{}{\n    \"id\": 1,\n    \"name\": \"홍길동\",\n})\n\n// XML 응답\nc.XML(200, someXMLStruct)\n\n// HTML 응답\nc.HTML(200, \"\u003ch1\u003e안녕하세요\u003c/h1\u003e\")\n\n// 텍스트 응답\nc.String(200, \"요청 처리 완료\")\n\n// 리다이렉트\nc.Redirect(302, \"/new-location\")\n\n// 파일 전송\nc.File(\"/path/to/file.pdf\")\n\n// 헤더 설정\nc.SetHeader(\"Content-Type\", \"application/json\")\n```\n\n### 라우터 예제\n\n`services/test/router.go` 파일을 참고하여주세요.\n\n## 서버설정 시스템\n\nTOML 기반 구성 파일을 사용하여 애플리케이션 설정을 관리합니다:\n\n```toml\n# config.toml\n[server]\nport = 8080\nhost = \"0.0.0.0\"\n```\n\nGo 코드에서 설정 읽기:\n\n```go\nconfig, err := config.LoadConfig(\"config.toml\")\nif err != nil {\n    loghandle.Error(\"설정 파일 로드 실패\", \"error\", err.Error())\n    return\n}\n\n// 설정 사용\nport := config.GetInt(\"server.port\")\n```\n\n\n## 프로젝트 구조\n\n```\ngo_server_framework/\n├── config/           # 설정 관리\n│   ├── config.go     # 설정 로드/파싱\n│   └── config.toml   # 기본 설정 파일\n├── database/         # 데이터베이스 관리\n├── loghandle/        # 로깅 시스템\n│   └── log.go        # 로그 핸들러\n├── router/           # 라우팅 시스템\n│   ├── context.go    # 요청/응답 컨텍스트\n│   ├── middleware.go # 미들웨어 컬렉션\n│   └── router.go     # 라우터 구현\n├── utils/            # 유틸리티 함수\n├── examples/         # 사용 예제\n├── go.mod            # Go 모듈 정의\n├── go.sum            # 의존성 체크섬\n├── main.go           # 애플리케이션 진입점\n└── README.md         # 프로젝트 문서\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmastprogs%2Fgo_server_framework","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmastprogs%2Fgo_server_framework","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmastprogs%2Fgo_server_framework/lists"}