Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feature] - 3차 세미나 개인과제 #6

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Open

Conversation

sae2say
Copy link
Collaborator

@sae2say sae2say commented Nov 3, 2024


새로 추가된 table인 uses 관련 class들을 만들었습니다.

  • repository/UserRepository.java
  • repository/UserEntity.java
  • service/UserService.java
  • api/UserController.java
  • api/UserLogInRequest.java
  • api/UserRequest.java

⭐회원가입

  • 유저의 이름, 닉네임, 이메일, 비밀번호를 입력받아 유저를 생성합니다.
  • 입력받은 body에서 email field에 @가 포함되어 있지 않으면 EmailFormatException을 호출합니다.
    //api/UserController.java
    
    @PostMapping("/user/signup")
    void post(@RequestBody UserRequest usersRequest){
        if (!usersRequest.getEmail().contains("@")){
            throw new EmailFormatException();
        }
        userService.createUser(usersRequest.getName(),usersRequest.getPassword(),usersRequest.getNickname(),usersRequest.getEmail());
    }
  • 유저 정보를 userRepository에 저장합니다.
    //service/UserService.java
    
    public void createUser(String name, String password, String nickname, String email){
        userRepository.save(new UserEntity(name, password, nickname, email));
    }

⭐로그인

  • body로 이메일과 비밀번호를 입력받습니다.
  • 이메일 형식을 검사합니다.
  • 유효성 검사를 통과하면 해당 email과 password로 userServicelogin을 시도합니다.
  • Optional을 사용하여 로그인되었다고 data에 user의 id를 담아 ApiResponse를 보내주거나, 비밀번호가 잘못되었다는 예외를 호출합니다(=해당유저없음).
    //api/UserController.java
    
    @PostMapping("/user/login")
    public ResponseEntity<ApiResponse> login(@RequestBody UserLogInRequest usersLogInRequest) {
        if (!usersLogInRequest.getEmail().contains("@")) {
            throw new EmailFormatException();
        }

        Optional<Long> userIdOptional = userService.login(usersLogInRequest.getEmail(), usersLogInRequest.getPassword());

        if (userIdOptional.isPresent()) {
            Long user_id = userIdOptional.get();
            ApiResponse response = new ApiResponse(200, "로그인되었습니다.", String.valueOf(user_id));
            return ResponseEntity.ok(response);
        } else {
            throw new IncorrectPasswordException();
        }
    }
  • findByEmail로 해당 이메일을 가진 user 객체를 Optional로 가져옵니다.
  • 그 user 객체의 비밀번호와 입력받은 비밀번호가 일치하다면 유저의 id를 반환합니다.
  • 비밀번호가 일치하지 않으면 예외를 발생시킵니다.
    //api/UserService.java
    
    public Optional<Long> login(String email, String password) {
        Optional<UserEntity> user = userRepository.findByEmail(email);

        if (user.isPresent() && Objects.equals(user.get().getPassword(), password)) {
            return Optional.of(user.get().getId());
        } else {
            throw new IncorrectPasswordException();
        }
    }

+UserService.java에 유효성 검사가 있는데 Controller.java에서도 해야할까?

⇒ …. (안쓰면 return 값이 없다고 오류가 떠서 일단 넣어놓은건데… 추후에 해결방법 추가예정입니다 ㅠ)

⭐유효성 검사(인증, 인가) + 예외처리

  • 인증이 필요한 api : 일기 작성, 일기 수정, 일기 삭제

  • 인가 확인이 필요한 api : 일기 수정, 일기 삭제

  • @RequestHeader : api 메서드에 헤더 값을 입력받습니다. 헤더 값 자체가 없으면 500 에러가 발생하길래 GlobalExceptionHandlerMissingRequestHeaderException handler를 추가하여 40100 - 로그인하지 않은 사용자의 요청으로 처리하도록 하였습니다.

        // 40100 로그인하지 않은 사용자의 요청
        @ExceptionHandler(MissingRequestHeaderException.class)
        public ResponseEntity<Map<String, Object>> handleMissingRequestHeader(MissingRequestHeaderException ex) {
            Map<String, Object> errorResponse = new HashMap<>();
            errorResponse.put("code", 40100);
            errorResponse.put("message", "인증되지 않은 사용자입니다.");
            return new ResponseEntity<>(errorResponse, HttpStatus.UNAUTHORIZED);
        }
  • user id를 key처럼 사용해서 검사

    • header로 받은 user_id가 해당 Diary 객체가 가진 user_id와 같은지 검사하고, 같지 않다면 커스텀 exception인 UnauthorizedException을 발생하였습니다.
        @PatchMapping("/diaries/{id}")
        public void updateDiary(@RequestHeader("user_id") String user_id, @PathVariable Long id, @RequestBody DiaryRequest diaryRequest){
    
            Diary diary = diaryService.getDiary(id);
    
            if (!diary.getUser().getId().equals(Long.valueOf(user_id))){
                throw new UnauthorizedException();
            }
            else{
                diaryService.updateDiary(id, diaryRequest.getTitle(), diaryRequest.getContent(), diaryRequest.getScope());
            }
        }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant