본문 바로가기
TIL

[231116] Spring 숙련주차 개인과제

by 진진리 2023. 11. 16.
728x90

Spring 숙련주차 개인과제

"회원가입, 로그인 기능이 있는 투두앱 백엔드 서버 만들기"

 

요구사항

  1. 회원 가입 API
    • username, password를 Client에서 전달받기
    • username은 최소 4자 이상, 10자 이하이며 알파벳 소문자(a~z), 숫자(0~9)로 구성되어야 한다.
    • password는 최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9)로 구성되어야 한다.
    • DB에 중복된 username이 없다면 회원을 저장하고 Client 로 성공했다는 메시지, 상태코드 반환하기
  2. 로그인 API
    • username, password를 Client에서 전달받기
    • DB에서 username을 사용하여 저장된 회원의 유무를 확인하고 있다면 password 비교하기
    • 로그인 성공 시, 로그인에 성공한 유저의 정보와 JWT를 활용하여 토큰을 발급하고, 발급한 토큰을 Header에 추가하고 성공했다는 메시지, 상태코드 와 함께 Client에 반환하기
  3. 할일카드 작성 기능 API
    • 토큰을 검사하여, 유효한 토큰일 경우에만 할일 작성 가능
    • 할일 제목,할일 내용, 작성일을 저장할 수 있습니다. 
    • 할일 제목, 할일 내용을 저장하고
    • 저장된 할일을 Client 로 반환하기(username은 로그인 된 사용자)
  4. 선택한 할일카드 조회 기능 API
    • 선택한 할일 의 정보를 조회할 수 있습니다.
      • 반환 받은 할일 정보에는 할일 제목,할일 내용, 작성자 , 작성일정보가 들어있습니다.
  5. 할일카드 목록 조회 기능 API
    • 등록된 할일 전체를 조회할 수 있습니다.
      • 회원별로 각각 나누어서 할일 목록이 조회됩니다.
      • 반환 받은 할일 정보에는 할일 제목, 작성자 , 작성일, 완료 여부정보가 들어있습니다.
      • 조회된 할일 목록은 작성일 기준 내림차순으로 정렬 되어있습니다.
  6. 선택한 할일카드 수정 기능 API
    • 선택한할일카드의 제목, 작성 내용을 수정할 수 있습니다.
      • 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 수정 가능
      • 할일 제목, 할일 내용을 수정하고 수정된 할일 정보는 Client 로 반환됩니다.
    • 수정된 할일의 정보를 반환 받아 확인할 수 있습니다.
      • 반환 받은 할일 정보에는 할일 제목,할일 내용, 작성자 , 작성일정보가 들어있습니다.
  7. 할일카드 완료 기능 API
    • 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 할일카드 만 완료 가능
    • 완료처리 한 할일카드는 목록조회시 완료 여부필드가 TRUE 로 내려갑니다.
    • 완료 여부 기본값은 FALSE
  8. 댓글 작성 API
    • 토큰을 검사하여, 유효한 토큰일 경우에만 댓글 작성 가능
    • 선택한 할일의 DB 저장 유무를 확인하기
    • 선택한 할일이 있다면 댓글을 등록하고 등록된 댓글 반환하기
  9. 댓글 수정 API
    • 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 댓글만 수정 가능
    • 선택한 댓글의 DB 저장 유무를 확인하기
    • 선택한 댓글이 있다면 댓글 수정하고 수정된 댓글 반환하기
  10. 댓글 삭제 API
    • 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 댓글만 삭제 가능
    • 선택한 댓글의 DB 저장 유무를 확인하기
    • 선택한 댓글이 있다면 댓글 삭제하고 Client 로 성공했다는 메시지, 상태코드 반환하기
  11. 예외 처리 (ResponseEntity 사용)
    • 토큰이 필요한 API 요청에서 토큰을 전달하지 않았거나 정상 토큰이 아닐 때는 "토큰이 유효하지 않습니다." 라는 에러메시지와 statusCode: 400을 Client에 반환하기
    • 토큰이 있고, 유효한 토큰이지만 해당 사용자가 작성한 게시글/댓글이 아닌 경우에는 “작성자만 삭제/수정할 수 있습니다.”라는 에러메시지와 statusCode: 400을 Client에 반환하기
    • DB에 이미 존재하는 username으로 회원가입을 요청한 경우 "중복된 username 입니다." 라는 에러메시지와 statusCode: 400을 Client에 반환하기
    • 로그인 시, 전달된 username과 password 중 맞지 않는 정보가 있다면 "회원을 찾을 수 없습니다."라는 에러메시지와 statusCode: 400을 Client에 반환하기

 

추가 요구사항

  • 전체 할일카드 목록에서 완료된 카드들은 숨김처리 하는 기능을 추가해주세요!
  • 할일카드를 작성자만 볼 수 있도록 비공개 하는 기능을 추가해주세요!
  • 할일카드 제목으로 검색하여 목록을 출력하는 기능을 추가해주세요!
  • AccessToken, RefreshToken에 대해 구글링해 보고 RefreshToken을 적용해 보세요!
  • 프로젝트에 swagger 를 구글링해 보고 적용해 보세요!
    • swagger란? Open Api Specification(OAS)를 위한 프레임워크 입니다. API들이 가지고 있는 스펙(spec)을 명세, 관리할 수 있으며, 백엔드와 프론트엔드가 협업할 때 사용할 수 있습니다!

ERD 작성

 

ERD를 그릴 때 다대일 관계를 생각하는 것은 쉬웠는데 강의에서 배웠던 Entity 연관관계에서

단방향 연관관계를 가지는지, 양방향 연관관계를 가지는지에 대해 생각하는 것은 헷갈리고 어려웠다.

 

프로젝트를 구현하는 과정에서 처음에는 단방향으로 했다가 중간에 양방향으로 바꿨다가 다시 단방향으로 바꾸었다.

양방향으로 서로 참조할 수 있으면 DB에서 쉽게 접근해 가져올 수 있긴 하지만

단방향으로도 충분히 필요한 데이터를 가져올 수 있었기 때문에 단방향으로 설정했다.

 

Card와 Comment는 각각 연관된 Entity들에 대하여 @ManyToOne 관계를 가지고 있는데

이 경우에는 즉시로딩이 기본설정이기 때문에 지연로딩으로 옵션을 바꿔야 하나 고민했지만

조회하는 경우 연관된 테이블을 조인해야 하는 경우가 많은 것 같아서 기본 설정 그대로 즉시로딩으로 설정하였다.

 

API 명세

postman 명세: https://documenter.getpostman.com/view/30859017/2s9YXnzyr7

 

todoapp

# 🚀 투두앱 백앤드 서버 만들기 ### 구현 기능 - 회원 가입 API - 로그인 API - 할일카드 작성 기능 API - 할일카드 조회 기능 API - 할일카드 목록 조회 기능 API - 할일카드 수정 기능 API - 할일카드 제

documenter.getpostman.com

              •  

깃허브 주소: https://github.com/dlwls423/todoapp#API-%EB%AA%85%EC%84%B8

 

GitHub - dlwls423/todoapp: 스파르타 내일배움캠프 Spring 숙련주차 개인과제

스파르타 내일배움캠프 Spring 숙련주차 개인과제. Contribute to dlwls423/todoapp development by creating an account on GitHub.

github.com

 

추가 요구사항에서 Refresh Token 적용과 swagger 적용을 제외한 나머지 기능들을 구현했다.

깃헙의 저장소와 연결해서 올리고 readme를 작성했다.

남은 추가 요구사항에 대해서 일단 검색해보고 시도 해볼 생각인데 잠깐 찾아봐도 어려워서 잘 할 수 있을지는 모르겠다.

 

구현하는 과정에서 요구사항에 GET 메소드로 카드를 읽는 경우

JWT 토큰을 검사하라는 내용이 없어서 토큰을 검사하지 않도록 해야 하는지 고민했는데

비공개된 카드 같은 경우 로그인한 사용자가 비공개된 자신의 카드는 볼 수 있어야 한다는 생각이 들어서

GET 메소드로 조회하는 경우에도 JWT 토큰을 검사하도록 구현했다.

그 외에도 특정 카드에 달린 댓글에 대해 조회할 수 있으면 좋을 것 같아 댓글 조회 기능도 추가 구현했다.

 

  • Why: 과제 제출시에는 아래 질문을 고민해보고 답변을 함께 제출해주세요.
    1. 처음 설계한 API 명세서에 변경사항이 있었나요? 변경되었다면 어떤 점 때문일까요? 첫 설계의 중요성을 작성해주세요!
      • 변경사항이 있었다. 댓글과 관련된 API를 작성할 때 처음에는 URL을 api/comments ~ 와 같이 설계하였는데 코드를 구현하는 과정에서 댓글을 모두 특정 카드에 달리기 때문에 이를 URL로 명확하게 표현해야 한다는 생각이 들었다. 그래서 api/cards/{cardId}/comments ~ 와 같이 변경하였다.
      • 처음에는 할일카드를 수정하는 http 메소드를 PATCH로 설계하였는데 이후에 할일카드 완료 기능을 추가하면서 카드 전체를 수정할 수 있는 수정 기능보다 완료했다는 필드만 수정하는 완료 기능이 더 PATCH에 적합하다는 생각이 들었고 수정 기능은 PUT 메소드로 바꾸었다.
      • request와 response의 데이터 필드를 요구사항을 제대로 보지 않고 설계해서 이후 요구사항에 맞춰 변경하였다.
      • 코드를 구현할 때에는 요구사항보다 주로 내가 설계한 API 명세서를 보고 작성하게 되는데  API명세서를 대충 생각할 수록 이후 코드 구현 과정에서 수정하는데에 더 시간이 걸리는 것 같다. 다음부터는 요구사항에 맞추고 기능에 대해 더 깊이 생각해본 후에 api 명세서를 꼼꼼하게 작성해야 할 것 같다.
    2. ERD를 먼저 설계한 후 Entity를 개발했을 때 어떤 점이 도움이 되셨나요?
      • ERD를 설계하는 과정에서 Entity에 필요한 필드들을 미리 생각해 정리할 수 있어서 좋았고 Entity 간의 관계에 대해 미리 고민하다보니 코드를 구현하는 과정에서 ERD를 참조해가면서 더 편하게 구현할 수 있었다. 
      • 다이어그램이다보니 이해하기 쉬워서 데이터를 쿼리로 가져올 때 어떻게 JPA 메소드명을 짜면 좋은지 명확하게 알 수 있었다.
    3. JWT를 사용하여 인증/인가를 구현했을 때의 장점은 무엇일까요?
      • 따로 서버에 사용자를 인증하기 위한 정보를 저장하지 않아도 되어서 간편하다.
      • 인증 과정에서 DB를 거치지 않아도 되고 인증처리가 빠르다.
      • 확장성이 우수하며 토큰 기반으로 접근 및 권한 공유가 가능하다.
    4. 반대로 JWT를 사용한 인증/인가를 구현했을 때의 한계점은 무엇일까요?
      • 토큰을 탈취당한 경우 서버에서 토큰을 만료시킬 수 없기 때문에 보안에 좋지 않다.
      • 보안 문제를 위해 토큰의 유효기간이 짧아 자주 로그인해야 한다는 점이 불편하다.
      • 토큰의 길이가 길어 인증 요청이 많아질수록 네트워크 부하가 심해진다.
    5. 만약 댓글이 여러개 달려있는 할일을 삭제하려고 한다면 무슨 문제가 발생할까요? Database 테이블 관점에서 해결방법이 무엇일까요?
      • 할일을 삭제할 때 댓글을 Cascade 방식으로 삭제하지 못하면 댓을을 다 삭제한 뒤 할일을 삭제해야 한다.
      • 또는 할일을 삭제했을 때 접근할 수 없는 댓글이 DB에 남겨지게 된다.
      • 할일을 삭제하면 이를 참조하고 있는 댓글도 함께 삭제되도록 DB의 테이블 제약조건을 설정한다
    6. IoC / DI에 대해 간략하게 설명해주세요!
      • IoC: 개발자가 아닌 프로그램(스프링 컨테이너)가 객체를 호출 및 주입하는 등의 제어를 직접 관리
      • DI: 객체의 의존관계를 외부에서 주입하는 것으로 스프링에서는 IoC 컨테이너가 빈을 주입