diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 00000000..d7b078a4
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,30 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: "[BUG]"
+labels: ''
+assignees: ''
+
+---
+
+### Issue 타입(하나 이상의 Issue 타입을 선택해주세요)
+□ 기능 추가
+□ 기능 삭제
+☑ 버그 리포트
+□ 버그 수정
+□ 의존성, 환경 변수, 빌드 관련 코드 업데이트
+
+### 상세 내용
+#### 어떤 버그인가요?
+> 어떤 버그인지 간결하게 설명해주세요
+
+#### 어떤 상황에서 발생한 버그인가요?
+> (가능하면) Given-When-Then 형식으로 서술해주세요
+
+#### 예상 결과
+> 예상했던 정상적인 결과가 어떤 것이었는지 설명해주세요
+
+### 라벨
+- 예상 소요 시간: `E: 1h`
+- 그룹: `client`, `server`
+- 긴급도: `High`, `Middle`, `Low`
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 00000000..3ed523c0
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,35 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+### Issue 타입(하나 이상의 Issue 타입을 선택해주세요)
+☑ 기능 추가
+□ 기능 삭제
+□ 버그 리포트
+□ 버그 수정
+□ 의존성, 환경 변수, 빌드 관련 코드 업데이트
+
+### 상세 내용
+#### 어떤 기능인가요?
+> 추가하려는 기능에 대해 간결하게 설명해주세요
+
+#### 작업 상세 내용
+- [ ] TO DO
+
+### 예상 소요 시간
+-[] `0.5h`
+-[] `1h`
+-[] `1.5h`
+-[] `2h`
+-[] `2.5h`
+-[] `3h`
+
+### 라벨
+- 예상 소요 시간: `E: 1h`
+- 그룹: `client`, `server`
+- 긴급도: `High`, `Middle`, `Low`
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 00000000..377295fb
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,34 @@
+### PR 타입(하나 이상의 PR 타입을 선택해주세요)
+☑ 기능 추가
+
+□ 기능 삭제
+
+□ 버그 수정
+
+□ 의존성, 환경 변수, 빌드 관련 코드 업데이트
+
+
+
+### 반영 브랜치
+ex) feat/login -> dev
+
+
+
+### 변경 사항
+ex) 로그인 시, 구글 소셜 로그인 기능을 추가했습니다.
+
+
+
+### 테스트 결과
+ex) 베이스 브랜치에 포함되기 위한 코드는 모두 정상적으로 동작해야 합니다. 결과물에 대한 스크린샷, GIF, 혹은 라이브 데모가 가능하도록 샘플API를 첨부할 수도 있습니다.
+
+
+
+### 연관된 이슈
+ex) #이슈번호, #이슈번호
+
+
+
+### 리뷰 요구사항(선택)
+> 리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요
+> ex) 메서드 XXX의 이름을 더 잘 짓고 싶은데 혹시 좋은 명칭이 있을까요?
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 00000000..470bbfb1
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,78 @@
+name: Build and Deploy to EC2
+
+on:
+ push:
+ branches: [ "production" ]
+# pull_request:
+# branches: [ "production" ]
+
+env:
+ AWS_REGION: ap-northeast-2
+ AWS_S3_BUCKET: gitget-deploy-bucket2
+ AWS_CODE_DEPLOY_APPLICATION: GitGet-Application
+ AWS_CODE_DEPLOY_GROUP: GitGet-Deployment-Group
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ token: ${{ secrets.ACTIONS_TOKEN }}
+ submodules: true
+
+ - name: make application.yml
+ run: |
+ mkdir -p src/main/resources
+ cp GitGet-BACK-SECRET/main/resources/application.yml src/main/resources/
+ cp GitGet-BACK-SECRET/main/resources/application-prod.yml src/main/resources/
+ cp GitGet-BACK-SECRET/main/resources/application-common.yml src/main/resources/
+
+ mkdir -p src/test/resources
+ cp GitGet-BACK-SECRET/test/resources/application.yml src/test/resources/
+ cp GitGet-BACK-SECRET/test/resources/application-test.yml src/test/resources/
+
+ echo "Main resources contents:"
+ ls -la src/main/resources/
+ echo "Test resources contents:"
+ ls -la src/test/resources/
+
+ - name: Grant execute permission for gradlew
+ run: chmod +x ./gradlew
+ shell: bash
+
+ - name: Build with Gradle and Test
+ run: ./gradlew build test
+
+ - name: Make zip file
+ run: zip -r ./$GITHUB_SHA.zip .
+ shell: bash
+
+ - name: AWS credential 설정
+ uses: aws-actions/configure-aws-credentials@v1
+ with:
+ aws-region: ${{ env.AWS_REGION }}
+ aws-access-key-id: ${{ secrets.CICD_ACCESS_KEY }}
+ aws-secret-access-key: ${{ secrets.CICD_SECRET_KEY }}
+
+
+ - name: Upload to S3
+ run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$AWS_S3_BUCKET/$GITHUB_SHA.zip
+
+ - name: EC2에 배포
+ run: aws deploy create-deployment --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name ${{ env.AWS_CODE_DEPLOY_GROUP }} --s3-location bucket=$AWS_S3_BUCKET,key=$GITHUB_SHA.zip,bundleType=zip
+
+ - name: action-slack (Slack notification after deploy)
+ uses: 8398a7/action-slack@v3
+ with:
+ status: ${{ job.status }}
+ author_name: Backend
+ fields: repo,commit,message,author
+ mention: here
+ if_mention: failure,cancelled
+ env:
+ SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
+ if: always()
\ No newline at end of file
diff --git a/.github/workflows/prTest.yml b/.github/workflows/prTest.yml
new file mode 100644
index 00000000..6f8cf990
--- /dev/null
+++ b/.github/workflows/prTest.yml
@@ -0,0 +1,47 @@
+name: Run gradlew clean test when PR
+
+on:
+ pull_request:
+ branches: [ "main", "production" ]
+
+jobs:
+ PRTest:
+ runs-on: ubuntu-latest
+ permissions: write-all
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ token: ${{ secrets.ACTIONS_TOKEN }}
+ submodules: true
+
+ - name: make application.yml
+ run: |
+ mkdir -p src/main/resources
+ cp GitGet-BACK-SECRET/main/resources/application.yml src/main/resources/
+ cp GitGet-BACK-SECRET/main/resources/application-prod.yml src/main/resources/
+ cp GitGet-BACK-SECRET/main/resources/application-common.yml src/main/resources/
+
+ mkdir -p src/test/resources
+ cp GitGet-BACK-SECRET/test/resources/application.yml src/test/resources/
+ cp GitGet-BACK-SECRET/test/resources/application-test.yml src/test/resources/
+
+ echo "Main resources contents:"
+ ls -la src/main/resources/
+ echo "Test resources contents:"
+ ls -la src/test/resources/
+
+
+ - name: Grant execute permission for gradlew
+ run: chmod +x ./gradlew
+ shell: bash
+
+ - name: Build and Test
+ run: ./gradlew clean test
+
+ # Test 후 Report 생성
+ - name: Publish Test Results
+ uses: EnricoMi/publish-unit-test-result-action@v2
+ if: always()
+ with:
+ junit_files: '**/build/test-results/test/TEST-*.xml'
\ No newline at end of file
diff --git a/todoffin/.gitignore b/.gitignore
similarity index 90%
rename from todoffin/.gitignore
rename to .gitignore
index d98e3516..f03837f2 100644
--- a/todoffin/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+@@ -0,0 +1,42 @@
HELP.md
.gradle
build/
@@ -39,4 +40,5 @@ out/
.vscode/
### MAC ###
-*.DS_Store
\ No newline at end of file
+*.DS_Store
+src/main/generated/**
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..9fa3da91
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "GitGet-BACK-SECRET"]
+ path = GitGet-BACK-SECRET
+ url = https://github.com/TeamTheGenius/GitGet-BACK-SECRET
diff --git a/GitGet-BACK-SECRET b/GitGet-BACK-SECRET
new file mode 160000
index 00000000..5cbf067e
--- /dev/null
+++ b/GitGet-BACK-SECRET
@@ -0,0 +1 @@
+Subproject commit 5cbf067e9af6779fe46703f5529056455d1b3ee4
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..876d4371
--- /dev/null
+++ b/README.md
@@ -0,0 +1,287 @@
+
+
+
+
+## :raising_hand_man: 프로젝트 소개
+🔥 GitGet은 챌린지 참여와 인증 활동을 통해 규칙적인 공부 습관을 도와주는 서비스입니다.
+🙋🏻♂️Github 계정 연동을 통해 챌린지 활동을 인증할 수 있으며, 다른 참여자들의 인증 현황을 조회할 수 있습니다.
+🎯 챌린지에 설정되어 있는 목표 달성 시 포인트가 주어지며, 이를 통해 아이템을 구매하고 사용할 수 있습니다.
+
+
+## :desktop_computer: 기술 스택
+Framework -
+
+ORM -
+
+Authorization -
+
+Test -
+
+Database -
+
+DevOps -
+
+Monitoring -
+
+Other -
+
+
+
+## 개발 환경
+```
+Java : 17
+Spring Boot : 3.2.1
+build : gradle
+```
+
+
+
+## 다운로드 방법
+
+```
+git clone https://github.com/TeamTheGenius/TeamTheGenius_Server.git
+```
+
+
+
+## 화면 설계서
+
+
+
+
+## 주요 기능
+### 로그인 / Github 연동
+* 사용자는 회원가입을 통해 서비스를 이용할 수 있습니다.
+* 챌린지에 참여하기 위해서는 Github Access Token 인증 과정을 **필수**로 진행해야 합니다.
+* Pull Request 작업으로 사용자 Repository와 서비스가 연결되었는 지 확인이 필요합니다. 참여하고자 하는 브랜치에서 아무 작업을 진행하고, PR을 등록하여 등록 여부를 확인해주세요.
+
+
+
+
+
+
+
+### 홈 화면
+* 사용자는 참여하고자 하는 챌린지를 둘러볼 수 있습니다. 인기, 신규, 추천 카테고리를 이용 가능합니다.
+* 검색을 통해 종료된 챌린지, 진행 중인 챌린지, 참여가 가능한 챌린지 목록을 확인할 수 있습니다.
+
+
+
+
+
+
+
+### 챌린지 인증 현황
+* 참가자 인증 현황을 클릭하면 본인을 포함한 다른 참여자들의 인증 현황을 일주일 단위로 조회할 수 있습니다.
+* 인증 내역을 확인하고 싶은 일자를 선택하면 그 날의 인증에 사용된 Github PR 목록 조회가 가능합니다.
+* 조회한 Github PR 목록 중 구경하고 싶은 PR이 있다면, 해당 링크를 눌러 이동이 가능합니다.
+
+
+
+
+
+
+
+## 배포 플로우
+
+
+
+
+## 데이터베이스
+
+
+
+
+## 아키텍처
+```bash
+.
+├── main
+│ ├── java
+│ │ └── com
+│ │ └── genius
+│ │ └── gitget
+│ │ ├── admin
+│ │ │ ├── signout
+│ │ │ └── topic
+│ │ │ ├── controller
+│ │ │ ├── domain
+│ │ │ ├── dto
+│ │ │ ├── repository
+│ │ │ └── service
+│ │ ├── challenge
+│ │ │ ├── certification
+│ │ │ │ ├── controller
+│ │ │ │ ├── domain
+│ │ │ │ ├── dto
+│ │ │ │ │ └── github
+│ │ │ │ ├── repository
+│ │ │ │ ├── service
+│ │ │ │ └── util
+│ │ │ ├── instance
+│ │ │ │ ├── controller
+│ │ │ │ ├── domain
+│ │ │ │ ├── dto
+│ │ │ │ │ ├── crud
+│ │ │ │ │ ├── detail
+│ │ │ │ │ ├── home
+│ │ │ │ │ └── search
+│ │ │ │ ├── repository
+│ │ │ │ └── service
+│ │ │ ├── likes
+│ │ │ │ ├── controller
+│ │ │ │ ├── domain
+│ │ │ │ ├── dto
+│ │ │ │ ├── repository
+│ │ │ │ └── service
+│ │ │ ├── myChallenge
+│ │ │ │ ├── controller
+│ │ │ │ ├── dto
+│ │ │ │ └── service
+│ │ │ ├── participant
+│ │ │ │ ├── domain
+│ │ │ │ ├── repository
+│ │ │ │ └── service
+│ │ │ ├── report
+│ │ │ │ ├── controller
+│ │ │ │ ├── domain
+│ │ │ │ ├── dto
+│ │ │ │ ├── repository
+│ │ │ │ └── service
+│ │ │ └── user
+│ │ │ ├── controller
+│ │ │ ├── domain
+│ │ │ ├── dto
+│ │ │ ├── repository
+│ │ │ └── service
+│ │ ├── global
+│ │ │ ├── file
+│ │ │ │ ├── controller
+│ │ │ │ ├── domain
+│ │ │ │ ├── dto
+│ │ │ │ ├── repository
+│ │ │ │ └── service
+│ │ │ ├── security
+│ │ │ │ ├── config
+│ │ │ │ ├── constants
+│ │ │ │ ├── controller
+│ │ │ │ ├── domain
+│ │ │ │ ├── dto
+│ │ │ │ ├── filter
+│ │ │ │ ├── handler
+│ │ │ │ ├── info
+│ │ │ │ │ └── impl
+│ │ │ │ ├── repository
+│ │ │ │ └── service
+│ │ │ └── util
+│ │ │ ├── config
+│ │ │ ├── domain
+│ │ │ ├── exception
+│ │ │ ├── formatter
+│ │ │ └── response
+│ │ │ └── dto
+│ │ ├── profile
+│ │ │ ├── controller
+│ │ │ ├── dto
+│ │ │ └── service
+│ │ ├── schedule
+│ │ │ ├── controller
+│ │ │ └── service
+│ │ └── store
+│ │ ├── item
+│ │ │ ├── controller
+│ │ │ ├── domain
+│ │ │ ├── dto
+│ │ │ ├── repository
+│ │ │ └── service
+│ │ └── payment
+│ │ ├── config
+│ │ ├── controller
+│ │ ├── domain
+│ │ ├── dto
+│ │ ├── repository
+│ │ └── service
+│ └── resources
+└── test
+ ├── java
+ │ └── com
+ │ └── genius
+ │ └── gitget
+ │ ├── admin
+ │ │ └── topic
+ │ │ ├── controller
+ │ │ ├── repository
+ │ │ └── service
+ │ ├── challenge
+ │ │ ├── certification
+ │ │ │ ├── controller
+ │ │ │ ├── repository
+ │ │ │ ├── service
+ │ │ │ └── util
+ │ │ ├── home
+ │ │ │ ├── controller
+ │ │ │ └── service
+ │ │ ├── instance
+ │ │ │ ├── controller
+ │ │ │ ├── repository
+ │ │ │ └── service
+ │ │ ├── item
+ │ │ │ └── service
+ │ │ ├── likes
+ │ │ │ ├── controller
+ │ │ │ └── service
+ │ │ ├── myChallenge
+ │ │ │ └── service
+ │ │ ├── participant
+ │ │ │ └── service
+ │ │ └── user
+ │ │ ├── controller
+ │ │ ├── domain
+ │ │ ├── repository
+ │ │ └── service
+ │ ├── global
+ │ │ ├── file
+ │ │ │ ├── domain
+ │ │ │ ├── repository
+ │ │ │ └── service
+ │ │ └── security
+ │ │ ├── config
+ │ │ ├── controller
+ │ │ └── service
+ │ ├── payment
+ │ │ ├── controller
+ │ │ └── service
+ │ ├── profile
+ │ │ ├── controller
+ │ │ └── service
+ │ └── util
+ │ └── file
+ └── resources
+
+```
+
+
+
+## 기여자
+
|
+ + |
+
+ + |
+
|
+ + |
+
+ + |
+
+ * 주의 사항!!
+ * 활성화 된 profile이 "prod"일 때에만 작동하도록 해야 합니다.
+ * Environment의 matchProfiles()를 통해 특정 프로파일이 활성화되어 있는지 확인 가능
+ * if(!environment.matchesProfiles("prod")) return;
+ *
+ * @param exception 발생한 예외
+ */
+ void sendSlackMessage(Exception exception);
+}
diff --git a/src/main/java/com/genius/gitget/global/util/formatter/CommonPattern.java b/src/main/java/com/genius/gitget/global/util/formatter/CommonPattern.java
new file mode 100644
index 00000000..c7964586
--- /dev/null
+++ b/src/main/java/com/genius/gitget/global/util/formatter/CommonPattern.java
@@ -0,0 +1,8 @@
+package com.genius.gitget.global.util.formatter;
+
+public final class CommonPattern {
+ public static final String MANAGER_ID_PATTERN = "^(?=.*[a-z])(?=.*\\d)[a-z\\d]{8,16}$";
+ public static final String MANAGER_PASSWORD_PATTERN = "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[$@$!%*#?&])[A-Za-z\\d$@$!%*#?&]{8,16}$";
+ public static final String IP_ADDRESS_PATTERN = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";
+ public static final String Y_OR_N = "^[YN]$";
+}
diff --git a/src/main/java/com/genius/gitget/global/util/formatter/LocalDateFormatter.java b/src/main/java/com/genius/gitget/global/util/formatter/LocalDateFormatter.java
new file mode 100644
index 00000000..3f1e376c
--- /dev/null
+++ b/src/main/java/com/genius/gitget/global/util/formatter/LocalDateFormatter.java
@@ -0,0 +1,21 @@
+package com.genius.gitget.global.util.formatter;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+import org.springframework.format.Formatter;
+import org.springframework.stereotype.Component;
+
+@Component
+public class LocalDateFormatter implements Formatter