230228 TIL #20 Post 415 error / @Transactional / Put / Delete

김춘복·2023년 2월 28일
0

TIL : Today I Learned

목록 보기
20/571

230228 Today I Learned

Spring 4일차. 로그인 기능이 없는 블로그를 구현하는 프로젝트를 진행했다. 초반엔 막막했지만 어제 정리한 걸 토대로 진행해보니 생각보다 잘 되었다. 물론 중간중간 막힌 부분이 있었는데 그부분을 TIL에 정리해보겠다.


Post 415 에러

참고 사이트

  • 문제 : 게시글 작성 기능을 Controller에 Post 요청으로 구현 했었는데 PostMan으로 사용하려니 415 unsupported media type 에러가 떴다.

  • 시도 및 해결 : 검색을 해보니 Post 415 에러는 Content Type이 맞지 않는 오류였다.
    Header에 Content-Type을 application/json으로 설정하니 해결 되었다.

  • 알게된 점 : Post요청은 Header에 Content-Type application/json 설정을 해주자.


@Transactional

  • 문제점 : @Service 안에 @Transactional을 사용해야 하는데 (readOnly = true)가 먹히지 않았다.

  • 시도 및 해결 : 지우고 다시 해보니 @Transactional은 어노테이션이 2개가 있는데 spring꺼를 import해야 하는데 javax껄 써서 에러가 난 거였다.

  • 알게된 점 : 어노테이션 달 때 중복된 게 있을 수 있으니 주의하자

Delete request 방법

참고사이트

  • 문제점 : id와 비밀번호가 일치할 때 게시글을 지우는 요청을 해야하는데 비밀번호를 보내는 방법이 마땅치 않았다.

  • 시도 :

  1. id는 @PathVariable로, pw는 @RequestBody String으로 받기
    : 실패. @RequestBody는 단순 String은 받지 못한다.
    json 기반의 HTTP Body만 받기 때문이다.

  2. id와 pw 둘 다 @PathVariable로 받기
    : 성공은 했지만 url에 /api/post/{id}/{password}로 노출되어
    아무리 실습이라도 보안상 너무 취약해 보여서 수정을 했다.

  • 해결 :
    {private String password;} 하나만 담은 DeleteDto를 만들어서
    id는 @PathVariable로, pw는 @RequestBody DeleteDto deleteDto로 받기.
    DeleteDto에 게터를 만들어서 deleteDto.getPassword로 비밀번호를 꺼내와 썼다.
    이렇게 하니 2번의 단점은 해결하고 pw를 받아왔다.

  • 알게된점 :
    하지만 검색결과 Spring의 버전에 따라 delete에 있는 body 값을 받을 수 있는 경우가 있고 없는 경우가 있었다. 그래서 일반적으로는 delete에 이렇게 보안 관련 사항은 넣지 않는 경우가 많고, 굳이 하게 된다면 참고사이트에서 처럼 header에 넣는 경우가 있다.

Put & Delete

  • Delete는 body를 쓸 수 없는 경우가 있다!!

  • 일부 수정일때는 patch를 쓰지만 구형 브라우저가 지원하지 않는 특수경우도 있다.

  • 실제로는 delete를 잘 안쓴다. 데이터를 지우는 행위가 매우 위험하기 때문이다.

  • 대신 soft delete를 쓴다는데 해당 내용은 더 알아보자

profile
Backend Dev / Data Engineer

0개의 댓글