본문 바로가기

항해99

23.09.01 항해 99 16기 주특기 Spring 7일차

오늘 공부한 것

* Spring LV2 과제 하기

 

새로운 요구사항을 구현해 보세요!

  1. 회원 가입 API
    • username, password를 Client에서 전달받기
    • username은 최소 4자 이상, 10자 이하이며 알파벳 소문자(a~z), 숫자(0~9)로 구성되어야 한다.
    • password는 최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9)로 구성되어야 한다.
    • DB에 중복된 username이 없다면 회원을 저장하고 Client 로 성공했다는 메시지, 상태코드 반환하기
    • 참고자료
      1. https://mangkyu.tistory.com/174
      2. https://ko.wikipedia.org/wiki/정규_표현식
      3. https://bamdule.tistory.com/35
  2. 로그인 API
    • username, password를 Client에서 전달받기
    • DB에서 username을 사용하여 저장된 회원의 유무를 확인하고 있다면 password 비교하기
    • 로그인 성공 시, 로그인에 성공한 유저의 정보와 JWT를 활용하여 토큰을 발급하고, 발급한 토큰을 Header에 추가하고 성공했다는 메시지, 상태코드 와 함께 Client에 반환하기

 ✌️ 요구사항에 맞게 수정해 보세요!

  1. 전체 게시글 목록 조회 API
    • 제목, 작성자명(username), 작성 내용, 작성 날짜를 조회하기
    • 작성 날짜 기준 내림차순으로 정렬하기
  2. 게시글 작성 API
    • 토큰을 검사하여, 유효한 토큰일 경우에만 게시글 작성 가능
    • 제목, 작성 내용을 저장하고
    • 저장된 게시글을 Client 로 반환하기(username은 로그인 된 사용자)
  3. 선택한 게시글 조회 API
    • 선택한 게시글의 제목, 작성자명(username), 작성 날짜, 작성 내용을 조회하기 (검색 기능이 아닙니다. 간단한 게시글 조회만 구현해주세요.)
  4. 선택한 게시글 수정 API
    • 수정을 요청할 때 수정할 데이터와 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
    • 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 수정 가능
    • 제목, 작성 내용을 수정하고 수정된 게시글을 Client 로 반환하기
  5. 선택한 게시글 삭제 API
    • 삭제를 요청할 때 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
    • 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 삭제 가능
    • 선택한 게시글을 삭제하고 Client 로 성공했다는 메시지, 상태코드 반환하기

 

이렇게가 이번 과제였는데 

나는 회원가입 API를 구현하고 

페어인 조원분은 로그인 API를 구현하기로했다

 

서로 작성한 코드를 Merge 한 후 코드 수정을 조금하다가

내가 만든 UserController의 부분을 변경하자는 의견이 나왔다

가독성도 더 좋고 postman에서도 확인이 쉽도록 말이다

UserController 부분을 수정하다보니 UserService 쪽 코드 수정도 하게 되었다

UserController
변경전 변경후
@PostMapping("/user/signup")
    public String signup(@Valid @RequestBody SignupRequestDto requestDto, BindingResult bindingResult) {
        
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        if(fieldErrors.size() > 0) {
            for (FieldError fieldError : bindingResult.getFieldErrors()) {
                log.error(fieldError.getField() + " 필드 : " + fieldError.getDefaultMessage());
            }
            return "redirect:/api/user/signup";
        }

        userService.signup(requestDto);

        return "redirect:/api/user/login-page";
@PostMapping("/user/signup")
    public ResponseEntity<UserResponseDto> signup(@Valid SignupRequestDto sinupRequestDto){
        return userService.signup(sinupRequestDto);
    }
UserService
변경전 변경후
Optional<User> checkUsername = userRepository.findByUsername(username);
        if (checkUsername.isPresent()) { 
            throw new IllegalArgumentException("중복된 사용자가 존재합니다.");
        }

        String email = requestDto.getEmail();
        Optional<User> checkEmail = userRepository.findByEmail(email);
        if (checkEmail.isPresent()) {
            throw new IllegalArgumentException("중복된 Email 입니다.");
        }

        UserRoleEnum role = UserRoleEnum.USER;
        if (requestDto.isAdmin()) {
            if (!ADMIN_TOKEN.equals(requestDto.getAdminToken())) {
                throw new IllegalArgumentException("관리자 암호가 틀려 등록이 불가능합니다.");
            }
            role = UserRoleEnum.ADMIN;
        }
      
        User user = new User(username, password, email, role);
        userRepository.save(user);
Optional<User> checkUsername = userRepository.findByUsername(username);
        if (checkUsername.isPresent()) { 
            UserResponseDto dto = new UserResponseDto();
            dto.setMsg("등록된 사용자가 있습니다"); // msg란에 에러메시지 값으로 초기화
            dto.setStatusCode(String.valueOf(HttpStatus.NOT_FOUND.value())); 
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(dto);
        }

      
        String email = requestDto.getEmail();
        Optional<User> checkEmail = userRepository.findByEmail(email);
        if (checkEmail.isPresent()) {
            UserResponseDto dto = new UserResponseDto();
            dto.setMsg("중복된 Email 입니다");             dto.setStatusCode(String.valueOf(HttpStatus.NOT_FOUND.value())); 
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(dto);
        }


        UserRoleEnum role = UserRoleEnum.USER;
        if (requestDto.isAdmin()) {
            if (!ADMIN_TOKEN.equals(requestDto.getAdminToken())) {
                UserResponseDto dto = new UserResponseDto();
                dto.setMsg("관리자 암호가 틀려 등록이 불가능합니다."); 
                dto.setStatusCode(String.valueOf(HttpStatus.NOT_FOUND.value())); 
                return ResponseEntity.status(HttpStatus.NOT_FOUND).body(dto);
            }
            role = UserRoleEnum.ADMIN;
        }

       
        User user = new User(username, password, email, role);
        userRepository.save(user);

        UserResponseDto dto = new UserResponseDto();
        dto.setMsg("회원가입이 완료되었습니다"); // msg란에 에러메시지 값으로 초기화
        dto.setStatusCode(String.valueOf(HttpStatus.OK.value())); 
        return ResponseEntity.status(HttpStatus.OK).body(dto);

 

수정을 하고 두근두근한 마음으로 postman에서 회원가입을 진행하는데

여전히 진행이 되지 않았다.. 엄청 고민하고 구글링 끝에 깨닫게 되었다

UserController 부분에서 @RequestBody를 넣지 않은것이다.. 

postman에서 회원가입시 JSON 형식으로 진행하였는데.. 왜 안넣었을까.. 

후회가 되었지만 잘 돌아가서 너무 기뻣다

 

@PostMapping("/user/signup")
public ResponseEntity<UserResponseDto> signup(@RequestBody @Valid SignupRequestDto sinupRequestDto){
    return userService.signup(sinupRequestDto);
}

 

내일은 이제 세부적인 사항 조정을 해야하는데

잘 마칠 수 있길 빌어본다!