1. 프로젝트 개요
- 스파르타 코딩클럽 내일 배움캠프 Spring_3기 심화주차 팀프로젝트 과제
- Trello 아이디어를 통한 어플리케이션 서비스를 구현
- JPA, Spring Boot로 서비스 구현
2. 프로젝트 요구 명세서
- 사용자 관리 기능
- [ ] 로그인 / 회원가입 기능
- [ ] 사용자 정보 수정 및 삭제 기능
- 보드 관리 기능
- 보드 생성
- 보드 수정
- 보드 이름
- 배경 색상
- 설명
- 보드 삭제
- 생성한 사용자만 삭제를 할 수 있습니다.
- 보드 초대
- 특정 사용자들을 해당 보드에 초대시켜 협업을 할 수 있어야 합니다.
- 컬럼 관리 기능
- 컬럼 생성
- 보드 내부에 컬럼을 생성할 수 있어야 합니다.
- 컬럼이란 위 사진에서 Backlog, In Progress와 같은 것을 의미해요.
- 컬럼 이름 수정
- 컬럼 삭제
- 컬럼 순서 이동
- 컬럼 순서는 자유롭게 변경될 수 있어야 합니다.
- e.g. Backlog, In Progress, Done → Backlog, Done, In Progress
- 컬럼 순서는 자유롭게 변경될 수 있어야 합니다.
- 컬럼 생성
- 카드 관리 기능
- 카드 생성
- 컬럼 내부에 카드를 생성할 수 있어야 합니다.
- 카드 수정
- 카드 이름
- 카드 설명
- 카드 색상
- 작업자 할당
- 작업자 변경
- 카드 삭제
- 카드 이동
- 같은 컬럼 내에서 카드의 위치를 변경할 수 있어야 합니다.
- 카드를 다른 컬럼으로 이동할 수 있어야 합니다.
- 카드 생성
- 카드 상세 기능
- 댓글 달기
- 협업하는 사람들끼리 카드에 대한 토론이 이루어질 수 있어야 합니다.
- 날짜 지정
- 카드에 마감일을 설정하고 관리할 수 있어야 합니다.
- 댓글 달기
3. 개발 인원
- 5명
4. 개발 기간
- 개발 시작 일자: 2023년 12월 26일
- 개발 완료 일자: 2024년 1월 2일
5. 개발 언어
- Java
- OpenJDK version 17.0.8.1
- Spring Boot 3.1.6
- mysql 8.0.28
6. 프로젝트 소개
프로젝트 소개
- Trello 프로젝트
- 사용자가 원하는 할일을 추가하고 관리할 수 있는 일정 관리 프로그램
7. 프로젝트 진행 및 고찰
이번 프로젝트를 진행하면서 trello에 대해서 사용을 안 해봤기 때문에 어떤 방식으로 동작하는지 잘 이해가 안 됐다.
진행함에 있어서 지식이 부족했기 팀원분들과 소통을 하면서 Trello에 대한 전반적인 이해를 했고 그것을 바탕으로 팀원 분들과 API 명세서, ERD, 와이어 프레임을 구성했다. ERD를 작성하면서 주로 핵심적인 부분은 복합키를 사용했다는 점인데 복합키 자체가 변경되지 않는 PK 조합으로 복합키를 설정하여 식별함으로써 데이터 무결성을 확보했다.
https://developer-backend.tistory.com/65
프로젝트 2일 차에는 Card CRUD에 대한 기본적인 틀을 만들고 Service부터 기능을 작성하는데 Card생성 부분에 작업자를 저장할 복합키가 필요하여 WokerID와 Worker Entity를 생성하고 @Embeddable 방식을 통한 복합키를 완성했다.
이후 Card를 생성기능을 구현할 때 Worker를 등록해야 되는데 워커를 등록하려면 CardID가 필요하고 Card를 등록하려면 Worker가 필요한 복합기저장에 관련된 문제가 발생했다.
https://developer-backend.tistory.com/66
위에서 제시했던 문제들을 3일 차에 해결을 했다. 해결은 단순했다.
CardEntity에 Worker객체를 등록하면 Cascasde설정을 통해 영속성이 끝나기 전 임시 ID를 통해 Worker에도 등록이 된다.
Card 생성문제를 해결하고 Card 순서 관리에 대한 고민이 생겼다. 처음 시도했었던 방법은 Card 우선순위 방식이었다. 순서를 부여하고 Card의 순서를 변경하려고 할 때 변경한 카드 위치에 따라 뒤에 있는 카드의 순서를 수정해야 했다. 이러한 방식은 불필요하다고 생각했다. 따라서 최적화를 위해 고민하다 보니 가중치 방식을 사용하여 최적화를 시도했다.
가중치 방식은 Card 번호를 변경할 위치 i와 i-1의 카드 번호를 더하고 2로 나눈 값을 적용하여 순서를 변경하는 방식이다.
위의 문장에 사용한 방식을 적용하여 Card의 위치이동에 대한 쿼리문을 최적화했다.
https://developer-backend.tistory.com/67
4일 차에는 기존에 Card를 생성할 때 가중치를 부과했었던 방식에서 자원사용의 최적화를 진행했다. Column에서 Maxweight 필드값을 이용해 가중치를 부과하는 방식을 사용하고 있었으나 이 부분은 DB의 자원을 비효율적으로 사용하고 있을 뿐만 아니라 Card가 Column에 너무 높은 의존성을 가지고 있었다.
따라서 이 부분을 해결하기 위해 기존에 구성했던 방식을 변경하기로 했다.
변경할 방식은 카드를 생성할 때 CardRepository에 위치한 Column에 해당하는 Card의 최대 가중치 값을 가져와 거기서 추가로 가중치를 부여하여 Card를 생성하는 방식이다.
위 문장의 방식을 사용하면 Column Entity에 대한 의존성을 줄여줄 뿐만 아니라 DB의 자원을 최적화시켜줄 수 있다.
https://developer-backend.tistory.com/68
프로젝트 5~8일 차에는 완성한 코드를 바탕으로 테스트를 진행하면서 Card를 제외한 모든 부분에 발생한 에러를 해결하는데 집중했다. 테스트를 진행하면서 Card에 순서를 변경할 때 발생했던 제일 큰 문제는 위치한 카드의 순서보다 작은 순서로 이동할 때는 문제가 없었지만 반대의 경우에는 에러가 발생했다.
따라서 추가적으로 Card의 순서를 비교하여 결과를 체크하는 메서드를 추가하여 순서에 대한 문제를 해결했다.
추가적으로 구현한 기능은 마감기한이다. 사실 초기 구상시에 마감기능을 생각하지 못해 마지막에 기능을 추가하려다 보니 로직에 대한 문제가 발생했고 이 기능을 통해 무언가를 작동시키려면 상당한 변경사항이 생겼다. 따라서 Request에 마감기한을 추가하는 선에서 마무리했지만 확장성을 고려해 Spring에서 LocalDateTime을 입력받을 때 사용하는 어노테이션에 대해 공부를 진행했고 고려한 부분까지 포함해서 RequestDto에 마감기한을 추가했다.
https://developer-backend.tistory.com/69
8. 느낀점
이번 프로젝트를 진행하면서 제일 많이 경험했던 것은 DB 최적화였다. 어떤 방식을 사용해야 최대한 적은 쿼리를 사용하면서 최소한의 DB자원을 사용하여 데이터를 가져올 수 있는지가 핵심이었다. 여태껏 진행했던 프로젝트에서는 그러한 문제를 깨달을 수 없는 Entity 간의 연관관계를 맺고 있었기 때문에 처음에는 당황했지만 팀원과 하나하나 해결해 나가면서 이 프로젝트에서 할 수 있는 최적화를 진행했다는 것에 만족한다.
이제는 프로젝트를 진행할 때 그냥 쿼리하나에도 최적화할 수 있는 방법을 고민하면서 코드를 작성할 것 같다.
9. GitHub URL
https://github.com/jshstar/Trello-project
10. YouTube URL
https://www.youtube.com/watch?v=4jMr9MZEceI&feature=youtu.be
'프로젝트' 카테고리의 다른 글
Spring Trello 프로젝트 KPT 회고 (1) | 2024.01.03 |
---|---|
Spring 백오피스 프로젝트 KPT 회고 (0) | 2023.12.15 |
Spring 백오피스 project (0) | 2023.12.15 |
Spring newsfeed project (0) | 2023.11.28 |
Spring newsfeed team project -KPT회고 (0) | 2023.11.27 |