Tiny Star

📌TIL [Today I Learn]

[TIL] 23년 7월 13일 목요일

청크 2023. 7. 13. 23:04

23년 7월 13일 목요일

오늘의 목표 : 나만의 항해 블로그 백엔드 서버 만들기 Lv2 튜터님 피드백 확인

 

오늘 공부한 내용🤓

지난 Lv2 개인과제 관련해서 튜터님 피드백이 도착했기 때문에 Lv3 구현 전에 피드백 받은 부분의 코드부터 수정해봤다.

 

뿌듯 +ㅁ+ 하면서도.. 시무룩..

 

[UserController]

튜터님 피드백 : 위 코드에서처럼 DTO를 그대로 응답하고있는데 ResponseEntity 로 감싸서 응답하는것을 추천드립니다.

 

<기존코드>

 @PostMapping("/user/signup") 
 public UserResponseDto signup(@RequestBody SignupRequestDto requestDto,HttpServletResponse res){ 
     return userService.signup(requestDto,res); 
 }

<수정코드>

@PostMapping("/user/signup")
    public ResponseEntity<UserResponseDto> signup(@RequestBody SignupRequestDto requestDto, HttpServletResponse res){
        UserResponseDto userResponseDto = userService.signup(requestDto, res);
        return new ResponseEntity<>(userResponseDto, HttpStatus.OK);
    }

UserResponseDto를 튜터님 말씀대로 ResponseEntity로 감싸서 응답하는코드로 수정하고,  응답코드를 반환시켰다. 

 

 

[BlogController]

 

튜터님 피드백 :  위 코드에서 throws 를 통해 예외를 던지는 메서드가 있는데요. 

Controller 는 요청을 처리하는 마지막 지점이기 때문에 예외를 던지지않고 받아줘야 합니다. 

해당 예외를 받아서 에러응답을 구성해 리턴하도록 수정해주세요.

 

<기존코드>

 @PostMapping("/posts") 
 public BlogResponseDto createPost(@RequestBody BlogRequestDto requestDto) throws InvalidTokenException { 
     return blogService.createPost(requestDto); 
 }

<수정코드>

    @PostMapping("/posts")
    public ResponseEntity<BlogResponseDto> createPost(@RequestBody BlogRequestDto requestDto){
        try {
            BlogResponseDto post = blogService.createPost(requestDto);
            return new ResponseEntity<>(post, HttpStatus.OK);
        } catch (InvalidTokenException e) {
            return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
        }
    }

throws 예외를 던지는 메서드를 삭제하고  try-catch로 예외를 받아서 응답코드를 리턴시키는 코드로 수정했다.


튜터님 피드백 :  requestDto 를 넘겨주는데 그안에있는 비밀번호를 또 넘겨주고 있는게 중복으로 불필요해보입니다.

 

<기존코드>

    //선택한 게시글 수정 API
	@PutMapping("/post/{id}")
		public BlogResponseDto updatePost(@PathVariable Long id,@RequestBody BlogRequestDto requestDto) {
   	    return blogService.updatePost(id, requestDto, requestDto.getPassword());
    }
    //선택한 게시글 삭제 API 
	@DeleteMapping("/post/{id}")
   	 public BlogDeleteDto deletePost(@PathVariable Long id, @RequestBody BlogRequestDto requestDto) {
       return blogService.deletePost(id, requestDto.getPassword());
    }

<수정코드>

    //선택한 게시글 수정 API
    @PutMapping("/post/{id}")
    	public BlogResponseDto updatePost(@PathVariable Long id,@RequestBody BlogRequestDto requestDto) {
        return blogService.updatePost(id, requestDto);
    }

    //선택한 게시글 삭제 API
    @DeleteMapping("/post/{id}")
    	public BlogDeleteDto deletePost(@PathVariable Long id, @RequestBody BlogRequestDto requestDto) {
        return blogService.deletePost(id, requestDto);
    }

blogService.updatePost에서 넘겨줄 때 password부분 삭제로 처리 완료!

 

[BlogService]

<기존코드>

    //헤더에서 토큰 추출 - 튜터님 피드백으로 주석처리
//    private String getTokenFromHeader() throws InvalidTokenException {
//        HttpServletRequest request // 현재 요청 정보 받고
//                = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//        String authorizationHeader = request.getHeader("Authorization");
//        if (StringUtils.hasText(authorizationHeader) && authorizationHeader.startsWith("Bearer")) //Authorization -> null X,Bearer로 시작하는 토큰값만 추출
//        {
//            return subStringToken(authorizationHeader); // 토큰 값을 추출
//        }
//        return authorizationHeader;
//    }

 

튜터님 피드백 : 토큰 처리에 대한 코드들은 JwtUtil 클래스로 모아서 처리하도록 해야합니다. 

왜냐하면 토큰처리는 Blog의 기능이 아니고 JWT의 기능이기 때문입니다.

 

이건 애시당초 왜 Service class에 들어가있는지... 나도 모르는 상태.. (심지어 JwtUtil class에는 똑같은 내용이 주석처리 되어있음...)

냉큼 튜터님 말씀대로 바꿔서 적용 후 커밋!

어려웠던 내용😵‍💫

 

궁금&부족한 내용❓

UserService에도 아래와 같은 피드백을 하나 받았다.

내 코드를 보면 아래와 같이 Service로직에서 쿠키와 세션관련까지 전부 처리 한 후 Controller에서 메서드만 호출해서 작업을 수행하도록

되어있는데... 강의에서 배운 그대로 작성해놓은거라 뭐가 맞는건지..? 잘 모르겠다.

    @Transactional(readOnly = true)
    public UserResponseDto login(LoginRequestDto requestDto, HttpServletResponse res) throws IOException {
        //    - username, password를 Client에서 전달받기
        String username = requestDto.getUsername();
        String password = requestDto.getPassword();
        //username 확인
        //    - DB에서 username을 사용하여 저장된 회원의 유무를 확인하고 있다면 password 비교하기
        User user = userRepository.findByUsername(username).orElseThrow(
                ()-> new IllegalArgumentException("회원가입 된 사용자가 없습니다."));

        //password 확인
        if (!user.getPassword().equals(password)) {
            throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
        }

        //로그인에 성공한 유저의 정보와 JWT를 활용하여 토큰을 발급
        //JWT Token 생성 및 쿠키에 저장
        String token = jwtUtil.createToken(user.getUsername());

        //Response 객체에 추가,
        jwtUtil.addJwtToCookie(token, res);

        // 로그인 성공
        UserResponseDto userResponseDto = new UserResponseDto("로그인에 성공하였습니다.",HttpServletResponse.SC_OK);
        return userResponseDto;
    }

튜터님께 확인이 한번 더 필요할 듯 싶어 아직 수정 전이다.

 

 

느낀 점💡

 

'📌TIL [Today I Learn]' 카테고리의 다른 글

[TIL] 23년 7월 25일 화요일  (0) 2023.07.26
[TIL] 23년 7월 14일 금요일  (0) 2023.07.14
[TIL] 23년 7월 12일 수요일  (0) 2023.07.12
[TIL] 23년 7월 11일 화요일  (0) 2023.07.11
[TIL] 23년 7월 10일 월요일  (0) 2023.07.10