Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[20기 김연수, 이채원] spring-vote 미션 제출합니다. #6

Open
wants to merge 57 commits into
base: pedal-genie
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
6d6be99
:tada: 프로젝트 셋팅
gchaewon Dec 18, 2024
cd86634
📝 PR 템플릿 설정
gchaewon Dec 18, 2024
524c844
:tada: 의존 추가
gchaewon Dec 18, 2024
fac696b
:sparkles: BaseTimeEntity 적용
gchaewon Dec 18, 2024
5915122
:sparkles: GlobalException 적용
gchaewon Dec 18, 2024
98503d6
:sparkles: 공용 ResponsTemplate 추가
gchaewon Dec 18, 2024
228d613
:sparkles: swagger config 추가
gchaewon Dec 18, 2024
3205de9
Merge pull request #1 from gchaewon/dev
gchaewon Dec 18, 2024
7ad3558
:recycle: 폴더 구조 수정
gchaewon Dec 18, 2024
d3f1af8
🐛 git fetch
gchaewon Dec 18, 2024
631262e
:sparkles: Member 관련 엔티티 추가
gchaewon Dec 22, 2024
d728faa
:sparkles: Member 레포지토리 추가
gchaewon Dec 22, 2024
e0e9b84
:sparkles: 투표 관련 예외 추가
gchaewon Dec 22, 2024
a463691
:sparkles: Vote 엔티티 추가
gchaewon Dec 22, 2024
ac2e0b5
:sparkles: Vote 레포지토리 추가
gchaewon Dec 22, 2024
8f3b90c
:sparkles: Vote 관련 dto 추가
gchaewon Dec 22, 2024
84ede69
:sparkles: 투표 생성, 후보 조회, 결과 조회 메서드 추가
gchaewon Dec 22, 2024
6e19cea
:sparkles: 투표 생성, 후보 조회, 결과 조회 API 추가
gchaewon Dec 22, 2024
231d676
Merge pull request #2 from gchaewon/feat/vote
gchaewon Dec 23, 2024
b550d7e
회원가입, 로그인, 회원조회 기능 구현
juanxiu Dec 25, 2024
ac54d4a
로그인 실패 응답 추가
juanxiu Dec 25, 2024
3827743
Merge pull request #3 from juanxiu/dev
juanxiu Dec 26, 2024
c495e6e
:sparkles: CORS 설정 추가
gchaewon Dec 26, 2024
d813ad9
:rocket: 배포 설정 및 파일 추가
gchaewon Dec 26, 2024
d4f7e15
:rocket: 배포용 환경 변수처리
gchaewon Dec 26, 2024
d459917
Merge pull request #4 from gchaewon/dev
juanxiu Dec 26, 2024
b0f2504
:bug: env에서 환경변수 가져오기로 변경
gchaewon Dec 26, 2024
d09939f
🚀 CI/CD 설정
gchaewon Dec 26, 2024
56e3b0b
:rocket: ci/cd 테스트용 페이지
gchaewon Dec 26, 2024
a500f67
:bug: git fetch
gchaewon Dec 26, 2024
889678e
:bug: 도커 레포지토리, 이미지명 수정
gchaewon Dec 26, 2024
25928f0
:bug: 인스턴스 변경 확인용 파일 추가
gchaewon Dec 26, 2024
2ea964f
:bug: 배포 오류 해결 확인용 파일 변경
gchaewon Dec 26, 2024
6b86adc
:bug: 배포 오류 해결 확인용 파일 변경
gchaewon Dec 26, 2024
067d20c
:bug: ssh 연결 버전 변경
gchaewon Dec 26, 2024
8e16531
:bug: ssh 버전 원본으로 수정
gchaewon Dec 26, 2024
4aa1a74
:bug: ssh username linux 기반으로 변경
gchaewon Dec 26, 2024
49926a2
:bug: directory linux 기반으로 변경
gchaewon Dec 26, 2024
8d92831
:bug: 배포 오류 해결 확인용 파일 변경
gchaewon Dec 26, 2024
ba51ab3
:bug: docker pull 권한 오류 수정
gchaewon Dec 26, 2024
f0ba592
:bug: docker 네트워크 오류 수정
gchaewon Dec 26, 2024
d226045
:bug: 외부 네트워크 허용 수정
gchaewon Dec 26, 2024
7df72bc
:fire: 불필요한 설정 제거
gchaewon Dec 26, 2024
1a405ec
:ambulance: 포트 매핑 오류 해결
gchaewon Dec 26, 2024
d4d1a1f
Merge pull request #5 from gchaewon/dev
gchaewon Dec 28, 2024
5fd0304
:recycle: uri 통일
gchaewon Dec 28, 2024
eec359f
:ambulance: filter 제외 uri 추가
gchaewon Dec 28, 2024
4833a10
Merge pull request #6 from gchaewon/dev
gchaewon Dec 28, 2024
5958f4d
:art: 프론트 정보 오름차순 변경
gchaewon Dec 28, 2024
4bcf107
:ambulance: static 리소스 오류 해결
gchaewon Dec 28, 2024
56ca11f
:fire: 불필요한 파일 제거
gchaewon Dec 28, 2024
2d7dbb7
:recycle: 회원 response 수정
gchaewon Dec 28, 2024
34712d3
Merge pull request #7 from gchaewon/dev
gchaewon Dec 28, 2024
dcde8f0
refactor: 로그인 요청 API 수정, cors header 추가
juanxiu Dec 29, 2024
b2e0e00
Merge pull request #8 from juanxiu/dev
juanxiu Dec 29, 2024
bb7ee61
📝 리드미 작성
gchaewon Jan 1, 2025
998a7d2
📝 리드미 API 테스트 추가
gchaewon Jan 6, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
## #️⃣ 연관된 이슈
ex) #이슈번호, #이슈번호

---
## 📝 작업 내용
이번 PR에서 작업한 내용을 간략히 설명해주세요.

---
## 💬 리뷰 요구사항
리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요.

---
## 🔗 레퍼런스
61 changes: 61 additions & 0 deletions .github/workflows/gradle.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: deploy dev server

on:
push:
branches: [ "dev" ]
pull_request:
branches: [ "dev" ]

jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
# 레포지토리 브랜치 체크아웃
- uses: actions/checkout@v4

# JDK 설정
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

# gradle 빌드
- name: Build with Gradle
run: ./gradlew bootJar

# 이미지 빌드 및 Docker Hub 업로드
- name: web docker build and push
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -t ${{ secrets.DOCKER_USERNAME }}/ceos:latest .
docker push ${{ secrets.DOCKER_USERNAME }}/ceos:latest

# EC2 서버에 접속해 Docker 컨테이너 실행
- name: executing remote ssh commands
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }} # EC2 public DNS
username: ec2-user
key: ${{ secrets.KEY }} # .pem key
script: |
# 원하는 경로로 이동
mkdir -p /home/ec2-user/app
cd /home/ec2-user/app

# .env 파일 생성 (필요한 환경 변수 설정)
sudo touch .env
echo "${{ secrets.ENV_VARS }}" | sudo tee .env > /dev/null

# 기존 컨테이너가 있다면 중지 후 제거
sudo docker stop app-container || true
sudo docker rm app-container || true

# Docker 이미지 다운로드
echo "${{ secrets.DOCKER_PASSWORD }}" | sudo docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
sudo docker pull ${{ secrets.DOCKER_USERNAME }}/ceos:latest

# 새로운 Docker 컨테이너 실행
sudo docker run -d --name app-container --env-file .env -p 80:8080 ${{ secrets.DOCKER_USERNAME }}/ceos:latest
40 changes: 40 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/
.env

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/
.DS_Store
dump.rdb
4 changes: 4 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
FROM openjdk:17
ARG JAR_FILE=/build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar", "/app.jar"]
145 changes: 144 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,144 @@
# spring_vote_20th
# spring_vote_20th
---
## DB 설계
**BaseEntity**
- createdAt: 생성 날짜/시간 (LocalDateTime)
- updatedAt: 수정 날짜/시간 (LocalDateTime)
- deletedAt

**Member**

- memberId (PK)
- loginId
- password
- email
- name (이름)
- part(ENUM)
- team(ENUM)
- createdAt

**Part(ENUM)**

```sql
public enum Part {
FRONT(Arrays.asList("A", "B", "C")),
BACK(Arrays.asList("D", "E", "F"));

private final List<String> partMembers;
}
```

**Team(ENUM)**

```sql
public enum Team {
PHOTO_GROUND,
ANGEL_BRIDGE,
PEDAL_GENIE,
CAKE_WAY,
COFFEE_DEAL
}
```

**Vote (추상클래스)**

- voteId (PK)
- memberId (FK - 투표한 사용자ID)
- createdAt

**LeaderVote**

- part(ENUM)
- partMember(String)

**TeamVote**

- team (ENUM)
- editedAt


---
## API 명세서 & 테스트

<img width="600" src="https://github.com/user-attachments/assets/586d7cd8-39bb-4efc-9127-649fd29a7789" />

### **1) 회원 가입**

**201 - 회원가입 성공**

<img width="600" alt="스크린샷 2025-01-06 13 37 40" src="https://github.com/user-attachments/assets/0f97fbfe-0ba1-4213-9741-2148fb38d039" />

**409 - 아이디 중복 가입 시도하는 경우**

<img width="600" alt="스크린샷 2025-01-06 13 38 27" src="https://github.com/user-attachments/assets/09dc47cc-7cbc-46f1-b847-82cd4b610f8a" />

### **2) 로그인**

<img width="600" alt="스크린샷 2025-01-06 13 39 42" src="https://github.com/user-attachments/assets/295a36a8-5b60-47ff-82c2-4e9892ea1e25" />

### **3) 회원 프로필 조회**

<img width="600" alt="스크린샷 2025-01-06 13 42 01" src="https://github.com/user-attachments/assets/314fa2ee-b54c-4073-9b66-92ccf55af71e" />

### **4) 후보 조회**

**팀 조회**

<img width="600" alt="스크린샷 2025-01-06 13 43 39" src="https://github.com/user-attachments/assets/8cb749ad-7c56-4713-a4a6-95a6714a52a3" />

**파트별 조회**

<img width="600" alt="스크린샷 2025-01-06 13 44 09" src="https://github.com/user-attachments/assets/dc61dcd2-4776-44be-8562-1cc66bb8272e" />

<img width="600" alt="스크린샷 2025-01-06 13 44 28" src="https://github.com/user-attachments/assets/206207af-a031-4871-8f4d-3a277353d0dd" />


### **5) 투표 생성**

**팀 투표**

**201 - 생성 성공**

<img width="600" alt="스크린샷 2025-01-06 13 45 50" src="https://github.com/user-attachments/assets/6af3baa3-4981-4f60-a093-3cf96848b47b" />

**400 - 자신의 팀에 투표 시도**

<img width="600" alt="스크린샷 2025-01-06 13 46 37" src="https://github.com/user-attachments/assets/4fa025bd-00d4-4fa2-8017-9bf27c8201cc" />


**409 - 중복 투표 시도**

<img width="600" alt="스크린샷 2025-01-06 13 47 05" src="https://github.com/user-attachments/assets/0d075c03-97e1-4328-b28d-c4e1f4a49f02" />


**파트 리더 투표**

**201 - 생성 성공**

<img width="600" alt="스크린샷 2025-01-06 13 49 00" src="https://github.com/user-attachments/assets/52b9c43c-0285-4cbd-9dd3-d78ff95d5612" />

**400 - 다른 파트에 투표 시도**

<img width="600" alt="스크린샷 2025-01-06 13 47 57" src="https://github.com/user-attachments/assets/b64ec8fd-6a30-44f9-ba92-20f21801439a" />


**400 - 해당 파트에 속하지 않는 구성원에 투표 시도**

<img width="600" alt="스크린샷 2025-01-06 13 48 24" src="https://github.com/user-attachments/assets/282df89e-8dde-437c-9cf0-b136e9982630" />

**409 - 중복 투표 시도**

<img width="600" alt="스크린샷 2025-01-06 13 49 18" src="https://github.com/user-attachments/assets/e8da61d2-8cb4-43f9-85db-2392f2f75310" />

### 6) 투표 결과 조회
**1. 팀 투표 결과 조회**

<img width="600" alt="스크린샷 2025-01-06 13 50 57" src="https://github.com/user-attachments/assets/70218b0a-61f5-4bf0-b584-6e63a8ef5eb6" />


**2. 파트 투표 결과 조회**

<img width="600" alt="스크린샷 2025-01-06 13 51 21" src="https://github.com/user-attachments/assets/91ab2e6d-02ce-4248-81a0-e3023c5a20e1" />


<img width="600" alt="스크린샷 2025-01-06 13 53 00" src="https://github.com/user-attachments/assets/1ec08c47-0b1b-465c-aea8-19aa3db3ed37" />
53 changes: 53 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.0'
id 'io.spring.dependency-management' version '1.1.6'
}

group = 'com.pedalgenie'
version = '0.0.1-SNAPSHOT'

java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
// 검증 의존
implementation 'org.springframework.boot:spring-boot-starter-validation'
// API 문서 의존
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

// JWT 토큰 관련
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

// spring security
implementation 'org.springframework.boot:spring-boot-starter-security'


}

tasks.named('test') {
useJUnitPlatform()
}
Binary file added gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
7 changes: 7 additions & 0 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading