[내일배움캠프] 12월 26일 월요일 TIL 회고록
과제를 마저 만들었다.
Postman에서 admin은 모든 게시글과 댓글을 수정할 수 있는 기능을 구현하기 위해 테스트를 하던 도중에 토큰을 넣지 않고
게시글 수정 및 삭제 , 댓글 수정 및 삭제를 하면 토큰 검사를 하지 않고 바로 수정 및 삭제가 되는 버그? 오류? 를 발견했다.
게시글 작성할때는 제대로 토큰 검사를 하는거로 보아 아마 토큰 검사를 하는 기능이 Controller에 있지 않고 Service 부분에 있을거라
예상해서 전부 수정을 했다.
BoardController
@PutMapping("/boards/{id}")
public BoardResponseDto updateBoard(@PathVariable Long id, @RequestBody BoardRequestDto requestDto, HttpServletRequest request) {
String token = jwtUtil.resolveToken(request);
Claims claims;
if (token != null){
if (jwtUtil.vaildateToken(token)) {
claims = jwtUtil.getUserInfoFromToken(token);
}else {
throw new UserException(UserExceptionType.NOT_REQUEST_OR_NOT_NORMAL_TOKEN);
}
@DeleteMapping("/boards/{id}")
public void deleteBoard(@PathVariable Long id , HttpServletRequest request) {
String token = jwtUtil.resolveToken(request);
Claims claims;
if (token != null) {
if (jwtUtil.vaildateToken(token)) {
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new UserException(UserExceptionType.NOT_REQUEST_OR_NOT_NORMAL_TOKEN);
BoardService
@Transactional
// 게시글 수정
public BoardResponseDto update(Long id, BoardRequestDto requestDto, Claims claims) {
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("사용자가 존재하지 않습니다.")
);
// boardRepository 에서 id가 있는지 검사, 없으면 익셉션 출력
Board board = boardRepository.findById(id).orElseThrow(
() -> new RuntimeException("해당 id의 게시글이 존재하지 않습니다.")
);
// 해당 유저가 작성한 포스트가 맞는지 검사 > 맞으면 수정
if (user.isBoardWriter(board)) {
throw new UserException(UserExceptionType.ALREADY_TOKEN_NOT_POST_COMMENT);
}
// BoardResponseDto 생성 후 리턴
board.update(requestDto);
return new BoardResponseDto(board);
}
@Transactional
// 글 삭제하기
// 1. void 타입으로 리턴 타입 설정
// 2. 글을 삭제해야하니 매개변수로 id를 받는다.
// 3. deleteById() 기능을 이용하고 id를 리턴한다.
public void delete(Long id, Claims claims) {
// boardRepository 에서 id가 있는지 검사, 없으면 익셉션 출력
Board board = boardRepository.findById(id).orElseThrow(
() -> new RuntimeException("해당 id의 게시글이 존재하지 않습니다.")
);
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("사용자가 존재하지 않습니다.")
);
if (user.isBoardWriter(board)) {
throw new UserException(UserExceptionType.ALREADY_TOKEN_NOT_POST_COMMENT);
}
boardRepository.deleteById(id);
}
}
CommentController, Service도 위와 같은 방식으로 Controller에서 토큰을 검증하고, Service에서는 검증된 코드를 받아서
id와 User가 맞는지 확인한 후 맞으면 수정 및 삭제를 구현하도록 만들었다.
전부 다 수정했더니 Postman에서 정상적으로 기능 구현이 된다.
Controller역할과 Service역할을 적절히 분배해주면 더욱 더 보기에도 좋고 기능 구현도 잘 된다는 것을 알게되었다.
그 후에 admin은 모든 게시글/댓글을 수정 및 삭제를 할 수 있는 기능 구현을 하기 위해서 갖가지 시도를 했다.
따로 Postman에 admin용 회원가입을 만들고 여기에 회원가입을 계속계속 했는데 자꾸 수정이 안되고
수정을 하려고 하면 다른 사람의 게시글을 수정할 수 없다는 익셉션만 하루죙일 나와서 진짜 미칠노릇이었다.. ㅠㅠ
jwt 홈페이지에서 해독을 해봐도 PAYLOAD 부분이 auth : USER 라고 계속 나와서 이번에는 인텔리제이를 확인해봤다.
SignupRequestDto에 여기 부분이 있어서 admin = true로 바꾼 후 Postman을 실행했는데 이번에는 admin 키 값이 없으면 아예 회원가입이 안되는 상황이 발생했다... 그래서 다시 false 로 바꿨더니 다시 원래대로 돌아오긴 했지만 auth: admin 이 되는 경우는 없었다.
private boolean admin = false;
그래서 거의 하루죙일 이거만 해결하려고 실시간 강의도 보고.. Postman에서 Json 이것저것 건드려보고 했는데 역시 계속
만들어지지않아서 생각을 비우고 SignupRequestDto 를 유심히 봤다. 다른 기능들은 Postman에서 Body에 입력할때 RequestDto에 있는 private .. .. 를 입력했었다. 예를 들면 LoginRequestDto에 private String username, private String password 코드가
적혀져 있으면 Postman에서 Body에 "username" = "" , "password" = "" 을 적었다.
{
"username" : "user1",
"password" : "123456789"
}
이제 SignupRequestDto에서 private로 적힌 곳을 봤다.
먼저 , username이 있었다.
private String username;
그 다음 password가 있고,
private String password;
그리고 아까 위에서 건드려봤던 boolean admin = false; 가 있고
private boolean admin = false;
마지막으로 adminToken이 있다.
private String adminToken = "";
이제 이 4개, username, password, admin, adminToken을 Postman Body부분에 Json 형식으로 넣어보았다.
username과 password는 원래 계속 시도했던거고, 위에 있던 admin과 adminToken을 추가해보았다.
admin은 admin 기능을 추가할거니 true로 바꿔줬고, adminToken 에는 어드민 코드를 넣었다.
{
"username" : "admin7",
"password" : "12345678",
"admin" : true,
"adminToken" : "AAABnvxRVklrnYxKZ0aHgTBcXukeZygoC"
}
Send 버튼을 눌렀더니 정상적으로 회원가입이 되었다! 이제 로그인만 남았다..
정상적으로 로그인이 되었고 이제 JWT 토큰만 확인 해보면 된다.
아까랑은 달리 PAYLOAD에 auth 가 ADMIN이라고 나왔다.. admin 기능 구현을 했다.. 하루종일 이거만 붙잡았는데 드디어
기능 구현을 해서 정말 기분좋았다 ㅋㅋㅋ
Headers 부분에 해당 토큰을 넣고 일반 유저가 쓴 게시글 수정 / 삭제가 되나 테스트 해봤는데 잘 된다.
구글링을 해도 나오지가 않아 많이 멘붕이 왔었는데 무수히 많은 시간을 쏟아 부은 결과 성공했다.
Body 부분에 admin 인지를 어떻게 추가해줘야하나 진짜 많이 고민을 했었는데 이제 RequestDto 부분을 보고 Body 부분에
적으면 된다는 걸 알게됬다. 저번 내림차순과 비슷하게 알고보면 엄청 쉽고 허무했다. 하지만 이런 무수히 많은 시도 끝에
해결했고, 이제 앞으로 이런 실수는 절대 안하게 될 것 같다는 교훈을 얻어서 정말 뜻깊었다.
이제 api 명세서만 만들면 끝이다.. 얼른 만들고 다른 강의를 들어야 할 것 같다.