Note
사이드픽 Backend 레포지토리입니다!
사이드픽(Side Peek)👀은 다른 개발자들의 사이드 프로젝트에서 인사이트를 얻고 싶은 개발자들을 위한 사이드 프로젝트 공유 플랫폼입니다.
🔗 서비스 링크(현재는 접속❌): https://www.sidepeek.site/
🔗 스웨거 링크: http://15.165.135.134:8080/api/v1/swagger-ui/index.html
Important
총 3명의 구성원으로 2024년 2월 1일부터 백엔드 개발을 진행하고 있습니다.
이세희 | 정의진 | 엄예림 |
@Sehee-Lee-01 | @uijin-j | @yenzip |
- 기능 개발, 버그 픽스 등 소스코드 변경이 필요할 때 새로운 브랜치(ex.
feat#1-xxxx
) 생성 후 개발 환경(dev
) 등의 Backbone 브랜치에 Merge - CI 테스트 통과 후, 최소 1명에게 Approve 받고 Merge 하기(@yenzip CI 설정)
- 일주일에 한 번씩 배포 환경(
main
) 브랜치에dev
브랜치 Merge 하기(@uijin-j CD 설정)
- CheckStyle 도입하여 build 실행마다 코드 컨벤션 확인 및 관리(@uijin-j 설정)
- 구글 자바 컨벤션 도입(Indent, Javadoc 등 팀 상황에 맞게 일부 수정)
- 그 외 커밋 컨벤션, 애너테이션 순서, 생성자, 메서드 네임 등 팀 방향성에 맞게 설정
- JaCoCo 도입으로 build 실행마다 테스트 커버리지 확인 및 관리(@Sehee-Lee-01 설정)
- Service 레이어 중심으로 테스트 커버리지 최소 90% 이상 되도록 작성
- Language: JAVA 17
- Server: Spring Boot 3.2.2, Spring Security
- ORM: Spring Data JPA, QueryDSL
- API Docs: Swagger
- DB: Flyway, MySQL, Redis
- Infra: Docker, GiHub Action, AWS(EC2, S3, RDS, CodeDeploy, ElasticCache, ACM, Route 53, IAM)
- Test: JUnit5, Mockito, Data Faker
- Etc: Slack API Client, Sentry
- 게시글
- 생성
- 프로젝트 상세 정보(주제, 요약, 링크, 기능 설명 등)를 저장할 수 있습니다.
- 기술스택 데이터를 검색해서 등록합니다.
- 회원 닉네임을 검색하여 프로젝트 멤버로 등록합니다. 비회원 멤버는 임의로 이름을 추가합니다.
- 수정
- 프로젝트 작성자와 멤버만 수정할 수 있습니다.
- 프로젝트 상세 정보(주제, 요약, 링크, 기능 설명 등)를 수정할 수 있습니다.
- 기술스택 데이터를 검색해서 등록합니다.
- 회원 닉네임을 검색하여 프로젝트 멤버로 등록합니다. 비회원 멤버는 임의로 이름을 추가합니다.
- 삭제
- 프로젝트 작성자만 삭제할 수 있습니다.
- 단건 조회
- 프로젝트에 대한 상세정보, 댓글, 조회수 등을 확인할 수 있습니다.
- 프로젝트를 조회하면 조회수가 올라갑니다.
- 목록 조회 및 검색
- 필터로 원하는 조건의 프로젝트를 검색할 수 있습니다.
- 좋아요
- 회원은 하나의 프로젝트에 좋아요를 한 번 누를 수 있습니다.
- 생성
- 댓글
- 생성
- 댓글에 대댓글을 생성할 수 있습니다.
- 익명 댓글로 설정할 수 있습니다.
- 수정
- 작성자만이 수정할 수 있습니다.
- 삭제
- 작성자만이 삭제할 수 있습니다.
- 생성
- 회원가입
- 이메일로 회원가입을 할 수 있습니다.
- 로그인
- 이메일 로그인을 할 수 있습니다.
- 소셜 로그인(깃허브)을 할 수 있습니다.
- 프로필 수정
- 회원의 상세정보(프로필 이미지, 소개글, 직군, 경력, 기술 스택 등)를 수정할 수 있습니다.
- 프로필 조회
- 회원 관련 상세 정보프로필 이미지, 소개글, 직군, 경력, 기술 스택 등)를 조회할 수 있습니다.
- 회원 관련 프로젝트 정보를 조회할 수 있습니다.
- 회원이 작성한 프로젝트, 멤버로 참여한 프로젝트, 댓글 단 프로젝트를 확인할 수 있습니다.
- 외부 의존성 추가시 Config Class 정의
- Config를 통해 추후 외부 의존성을 선택적으로 불러올 수 있는 환경을 구성
- 도메인별 패키지 구성
- 복잡한 서비스 구조를 단순화하고 가독성을 높이고자 도메인별 패키지 분리
- 클래스 안의 역할을 최소화하고자 Validator, Constant, ErrorMessage 클래스 구현 및 적용 ⇒ 덕분에 코드 수정이 더욱 간편해짐
- ex) 기획에서 닉네임 최대 길이 변경 → 닉네임 최대길이를 정의하는 상수 값만 바꾸면 전역으로 수정된다.(비즈니스 로직 구현 메서드, Swagger, 테스트 코드 등)
- AWS DEV, PROD 환경 분리
- PROD 환경은 서브넷 구성하여 RDS 외부 접근 제한
- CodeDeploy 설정으로 CD 구현
✅ 예외 인지 시간 단축
-
상황: 기존 Prod(운영), Dev(개발) 서버에서 핸들링 되지 않던 예외나 핸등링 되더라도 서버 운영상 문제가 있는 예외를 쉽게 인지하고자 Sentrty 연동 및 예외 자동 알림 설정 기능을 구현했습니다.
-
방법
-
결과: 기존에는 개발자가 직접 로컬에서 확인하거나 프론트엔드 개발자로부터 발생한 예외를 전달받았지만 Sentrty 연동 및 자동 알림 설정으로 동료들과의 예외 발생 상황과 관련한 불필요한 소통을 줄이고 예외 해결에만 집중할 수 있는 환경을 조성했습니다.
-
배운점: 예외 알림을 설정하면서 개발자가 인지하고 곧바로 처리해야 항 예외, 사용자 단에서 해결할 수 있는 예외 등을 구분하면서 서버 예외 처리에 대한 생각을 되짚어볼 수 있었습니다.
-
블로그
✅ 테스트 코드 중복 개선
-
상황: 각 테스트 코드에서 Entity, Dto, 값 생성 코드 중복이 발생하는 것을 확인했습니다. 서비스 특성상 Entity의 속성이 많았기 때문에 생성자가 긴 것이 원인이었습니다. 서비스 로직도 복잡하여 테스트 코드가 길어지니 가독성이 점점 안좋아졌습니다.
-
방법: 각각 테스트 클래스에서 중복되는 코드를 찾아서 테스트 환경 전역에서 사용할 수 있는 static 메서드로 정의하고 이러한 메서드를 제공하는 테스트 Fixture 제공 클래스🔗를 구현하여 팀원들에게 사용법을 공유했습니다. 이후 팀원들과 함께 Fixture 클래스를 구현해나가면서 중복을 줄였습니다.
-
결과: 각 테스트 코드에서 대략 633줄 이상의 코드 중복을 줄임으로써 가독성을 확보할 수 있었습니다. 또한 서비스 로직 테스트에만 집중할 수 있게 되었습니다.
-
배운점: 단위 테스트 원칙(FIRST)에서의 Fast는 테스트 실행 시간을 이야기하지만 실질적으로 개발자가 테스트 코드를 해석하고 작성하는 시간도 중요하다는 것을 알게 되었습니다.
Method | PATH | 설명 | 담당 |
---|---|---|---|
POST | /auth/reissue |
Access/Refresh Token 재발급 | @uijin-j |
POST | /auth/me |
Access Token 검증 | @uijin-j |
POST | /auth/login |
이메일 로그인(기본 로그인) | @uijin-j |
POST | /auth/login/{provider} |
소셜 로그인 | @uijin-j |
Method | PATH | 설명 | 담당 |
---|---|---|---|
GET | /users/{id} |
회원 프로필 상세 정보 조회 | @Sehee-Lee-01 |
GET | /users/{id}/projects |
회원 관련 프로젝트 조회(참여/좋아요/댓글) | @uijin-j |
GET | /users/nickname |
회원 닉네임 검색 | @Sehee-Lee-01 |
POST | /users |
회원 가입 | @uijin-j |
POST | /users/nickname/check |
닉네임 중복 확인 | @uijin-j |
POST | /users/email/check |
이메일 중복 확인 | @uijin-j |
PUT | /users/{id} |
회원 프로필 상세 정보 수정 | @Sehee-Lee-01 |
PUT | /users/{id}/password |
비밀번호 수정 | @uijin-j |
Method | PATH | 설명 | 담당 |
---|---|---|---|
GET | /projects |
프로젝트 전체 조회(검색) | @yenzip |
GET | /projects/{id} |
프로젝트 상세 조회(조회수, 좋아요 수, 댓글/대댓글) | @yenzip |
GET | /projects/weekly |
지난 주 인기 프로젝트 조회(최대 5개) | @Sehee-Lee-01 |
POST | /projects |
프로젝트 생성 | @Sehee-Lee-01 |
PUT | /projects |
프로젝트 수정 | @Sehee-Lee-01 |
DELETE | /projects |
프로젝트 삭제 | @Sehee-Lee-01 |
Method | PATH | 설명 | 담당 |
---|---|---|---|
POST | /comments |
댓글 생성 | @Sehee-Lee-01 |
PUT | /comments/{id} |
댓글 수정 | @Sehee-Lee-01 |
DELETE | /comments/{id} |
댓글 삭제 | @Sehee-Lee-01 |
Method | PATH | 설명 | 담당 |
---|---|---|---|
POST | /likes |
좋아요 생성 | @yenzip |
DELETE | /likes/{id} |
좋아요 삭제 | @yenzip |
Method | PATH | 설명 | 담당 |
---|---|---|---|
POST | /files |
이미지 파일 업로드 | @Sehee-Lee-01 |
Method | PATH | 설명 | 담당 |
---|---|---|---|
GET | /skills |
기술스택 검색 | @Sehee-Lee-01 |
- Project homepage: https://www.sidepeek.site/
- Repository: https://github.com/side-peek/sidepeek_backend/
- Issue tracker: https://github.com/side-peek/sidepeek_backend/issues/
- 보안 취약점 등의 민감한 이슈인 경우 해당 [email protected]으로 연락주십시오.
- 관련 프로젝트
- SidePeek 프론트엔드: https://github.com/side-peek/sidepeek_frontend