JWT 토큰 기반의 CUD 구현

song yuheon·2023년 9월 2일
0

Spring

목록 보기
30/93
post-thumbnail

필터에서 JWT 토큰에 저장한 유효 객체에서 username과 사용자가 보낸 request Dto( title & contents ) 에서 데이터를 확보하여 C(Create) U(Update) D(Delete)를 구현한다.

  • C(Create)
  1. Controller
    클라이언트로부터 POST 요청을 받아 메모 생성 요청을 한다. HttpServletRequest 객체를 통해 필터에서 저장된 사용자 정보를 가져온다
    @PostMapping("/memos")
    public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto, HttpServletRequest req) {
        User user = (User) req.getAttribute("user");
        return memoService.createMemo(requestDto, user.getUsername());
    }
  1. Service
    Service layer에서는 DTO 데이터와 사용자 이름을 받아, 메모를 생성하고 저장한다.
    public MemoResponseDto createMemo(MemoRequestDto requestDto, String username) {
        // RequestDto -> Entity
        Memo memo = new Memo(requestDto, username);
        // DB 저장
        Memo saveMemo = memoRepository.save(memo);
        // Entity -> ResponseDto
        MemoResponseDto memoResponseDto = new MemoResponseDto(saveMemo);
        return memoResponseDto;
    }
  • U(Update)
  1. Controller
    클라이언트로부터 PUT 요청을 받아 메모 수정 요청을 한다
    HttpServletRequest 객체를 통해 필터에서 저장된 사용자 정보를 가져온다
    @PutMapping("/memos/{id}")
    public Memo updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto, HttpServletRequest req) {
        User user = (User) req.getAttribute("user");

        return memoService.updateMemo(id, requestDto,user.getUsername());
    }
  1. Service
    사용자가 해당 메모의 소유자인지 확인한 후 메모를 수정한다. 만약 사용자가 소유자가 아니면 예외를 발생시킨다.
    @Transactional // updateMemo는 따로 Transactional 되어있지 않아 해줘야함
    public Memo updateMemo(Long id, MemoRequestDto requestDto, String username) {
        Memo memo = findMemo(id);
        if(memo.getUsername().equals(username))
            memo.update(requestDto, username); // update는 memo 클래스에서 만든 것
        else
            throw new IllegalArgumentException("당신에겐 글을 수정할 권한이 없습니다 >.< !!");

        return memo;
    }

if(memo.getUsername().equals(username))
=> 서버에게 토큰을 부여받은 사용자가 다른 사용자의 데이터를 수정하는 것을 방지

  • D ( Delete )
  1. Controller
    클라이언트로부터 DELETE 요청을 받아 메모 삭제 요청을 한다. HttpServletRequest 객체를 통해 필터에서 저장된 사용자 정보를 가져온다.
    @DeleteMapping("/memos/{id}")
    public ResponseEntity<String> deleteMemo(@PathVariable Long id, HttpServletRequest req) {
        User user = (User) req.getAttribute("user");

        return memoService.deleteMemo(id, user.getUsername());
    }
  1. Service
    사용자가 해당 메모의 소유자인지 확인한 후 메모를 삭제한다. 만약 사용자가 소유자가 아니면 실패 메시지를 반환한다.
public ResponseEntity<String>  deleteMemo(Long id, String username) {
        Memo memo = findMemo(id);
        if(memo.getUsername().equals(username))
            memoRepository.delete(memo);
        else
            return ResponseEntity.ok("{\"msg\": \"삭제 실패\", \"statusCode\": 444}");
        return ResponseEntity.ok("{\"msg\": \"삭제 성공\", \"statusCode\": 200}");

    }
profile
backend_Devloper

0개의 댓글