

- 프로젝트 기간: 2024.06.03 ~ 2024.06.10
- 프로젝트 설명: 칸반 보드 기반의 프로젝트 관리 시스템 개발
[아키텍처 다이어그램 필요]
- 사용자 관리: 회원가입, 로그인, 권한 부여 (Manager, Member)
- 보드 관리: 보드 생성, 초대, 초대할 사용자 목록 조회
- 컬럼 관리: 컬럼 추가, 이동, 삭제
- 카드 관리: 카드 추가, 이동, 삭제, 댓글
- 권한 관리: AOP 기반 접근 제어 및 Role 기반 인증 처리
역할 | 팀장 박다미 | 팀원 김현민 | 장재현 | 팀원 조성훈 |
---|---|---|---|---|
담당 기능 | 회원관련 기능 사용자 초대 카드,컬럼이동 카드,댓글 CRUD |
로그아웃 회원탈퇴 |
컬럼CRUD | 보드CRUD 프론트엔드 |
기존 방식의 문제점
- 각 카드가 개별적으로 위치를 관리 → 모든 카드의 위치를 업데이트해야 하는 성능 저하 발생
- 대량의 데이터가 수정될 경우, 데이터베이스 부하 증가
개선 방식
- 중앙에서 카드 위치를 관리 → 불필요한 업데이트 최소화
- 트랜잭션 단위 최적화 → 변경 사항이 있을 때만 업데이트 수행
개선 후 | 개선 후 |
---|---|
![]() |
![]() |
- 기존 fetchCount() 사용 → fetchOne() + select(qComment.count()) @BatchSize(size = 10)
- N+1 문제 해결: Fetch Join, EntityGraph, BatchSize 적용
- 복합 인덱스 사용: 카드, 댓글, 컬럼 관련 조회 최적화
쿼리 최적화 개요
- fetchCount() 대신 fetchOne() + count()를 활용하여 필요 없는 데이터 조회 감소
- N+1 문제를 해결하기 위해 Fetch Join 및 BatchSize를 활용
- 카드 및 컬럼 이동 시 복합 인덱스를 적용하여 검색 속도 개선
설명 | explain 개선결과 |
---|---|
매니저 확인 | ![]() |
member인지/ Manager인지 확인 | ![]() |
초대된 사용자인지 여부 확인 | ![]() |
카드 순서 관리 성능 문제 및 비정규화 도입 | ![]() |
- 문제: 여러 스레드가 동시에 데이터를 수정할 경우, 트랜잭션 충돌 발생
- 해결책: StampedLock을 활용하여 읽기 성능 최적화 및 충돌 최소화
개선 후 | 개선 후 |
---|---|
![]() |
![]() |
- 이전 방식:
@Version
기반 낙관적 락 사용 → 읽기 중 변경 감지 어려움 - 개선 방식: StampedLock 적용하여 읽기 중 데이터 변경 감지 및 안전한 재처리

- 이슈 관리: Jira를 활용한 GitHub 연동
- 코드 스타일: Java 코드 컨벤션 준수, MapperStruct 활용하여 가독성 향상
🔗 Jira link