# Team-03-LinkBook-BE
## 🤲🏻 프로젝트 소개
```
북마크 공유 프로젝트
```
> 구현 기능
- JWT을 이용한 로컬 로그인
<br>
## 👬 팀 소개
<table>
<tr>
<td>
<a href="https://github.com/Nnagman">
<img src="https://avatars.githubusercontent.com/u/16336810?v=4" width="100px" />
</a>
</td>
<td>
<a href="https://github.com/suy2on">
<img src="https://avatars.githubusercontent.com/u/62363580?v=4" width="100px" />
</a>
</td>
<td>
<a href="https://github.com/pppp0722">
<img src="https://avatars.githubusercontent.com/u/60428537?v=4" width="100px" />
</a>
</td>
<td>
<a href="https://github.com/ChoiYeonho0903">
<img src="https://avatars.githubusercontent.com/u/76257508?v=4" width="100px" />
</a>
</td>
<td>
<a href="https://github.com/su-pernova">
<img src="https://avatars.githubusercontent.com/u/48689213?v=4" width="100px" />
</a>
</td>
</tr>
<tr>
<td><b>이창호</b></td>
<td><b>이수연</b></td>
<td><b>이일환</b></td>
<td><b>최연호</b></td>
<td><b>김수미</b></td>
</tr>
<tr>
<td><b>Product Owner</b></td>
<td><b>Developer</b></td>
<td><b>Developer</b></td>
<td><b>Developer</b></td>
<td><b>Developer</b></td>
</tr>
</table>
<br>
## 🛠 기술 스택
### BackEnd
<table>
<tr>
<td>
<img src="https://user-images.githubusercontent.com/76257508/184301901-63ae039a-87d5-4313-a1ce-a4c90badc242.png" width="100px"/>
</td>
<td>
<img src="https://images.velog.io/images/leeseojune53/post/b6527e64-30c9-40d4-a955-ddbc647edec1/Gradle_logo.png" width="100px" />
</td>
<td>
<img src="https://user-images.githubusercontent.com/76257508/184303436-1f388f6f-897f-4305-9435-61edd9b67fea.png" width="100px" />
</td>
<td>
<img src="https://user-images.githubusercontent.com/76257508/184302496-44109fa5-b95b-4044-8562-27608d4ea8d5.png" width="100px" />
</td>
<td>
<img src="https://user-images.githubusercontent.com/76257508/184309540-f9438159-5936-4c14-af39-84913c9d751f.png" width="100px" />
</td>
<td>
<img src="https://user-images.githubusercontent.com/76257508/184309618-4677c412-cd2e-470a-931e-28ba10a3f63b.png" width="100px" />
</td>
<td>
<img src="https://user-images.githubusercontent.com/76257508/184302416-34ad1a13-b691-4617-adff-8dcf917354e0.png" width="100px" />
</td>
</tr>
<tr>
<td><b>Java 11</b></td>
<td><b>Gradle</b></td>
<td><b>Spring</b></td>
<td><b>Spring Boot</b></td>
<td><b>Spring Data JPA</b></td>
<td><b>Spring Security</b></td>
<td><b>MySQL</b></td>
</tr>
</table>
### TestingTool
<table>
<tr>
<td>
<img src="https://user-images.githubusercontent.com/76257508/184303192-74eac7ec-972e-45bf-81bb-0caf7de6e3d7.png" width="100px"/>
</td>
<td>
<img src="https://user-images.githubusercontent.com/76257508/184303203-e1589d74-9048-428c-a913-1058f268a69a.png" width="100px" />
</td>
</tr>
<tr>
<td><b>JUnit</b></td>
<td><b>Mockito</b></td>
</tr>
</table>
### DevOps
<table>
<tr>
<td>
<img src="https://user-images.githubusercontent.com/76257508/184303964-343dfe04-11ba-4331-b4c1-02c117a1dd78.png" width="100px" />
</td>
<td>
<img src="https://user-images.githubusercontent.com/76257508/184303992-5e812469-9e71-4538-9ab7-e62cba87020f.png" width="100px" />
</td>
<td>
<img src="https://user-images.githubusercontent.com/76257508/184307814-684c586a-1aef-49ce-95aa-4db34096c803.png" width="100px" />
</td>
</tr>
<tr>
<td><b>Docker</b></td>
<td><b>GithubAction</b></td>
<td><b>EC2</b></td>
</tr>
</table>
### 문서/협업
<table>
<tr>
<td>
<img src="https://user-images.githubusercontent.com/103566826/177922764-354c44a9-05e9-4d5c-a10c-0da6676a80a0.png" width="100px" />
</td>
<td>
<img src="https://user-images.githubusercontent.com/103566826/177922777-83956929-35f0-4746-a51b-98c116da2651.png" width="100px" />
</td>
<td>
<img src="https://user-images.githubusercontent.com/103566826/177922791-263bc0f1-bebc-4eee-bdb5-9954af5bbaf9.png" width="100px" />
</td>
<td>
<img src="https://user-images.githubusercontent.com/103566826/177922794-5a47df94-fc97-4beb-a6f4-16b24e315757.png" width="100px" />
</td>
<td>
<img src="https://user-images.githubusercontent.com/103566826/177922809-866718e0-fb19-4840-9caa-111da31795d1.png" width="100px" />
</td>
<td>
<img src="https://user-images.githubusercontent.com/103566826/177922816-6888632c-b218-4635-98d5-189addb835ca.png" width="100px" />
</td>
</tr>
<tr>
<td><b>Notion</b></td>
<td><b>Slack</b></td>
<td><b>Git</b></td>
<td><b>GitHub</b></td>
<td><b>RestDocs</b></td>
<td><b>AsciiDocs</b></td>
</tr>
</table>
<br>
## ☀️ ARCHITECTURE
<img width="1049" alt="infra_structure" src="https://user-images.githubusercontent.com/76257508/184298185-698ea509-3ba0-4144-9d53-070faadc5cd0.png">
## 🖼 ERD

<br>
## 💬 Branch 전략, 프로젝트 형상 관리, CI/CD 파이프라인
### Branch 전략
- GitHub flow 사용
- 트렁크 기반 개발(Trunk-Based Development)
- `이슈 발행` → `브랜치 생성` → `commit` → `PR 발행` → `main 브랜치 merge` → `자동 배포`
### 프로젝트 형상 관리
- Github Issue + Milestone + Project 사용
<img width="1146" alt="project_configuration" src="https://user-images.githubusercontent.com/76257508/184299178-86279a70-695a-48e7-9caf-2ac0a6292aea.png">
### CI/CD 파이프라인
- Github Action 사용
- **PR 이 발행되는 경우**
- **AWS RDS DB** 연결 기반
- **gradle build** 에 성공하는 경우 **Github Action** 통과
- **PR 이 main 브랜치에 merge 되는 경우**
- **AWS RDS DB** 연결 기반
- **EC2** 서버에 **main** 브랜치 코드 자동 배포
- **gradle build** 및 **Docker image build** + **compose up(deploy 과정)** 성공하는 경우
**Github Action** 통과
## 커밋 메시지, PR 규칙
### 커밋 메시지
> Type
- 깃모지 사용
- 인텔리제이에서 다음 플러그인으로 커밋에 쉽게 사용할 수 있음
> 
- 아이콘은 [여기](https://gitmoji.dev)를 참고하여 작성
- 깃모지와 제목 사이에 띄어쓰기 하지 않음
```
[ 예시 ]
• ✨ 로컬 로그인 기능 추가
• (생략 가능) 부연 설명
• (생략 가능) 해결: #123 / 참고: #456, #789
```
> Subject
```
• 길어지지 않도록 작성
• "~ 추가", "~ 수정", "~ 리팩토링", ...
```
> Body
```
• 부연설명이 필요한 경우 선택하여 작성
```
> Footer
```
• 부가적으로 issue tracker id를 작성할 때 작성
```
### PR 규칙
- `feat/작업`에서 기능 개발 후 `develop`에 PR
- PR 제목은 브랜치에서 작업한 단위 → Jira 참고
- 본문에는 리뷰어들이 알아야 될 사항 명시
- PR 작성자는 PR 후 포인트 되는 부분을 셀프 코드 리뷰로 명시
- 나머지 팀원들은 PR 발생 시 코드 리뷰
- 코드 리뷰 반영된 부분은 `Resolve conversation`
- 모든 리뷰 반영 완료 후 `Merge pull request` 하거나 추가적인 코드 리뷰가 필요하면 `Re-request review`
<br>
## ✅ 실행방법
### application-database.yaml
``` YAML
spring:
jpa:
properties:
hibernate:
default_batch_fetch_size: 1000
format_sql: true
show-sql: true
generate-ddl: true
hibernate:
ddl-auto: update
datasource:
url: jdbc:mysql://linkbook-1.czvbgr7hie3i.ap-northeast-2.rds.amazonaws.com:3306/linkbook
username:
password:
hikari:
maximum-pool-size: 10
```
### application-jwt.yaml
``` YAML
jwt:
access-header : Access-Token
refresh-header : Refresh-Token
issuer: prgrms
client-secret:
access-token-expiry-seconds: 3600
refresh-token-expiry-seconds: 1209600
```
### application-mail.yaml
``` YAML
spring:
mail:
host: smtp.gmail.com
port: 587
protocol: smtp
default-encoding: UTF-8
username: devcourse.linkbook@gmail.com
password:
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
```
### 빌드하고 실행하기
``` SHELL
# 빌드하기
./gradlew bootJar
# 빌드 후 실행
./gradlew bootRun
# 또는
java -jar {jar파일}
```
- 완성도 높이기 : 기술적 도전, 안쓰는 주석 깔끔하게
- 개선할 사항 찾아서 리팩토링 : 책임분리, 테스트, 아키텍처.. , change log에 태그와 남겨두기, github release기능
- README 잘 작성하기 : 아키텍쳐, CICD, branch전략, test, 실행방법
- 린터/포매터를 이용한 코드 컨벤션 유지 : pre-commit, pre-push
- 개발/운영 환경관리 : DB, API, 환경변수…
- 릴리즈 : 버저닝(시멘팅), 태그, 도커와 함께쓸때 고민