이번 한 학기 동안 에브리타임 클론코딩을 주제로 과제를 진행합니다. 세미나를 따라가면 게시글, 댓글, 좋아요 등 기능을 가진 API 서버를 만들 수 있습니다.
1차시 과제에서는 게시판, 게시글, 댓글 기능을 구현하며 데이터베이스 CRUD를 실습하고 구조를 모델링해봅니다. 또한 커서 기반 페이지네이션 및 인덱스 적용을 통해 성능을 최적화하는 방법을 알아봅니다.
0차시 과제에서와 같이 앞으로도 데이터베이스로 MySQL을 사용합니다. 로컬 서버를 띄우기 전 docker compose up -d 로 MySQL을 띄워주세요.
- 게시판(board), 게시글(post), 댓글(comment) 관련 API를 구현합니다.
- board와 post의 모델링과 DTO(data transfer object)는 주어져 있습니다.
- comment는 DTO만 주어져 있고 구조 모델링을 직접 하셔야 합니다.
- post를 불러올 때는 커서 기반 페이지네이션을 사용합니다.
- optional) post와 comment에 인덱스를 추가하여 성능을 최적화해야 합니다.
- 게시글 생성
- 로그인한 사용자는 특정 게시판에 제목과 내용을 포함하여 게시글을 작성할 수 있습니다.
- 제목과 내용은 비어있을 수 없습니다.
- 게시글 단건 조회
- 게시글의 ID를 통해 특정 게시글을 조회할 수 있습니다.
- 게시글 목록 조회
- 특정 게시판의 게시글 목록을 페이지네이션하여 조회할 수 있습니다.
- 게시글은 생성된 시간(내림차순), ID(내림차순) 순서로 정렬됩니다.
- 각 게시글 정보에는 작성자 정보와 게시판 정보가 포함되어야 합니다.
- 게시글마다 작성자와 게시판을 쿼리하면 DB와 통신하는 시간이 길어지니, JOIN해서 한 번에 가져옵시다.
- 요청당 쿼리가 2회만 나가도록 테스트코드가 짜여져 있습니다. (1회는 게시판 존재 여부 조회를 위한 것)
- 힌트: PostWithUserAndBoard, Spring Data Projection
- Optional) 게시글이 많이 쌓여도 좋은 조회 성능을 내기 위해 인덱스를 추가해봅시다.
- 쿼리가 인덱스를 잘 타는지는 DB에 충분히 많은 레코드를 쌓고 해당 쿼리를 EXPLAIN하여 알 수 있습니다. (자세한 내용은 구글링)
- 또는 리뷰를 요청하셔도 됩니다.
- 게시글 수정
- 게시글 작성자는 본인의 게시글 제목이나 내용을 수정할 수 있습니다.
- 수정하려는 제목이나 내용은 비어있을 수 없습니다.
- 작성자가 아닌 다른 사용자는 게시글을 수정할 수 없습니다.
- 게시글 삭제
- 게시글 작성자는 본인의 게시글을 삭제할 수 있습니다.
- 게시글을 삭제하면 해당 게시글에 달린 댓글도 모두 삭제됩니다.
- 작성자가 아닌 다른 사용자는 게시글을 삭제할 수 없습니다.
- 댓글 생성
- 로그인한 사용자는 특정 게시글에 댓글을 작성할 수 있습니다.
- 댓글 내용은 비어있을 수 없습니다.
- 댓글 목록 조회
- 특정 게시글에 작성된 모든 댓글을 조회할 수 있습니다.
- 댓글은 생성된 시간(내림차순) 순서로 정렬됩니다.
- Optional) 게시글이 많이 쌓여도 좋은 조회 성능을 내기 위해 인덱스를 추가해봅시다.
- 쿼리가 인덱스를 잘 타는지는 DB에 충분히 많은 레코드를 쌓고 해당 쿼리를 EXPLAIN하여 알 수 있습니다. (자세한 내용은 구글링)
- 또는 리뷰를 요청하셔도 됩니다.
- 댓글 수정
- 댓글 작성자는 본인의 댓글 내용을 수정할 수 있습니다.
- 수정하려는 내용은 비어있을 수 없습니다.
- 작성자가 아닌 다른 사용자는 댓글을 수정할 수 없습니다.
- 댓글 삭제
- 댓글 작성자는 본인의 댓글을 삭제할 수 있습니다.
- 작성자가 아닌 다른 사용자는 댓글을 삭제할 수 없습니다.
- test를 모두 통과하는 것을 목표로 구현해 주세요.
- 테스트 코드와 .github 디렉토리 내의 workflow 파일은 임의로 건드리지 말아주세요.
- 데이터베이스 스키마를 어떻게 모델링할지 주어진 DTO에서 힌트를 얻을 수도 있습니다.
- 객체를 모델링할때 그에 맞는 DDL을 추가해야 할 수 있습니다.
- 커밋하기 전
./gradlew ktlintFormat을 실행해서 lint를 맞춰주세요.- 매번 하기 귀찮다면
./gradlew addKtlintFormatGitPreCommitHook을 실행하면 commit할 때마다 수행되도록 hook을 만들 수 있습니다.
- 매번 하기 귀찮다면
- 이 세미나에서는 Github Classroom을 사용하여 과제 제출 및 채점을 자동화합니다.
master브랜치에 변경 사항을 커밋한 후 push하면 autograder가 ktlint check와 test를 수행하여 모두 통과하는지를 자동으로 점검합니다. - 별도의 과제 제출용 PR을 만들 필요는 없습니다.