Skip to content

인스타그램 서버의 구현과 테스트 코드 작성으로 API구현 능력을 기르는 것을 목표로 합니다.

Notifications You must be signed in to change notification settings

COW-edu/Instagram-Server-Clone

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 

Repository files navigation

카우 프로젝트 미션, 인스타그램 서버 만들기

미션 목표


그동안의 미션들로 여러분들은 Spring을 사용해 기본적인 API를 구현하는 능력을 기를 수 있었어요.

이제 인스타그램 클론코딩을 통해 실제 서비스를 개발하기 위해 문서 설계부터 배포까지 경험해보는 시간을 가질꺼에요. 단순히 API를 개발하는 것이 아닌 작성한 코드에 대해 테스트 코드를 작성하고 배포 파이프라인을 구축하는 등 많은 고민 포인트가 있을 거에요.

처음 마주하는 문제가 많을 것이고 모르는 내용이 많이 나올 것이라고 생각해요. 하지만 너무 많은 자료들이 이미 있습니다. 모르는 내용이 나왔을때 이를 해결하는 능력 또한 기대하고 있어요.

구현해야할 내용이 정말 많아요. 아마도 4주동안 꽤 많은 시간을 쏟지 않는다면 어려울 수 있어요. 디스코드 Q&A 게시판을 적극적으로 이용해주세요.

이번 미션의 성장 포인트는 다음과 같아요.

  • Convetion을 지키며 개발할 수 있다.
  • 가독성 있는 클린 코드를 작성할 수 있다.
  • 요구사항을 파악하여 프로덕트 서버를 개발할 수 있다.
  • 테스트 코드를 통해 구현한 API를 테스트할 수 있다.
  • 인증 기능을 구현할 수 있다.
  • S3를 사용해 이미지를 저장할 수 있다.
  • CI/CD 파이프라인을 통해 자동 배포를 적용할 수 있다.
  • AWS 등 클라우드를 이용하여 자신의 서버를 배포할 수 있다.

구현 범위


일반적인 인스타그램 앱을 생각하시면 될 것 같아요. 저희가 구현할 내용은 다음과 같아요.

API 스펙을 별도로 제공할까 했으나…! 여러분들이 직접 와이어프레임을 보고 API를 짜는 능력을 함양시키기 위해 뺐습니다 ㅎㅎ~~(이게 다 여러분들은 위한 길입니다)~~

로그인은 세션방식을 사용해도, JWT를 사용해도 됩니다. 따로 제약을 두지 않을테니 편한 방식을 선택해주세요. (만약 세션 방식도, JWT도 오늘 처음 들어본다면 이 참에 로그인에 대해 자세히 공부해봐요)

  • 글 생성
    • 태그나 장소 같은 것은 선택적으로 하셔도 됩니다. 이미지와 텍스트만 api에 넣으셔도 괜찮아요.
    • 이미지를 올릴 수 있어야해요. 10장 제약조건은 많으니 한장만 올릴 수 있게해도 상관 없습니다.
  • 글 수정
  • 글 삭제
  • 댓글 생성
  • 댓글 수정
  • 댓글 삭제
  • 답글 생성
    • 답글의 Depth는 1이에요
  • 답글 수정
  • 답글 삭제
  • 피드 조회
    • 피드에 조회되는 게시글들은 내가 팔로우 한 사람이에요
    • 좋아요 기능을 구현했다면 내가 좋아요 누른글은 따로 표시를 해주세요.
  • 좋아요 누르기
    • 좋아요는 고려해야할 점이 많습니다. 이왕이면 마지막에 구현하시는것을 추천드려요.
    • 시간이 애매하다면 좋아요 기능을 구현하는 것보다는 테스트코드에 신경써보아요.
  • 좋아요 취소
  • 회원 가입
  • 회원 탈퇴
  • 프로필 조회
  • 프로필 수정
    • 프로필 수정을 할때 프로필 사진을 등록할 수 있어야해요
  • 팔로우
  • 팔로우 취소

와이어프레임


[피드목록 조회]

instagrma1

[글 등록, 수정, 삭제]

instagram2

[팔로우&팔로 취소][프로 조회&수정]

instagram3

제약 조건


  • Commit Convetion을 지켜주세요.
    • 하나의 커밋에 여러 타입이 존재하는 경우 상위 우선순위의 타입을 사용한다.
    • fix: 버스 픽스
    • feat: 새로운 기능 추가
    • refactor: 리팩토링 (버그픽스나 기능추가없는 코드변화)
    • docs: 문서만 변경
    • style: 코드의 의미가 변경 안 되는 경우 (띄어쓰기, 포맷팅, 줄바꿈 등)
    • test: 테스트코드 추가/수정
    • chore: 빌드 테스트 업데이트, 패키지 매니저를 설정하는 경우 (프로덕션 코드 변경 X)
  • Code Convention을 지켜주세요.
  • 클린코드 규칙을 지켜주세요
    1. 객체 생성에도 유의미한 이름을 사용하라
    2. 비즈니스 로직을 담는 변수명을 사용하라
    3. 메소드는 가급적 하나의 역할만 해야한다
    4. for문 사용 금지(java8 이후로 제공되는 stream 메소드만을 사용)
    5. if문 중첩 금지(한 메소드에서 오직 한 단계의 들여쓰기만을 허용)
    6. else문을 사용하지 않는다(early return 적용)
    7. 의미를 파악하기 어려운 숫자를 사용하지 않는다(매직 넘버 사용)
    8. 한 줄에 120까지만 허용한다(그 이상 줄바꿈 필요)
  • whitelist에 등록되어야할 API 목록
    • 회원가입, 로그인, 프로필 조회는 별도의 인증 없이 누구나 접근할 수 있어야합니다.

구현 범위에 대한 상세 설명


  1. N+1문제가 일어나지 않게 조심해요.

    N+1문제가 무엇일까요? 어떻게 N+1 문제가 일어나는 것일까요? sql문을 직접 확인해 내가 원하는대로 쿼리가 나가고 있는지 직접 확인해봐요.

  2. 전역적으로 예외를 처리하는 클래스를 만들어요.

    @ControllerAdvice를 사용하면 편리하게 전역예외를 처리할 수 있어요.

  3. JaCoCo를 활용하여 가급적 높은 code coverage를 달성해보아요. 이왕이면 80% 이상을 목표해보아요.

    JaCoCo는 내가 작성한 테스트코드가 얼마나 내 코드를 커버하고 있는지 측정해줘요.

    작성한 기능에 대해서 테스트 코드를 작성해보세요. JUnit5와 Mockito를 사용하세요.

    테스트 코드가 없이 내가 작성한 로직이 정상적으로 돌아갈 수 있을 것이라고 확신할 수 있으신가요?

    통합테스트와 단위테스트의 차이는 뭘까요? 테스트만해도 공부할 내용이 정말 많아요. 개인적으로 기능보다 더 초점을 두었으면 합니다.

  4. Github Actions을 사용해 배포 파이프라인 구축해보아요.

    code가 push가 되면 자동으로 배포를 할 수 있게 파이프라인을 구축해요.

    Github Actions, AWS, CI/CD 라는 키워드만 검색하셔도 정말 내용이 많이 나와요.

    왜 CI/CD가 필요할까요? Github Actions은 무엇일까요?

  5. AWS 클라우드 환경 사용하기

    AWS ec2는 aws에서 제공하는 클라우드 컴퓨팅 서비스에요.

    배포를 하지 않은 서비스는 나 혼자 밖에 사용할 수 없어요.

    이것 또한 관련 내용이 정말 많습니다. 직접 하면서 많은 것을 느끼실 수 있을꺼에요.

  6. S3를 사용해 이미지 저장하기

    S3는 무엇이고, 왜 S3를 사용할까요? 이미지를 데이터베이스에 저장할 수는 없을까요?

    프론트엔드가 없어 Presigned URL 방식을 사용하기 어려우니, 이미지를 form-data 형식으로 전송해 직접 업로드를 해야할꺼에요. s3와 같은 저장소에 따로 저장하고 url을 저장하는 로직은 mock으로 처리하셔도 무방합니다.

    Presigned URL은 무엇일까요? application-json, form-data 형식은 무엇일까요?

  7. 페이지네이션 시 커서 방식 적용

    페이지네이션은 무엇인가요? 왜 페이지네이션을 사용하는 걸까요? 페이지네이션에는 어떤 방식이 있을까요? 인스타그램의 경우 왜 커서 방식의 페이지네이션을 택했는지 고민해보면 좋을 것 같아요.

  8. Swagger 사용하기

    API를 문서화 하는 것은 프론트엔드와의 소통, 백엔드 개발자간에 소통에 있어 정말 중요해요.

    만약 API 문서가 변경될 때마다 일일이 문서에서 이를 수정한다면 많이 귀찮을꺼에요.

    Swagger는 이러한 문제의 해결점이 될 수 있어요. Swagger를 통해 API문서화를 자동화해요.

About

인스타그램 서버의 구현과 테스트 코드 작성으로 API구현 능력을 기르는 것을 목표로 합니다.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published