
Instakyuram 소개3️⃣ 프로젝트 진행 방식4️⃣ Tech Stack5️⃣ 기여한 역할6️⃣ 트러블 슈팅🧐 게시글에 이미지들 중 하나라도 업로드에 실패하면 어떻게 해야할까?🧐 동적 쿼리로 커서페이징 처리를 어떻게 해야하지?7️⃣ 프로젝트 회고8️⃣ 프로젝트를 하면서 느낀점
Instakyuram 소개
- 데브코스에서 6월22일까지 배운 기술들을 통해 인스타그램을 클론코딩 해보는 프로젝트
[팀구성]
- 팀장
- 곽동운
- 스크럼마스터
- 김형욱
- 개발자
- 박혜빈
- 김병연
- 박진형
1️⃣ 프로젝트 관리
프로젝트 관리3️⃣ 프로젝트 진행 방식

- 4~5일 주기로 스프린트 및 회고를 진행하였습니다.
- 13:00 ~19:00 코어타임을 정해 스크럼 및 프로젝트를 진행하였습니다.
- 협업 도구로 Jira, Notion, Slack, Gather를 사용하였습니다.
4️⃣ Tech Stack

[기술 스택을 이렇게 선택한 이유는 무엇인가요?]
- SpringBoot의 최신 버전을 사용함으로써 Spring Security의 WebSecurityConfig가 Deplicated 된 사실을 알게 된 적이 있었습니다. 이 과정에서 자신이 쓰고 있는 기술이 어떻게 업데이트 되고 있는지에 대한 꾸준한 관심이 필요하다는 것을 느꼈습니다.
- 따라서 개발자는 항상 최신 기술에 관심을 많이 가져야 한다고 생각하였으며 기술스택을 최신버전 위주로 선택하게 되었습니다.
- 백엔드 개발자끼리 진행하는 프로젝트였지만, 페이지가 없다면 백엔드 코드는 의미없다고 생각했습니다.
- 하지만 새로운 기술을 습득하는 것은 백엔드 개발에 초점을 흐리게 할 수 있기 때문에 가장 익숙하게 사용한 타임리프를 선택하게 되었습니다.
[어떤 이점이 있었나요?]
- 가장 먼저 자바17을 사용함으로써 레코드와, 개선된 스위치문을 사용할 수 있었습니다.
- 레코드를 적극적으로 사용하여 코드의 간결함과 불변성의 이점을 얻을 수 있었습니다.
- 개선된 스위치문을 통해 보다 더 간결한 코드를 작성할 수 있었습니다.
- 자신이 개발한 API가 아닌 팀원이 만든 API에 대해 페이지를 개발하는 규칙을 정했었습니다.
- 페이지 개발까지 신경을 쓰면서 프론트 입장에서 한번 생각해 볼 수 있는 경험이 되었습니다.
- Flyway 도입으로 Database 설계가 변경 될 시 유연하게 대응할 수 있었으며 변경 이력 확인이 가능하여 편리함을 얻을 수 있었습니다.
5️⃣ 기여한 역할
- 스크럼 진행 및 프로젝트 전반적인 문서화 관리
- 스크럼 마스터의 역할로써 프로젝트 기간동안 매일 스크럼을 진행하여 프로젝트의 진행상황 및 공유사항을 전달하였습니다.
- 프로젝트 문서의 최신화를 위해 전반적인 문서화가 항상 최신화가 되어 팀원간의 리소스 발생을 최소화도록 하였습니다.
- 이미지 업로더 구현
- 게시글에 올라가는 프로필 이미지, 게시글 이미지를 로컬에 저장하는 코드를 작성하였습니다.
- 서비스 레이어에서 데이터베이스 or 로컬에 이미지 저장이 실패할 때 롤백이 될 수 있도록 작성하였습니다.
- API 구현
- 게시글 작성 API, 썸네일 조회 API, 게시글 조회 API
- 게시글 조회는 JPA의 Criteria를 사용하여 동적쿼리로 커서 페이징 방식을 적용하였습니다.
- 테스트코드 작성
- 서비스 테스트코드 작성
- 기술문서화
- Criteria 사용방법
- RestDocs 사용방법
- Flyway 사용방법
6️⃣ 트러블 슈팅
🧐 게시글에 이미지들 중 하나라도 업로드에 실패하면 어떻게 해야할까?
[문제점]
- 게시글의 내용이 먼저 데이터베이스에 저장한 후에 이미지를 저장하는 흐름으로 개발을 진행하였습니다.
- 하지만 게시글의 테이블과 게시글 이미지 테이블이 따로 존재했기 때문에 이미지가 하나라도 업로드에 실패하면 롤백을 해줘야 하는 문제점이 생겼으며 이미 저장된 이미지들을 다시 지우는 작업을 해줘야 한다고 생각했습니다.
[해결]
- 저장된 파일의 path를 리스트로 보관하며 중간에 실패하면 rollback 메서드를 만들어 지우도록 구현하였습니다.


🧐 동적 쿼리로 커서페이징 처리를 어떻게 해야하지?
[고민한점]
- 게시글을 최신 순으로 커서 페이징을 처리해야 하는데 동적쿼리로 어떻게 처리할지 고민을 많이 하였습니다.
[해결]
- 저희는 이번 프로젝트에서 순수 배운 기술로만 프로젝트를 진행하는게 목표였기 때문에 JPA의 Criteria를 사용하였습니다.

- 다음 페이지가 있는지 없는지에 대한 동적쿼리를 적용하여 JPA의 exsitsBy처럼 사용하기 위해서는 다음 데이터가 있는지 없는지에 대한 쿼리를 한번 더 수행해야 하며 하나라도 있으면 true로 반환하도록 하였습니다.
- 실제 JPA의 exsistBy도 동일하게 사용하고 있는 부분을 참고하였습니다.

7️⃣ 프로젝트 회고
8️⃣ 프로젝트를 하면서 느낀점
- 처음으로 팀 프로젝트를 진행하게 되었는데 Jira와 스프린트라는 것을 처음 경험하였고 협업 프로세스가 이루어지는 전반적인 과정을 몸으로 느낄 수 있었습니다.
- 제한된 기술에서 요구사항을 충족시키는 과정에서 할 수 있었던 고민들이 더욱 성장할 수 있도록 만들어 준 것 같았습니다.