- 개요
- Skils
- Installation
- Directory
- API Reference
- 프로젝트 진행 및 이슈 관리
- 구현과정(설계 및 의도)
- TIL 및 회고
- Authors
- References
본 서비스는 사용자들이 팀 프로젝트를 모집, 진행, 관리하는데 도움을 주며 SNS 기능을 가진 애플리케이션입니다. 이 앱은 진행중인 팀 프로젝트를 모니터링하고 사용자들에게 프로젝트, 게시글, 팀원을 추천하여 프로젝트를 쉽고 편하게 진행하고자 하는 목표 달성에 도움이 됩니다.
(프로젝트, 게시글, 팀원을 추천하는 기능을 통해 원활한 프로젝트 진행을 지원합니다)
Java 17이 설치되어있다고 가정합니다
- synergy_be 프로젝트를
git clone
명령어를 통해 클론 받습니다. - 클론받은 스프링 프로젝트 실행파일 (*.jar) 을 생성합니다.
- 루트 위치에서 권한 부여를 위해
chmod +x gradlew
명령어 실행 ./gradlew build -x test
명령어 실행
- 루트 위치에서 권한 부여를 위해
- app_network 이름의 네트워크를
docker network create app_network
명령어로 생성합니다. docker-compose.yml
파일을 루트 디렉토리에 생성합니다.docker-compose.yml
파일은 보안상 개인적으로 전달합니다.- mac일 경우 docker-compose.yml의 mysql, mongo 에
platform: linux/amd64
추가 필요
- mac일 경우 docker-compose.yml의 mysql, mongo 에
docker-compose build
명령어로 docker 이미지를 생성합니다.docker-compose up -d
명령어로 docker-compose 를 통해 docker 이미지를 실행 (컨테이너화) 합니다.- host 는
localhost
이며localhost
url을 통해 프론트 로컬 개발환경을 구성합니다.
위 로컬 개발환경 구성 순서는 아래와 같이 진행됩니다.
1. 프로젝트 clone
2. 프로젝트 빌드
3. docker network 생성
4. docker-compose.yml 파일 생성
5. docker image 빌드
6. docker image 실행
We publish image to https://hub.docker.com at every release.
docker pull jonghuni/synergy_be
기능 API
- Oauth 로그인 기능, JWT 토큰 인증, 인가
- 게시글, 프로젝트, 유저 추천
- 게시글, 프로젝트, 유저 조회
- 프로젝트 업무 티켓 관리 (칸반보드 형식)
- 프로젝트 신청, 수락, 거절
- 프로젝트 평가
파일 구조 보기
src
├─domain
│ ├─apply
│ │ ├─controller
│ │ ├─dto
│ │ ├─repository
│ │ ├─service
│ │ └─Apply
│ ├─auth
│ │ ├─controller
│ │ ├─entity
│ │ ├─info
│ │ ├─repository
│ │ ├─service
│ │ └─token
│ ├─comment
│ │ ├─controller
│ │ ├─dto
│ │ ├─repository
│ │ ├─service
│ │ └─Comment
│ ├─follow
│ │ ├─controller
│ │ ├─dto
│ │ ├─repository
│ │ ├─service
│ │ └─Follow
│ ├─image
│ │ ├─controller
│ │ ├─dto
│ │ ├─repository
│ │ ├─service
│ │ └─Image
│ ├─notice
│ │ ├─controller
│ │ ├─dto
│ │ ├─repository
│ │ ├─service
│ │ └─Notice
│ ├─notification
│ │ ├─controller
│ │ ├─dto
│ │ ├─repository
│ │ ├─service
│ │ └─Notification
│ ├─post
│ │ ├─controller
│ │ ├─dto
│ │ ├─repository
│ │ ├─service
│ │ └─Post
│ ├─postlike
│ │ ├─controller
│ │ ├─dto
│ │ ├─repository
│ │ ├─service
│ │ └─PostLike
│ ├─project
│ │ ├─controller
│ │ ├─dto
│ │ ├─repository
│ │ ├─service
│ │ └─Project
│ ├─projectlike
│ │ ├─controller
│ │ ├─dto
│ │ ├─repository
│ │ ├─service
│ │ └─ProjectLike
│ ├─projectuser
│ │ ├─controller
│ │ ├─dto
│ │ ├─repository
│ │ ├─service
│ │ └─ProjectUser
│ ├─rate
│ │ ├─controller
│ │ ├─dto
│ │ ├─repository
│ │ ├─service
│ │ └─Rate
│ ├─schedule
│ │ ├─controller
│ │ ├─dto
│ │ ├─repository
│ │ ├─service
│ │ └─Schedule
│ └─user
│ ├─controller
│ ├─dto
│ ├─repository
│ ├─service
│ └─User
└─system
├─common
├─config
│ └─properties
├─exception
├─filter
├─handler
└─utils
테이블 관계 - click
- 주요 도메인으로 user, post, project, notification 으로 나눈다
- Project 와 Category 관계
- Category를 하나의 테이블로 만들것인가 ? (정규화 고려)
- 혹은 Enum으로만 관리할 것 인가 ?
- Enum으로 관리한다(Field로 이름 변경)
- Enum 만으로도 분류가 가능하기 때문
- 추가적으로 분류에 대한 성능개선이 필요하거나 수요 증가가 예상될 경우 Entity로 구현을 고려하여 정규화를 진행한다
- Enum으로 관리한다(Field로 이름 변경)
- Project 와 User 관계
- Project 와 User는 N 대 N 관계로 설정한다. 이유는 Project(프로젝트)는 User(사용자) 를 여러명 가질 수 있고 반대로 User는 여러 Project를 수행할 수 있으므로
- 추가로 고려할 사항
- Project의 요구사항이 늘어남에 따라 User의 정보를 Project 내에서도 양방향 관계로 관리하는게 맞을까 ?
- 현재는 Project가 여러 User를 가진다는 개념이므로 양방향으로 매핑을 해주자
- 추가로 고려할 사항
- Project 와 User는 N 대 N 관계로 설정한다. 이유는 Project(프로젝트)는 User(사용자) 를 여러명 가질 수 있고 반대로 User는 여러 Project를 수행할 수 있으므로
고객의 회원 가입, 로그인, 회원 정보 변경, 회원 정보 조회 등의 기능을 제공하는 서비스입니다.
- OAuth와 JWT를 활용하여 회원의 인증과 인가 처리를 수행하며, 이를 통해 소셜 로그인 시 Access Token과 Refresh Token을 이용하여 인증 과정을 완료합니다.
기능
- 로그인(첫 소셜로그인시 자동 회원가입)
- 회원 정보 변경
- login (users/auth/login)
- 로그인, 회원가입을 수행합니다. 로그인 성공시 token을 발급하며 이후 요청에 대해서 해당 토큰으로 인증을 진행합니다.
- updateMyInfo (users/me/info)
- 회원 정보를 변경합니다.
- Spring Boot, Java 11, Spring Data JPA, Mysql, Lombok, Gradle, JWT
사용자가 가진 활동들을 바탕으로 사용자에게 알맞는 컨텐츠(게시글, 프로젝트, 유저)를 추천해주는 기능을 제공하는 서비스입니다.
- 추천 알고리즘으로 채택한 LightFM 모델은 콘텐츠 기반 방식과 협업 필터링을 결합한 하이브리드 행렬 분해 모델
- 채택한 이유는 사용자와 아이템을 그들의 콘텐츠 특성의 잠재 요인들로 표현하며, 상호작용 데이터가 부족한 콜드 스타트 상황에서도 효과적이므로
- 추천 기능이 동작하는 FastAPI 서버를 docker Image화 하여 docker 컨테이너 위에서 실행 (메인서버 또한 Image화 하여 컨테이너위에서 실행)
- DB와 메인 서버로부터 데이터와 API 요청을 받아 모델학습 및 추천을 수행
- 채택한 이유는 사용자와 아이템을 그들의 콘텐츠 특성의 잠재 요인들로 표현하며, 상호작용 데이터가 부족한 콜드 스타트 상황에서도 효과적이므로
- getRecommendProjects (projects/recommend)
- 유저 활동을 바탕으로 적합한 프로젝트를 추천합니다.
- getRecommendPosts (posts/recommend)
- 유저 활동을 바탕으로 적합한 게시글을 추천합니다.
- getSimilarUsers (users/recommend)
- 유저 활동을 바탕으로 적합한 유저를 추천합니다.
사용자가 팀원을 구성하며 팀 프로젝트를 진행하며 공지시항, 일정, 티켓 관리, 평가 등의 기능을 제공하는 서비스입니다.
- 티켓 관리 기능의 경우 티켓을 칸반보드로 관리하는 기능으로 각 Status별로 나누어 티켓들을 올바른 위치로 이동하게끔 구현
- changePositionTicket (tickets/change/{ticketId})
- 티켓 위치 변경 기능을 제공합니다.
- 좋은 객체 ID 만들기 블로그 - click
- 좋은 객체 ID를 만들기 위해 아래 4가지 사항을 고려하여 만들기 위해 노력하였습니다.
- 고유성
- 식별 가능성
- 보안성
- 생성 시간순 정렬
- 관련 PR
- 좋은 객체 ID를 만들기 위해 아래 4가지 사항을 고려하여 만들기 위해 노력하였습니다.
- WebSocket 을 이해하며 채팅서비스를 구현해보아요 | MySQL, MongoDB
- 채팅 서비스를 구현하기 위해 아래 사항들을 고려해보았습니다.
- 웹소켓 프로토콜 이해
- 실시간성 보장
- 채팅 서비스를 구현하기 위해 아래 사항들을 고려해보았습니다.
_._.-.Clipchamp.1.mp4
-.Clipchamp.mp4
_.mp4
_.-.Clipchamp.mp4
_._._.-.Clipchamp.mp4
_.mp4
_._.mp4
_._.-.Clipchamp.mp4
대용량 트래픽 처리
- 가상 사용자 1천명 -> Jmeter로 진행 예정
github ci-cd
- 빌드 및 배포 자동화
내용 작성