Skip to content

aystoe/semminar_temp

Repository files navigation

Review Assignment Due Date

Seminar-2025-springboot-assignment

이번 한 학기 동안 에브리타임 클론코딩을 주제로 과제를 진행합니다. 세미나를 따라가면 게시글, 댓글, 좋아요 등 기능을 가진 API 서버를 만들 수 있습니다.

1차시 과제에서는 게시판, 게시글, 댓글 기능을 구현하며 데이터베이스 CRUD를 실습하고 구조를 모델링해봅니다. 또한 커서 기반 페이지네이션 및 인덱스 적용을 통해 성능을 최적화하는 방법을 알아봅니다.

시작하기

0차시 과제에서와 같이 앞으로도 데이터베이스로 MySQL을 사용합니다. 로컬 서버를 띄우기 전 docker compose up -d 로 MySQL을 띄워주세요.

1차시 과제 - 데이터베이스

  • 게시판(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을 만들 수 있습니다.

Submission

  • 이 세미나에서는 Github Classroom을 사용하여 과제 제출 및 채점을 자동화합니다. master 브랜치에 변경 사항을 커밋한 후 push하면 autograder가 ktlint check와 test를 수행하여 모두 통과하는지를 자동으로 점검합니다.
  • 별도의 과제 제출용 PR을 만들 필요는 없습니다.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages