Spring 4일차. 로그인 기능이 없는 블로그를 구현하는 프로젝트를 진행했다. 초반엔 막막했지만 어제 정리한 걸 토대로 진행해보니 생각보다 잘 되었다. 물론 중간중간 막힌 부분이 있었는데 그부분을 TIL에 정리해보겠다.
문제 : 게시글 작성 기능을 Controller에 Post 요청으로 구현 했었는데 PostMan으로 사용하려니 415 unsupported media type 에러가 떴다.
시도 및 해결 : 검색을 해보니 Post 415 에러는 Content Type이 맞지 않는 오류였다.
Header에 Content-Type을 application/json으로 설정하니 해결 되었다.
알게된 점 : Post요청은 Header에 Content-Type application/json 설정을 해주자.
문제점 : @Service 안에 @Transactional을 사용해야 하는데 (readOnly = true)가 먹히지 않았다.
시도 및 해결 : 지우고 다시 해보니 @Transactional은 어노테이션이 2개가 있는데 spring꺼를 import해야 하는데 javax껄 써서 에러가 난 거였다.
문제점 : id와 비밀번호가 일치할 때 게시글을 지우는 요청을 해야하는데 비밀번호를 보내는 방법이 마땅치 않았다.
시도 :
id는 @PathVariable로, pw는 @RequestBody String으로 받기
: 실패. @RequestBody는 단순 String은 받지 못한다.
json 기반의 HTTP Body만 받기 때문이다.
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에 넣는 경우가 있다.
Delete는 body를 쓸 수 없는 경우가 있다!!
일부 수정일때는 patch를 쓰지만 구형 브라우저가 지원하지 않는 특수경우도 있다.
실제로는 delete를 잘 안쓴다. 데이터를 지우는 행위가 매우 위험하기 때문이다.
대신 soft delete를 쓴다는데 해당 내용은 더 알아보자