HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
♥️
2기 최종 프로젝트 팀별 공간
/
🔖
강력3팀 : 링북(LinkBook)
/
README.md (BackEnd)
README.md (BackEnd)
README.md (BackEnd)

README.md (BackEnd)

# 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 ![erd](https://user-images.githubusercontent.com/76257508/184299245-d5d81642-1526-456d-a5c5-59034bf02f92.png) <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://velog.velcdn.com/images/pppp0722/post/d9e5d256-3a25-4878-b071-148ed217f1ae/image.png](https://velog.velcdn.com/images/pppp0722/post/d9e5d256-3a25-4878-b071-148ed217f1ae/image.png) - 아이콘은 [여기](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, 환경변수…
  • 자동화 : CI, CD 도구들 선택
  • 릴리즈 : 버저닝(시멘팅), 태그, 도커와 함께쓸때 고민