spring / CRUD 기능 구현(1)

kongta2·2023년 11월 28일

Todo프로젝트의 CRUD기능 중 생성, 조회이다.

TodoController - postTodo, 생성

    @PostMapping
    public ResponseEntity<TodoResponseDto> 
    	postTodo(@RequestBody TodoRequestDto todoRequestDto, @AuthenticationPrincipal UserDetailsImpl userDetails) {
        
        TodoResponseDto responseDto =  todoService.createPost(todoRequestDto, userDetails.getUser());
        
        return ResponseEntity.status(201).body(responseDto);
    }

ResponseEntity는 Spring Framework에서 제공하는 HttpEntity클래스를 상속 받아 구현한 클래스로 사용자의 HttpRequest에 대한 응답 데이터(HttpStatus, HttpHeaders, HttpBody)를 포함하는 클래스이다.
유저의 로그인 세션 정보는 spring security의 @AuthenticationPrincipal을 사용하여 받아왔다.

UserDetailsImpl

public class UserDetailsImpl implements UserDetails  {

    @Getter
    private final User user;

    public UserDetailsImpl(User user) {
        this.user = user;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        return false;
    }

    @Override
    public boolean isAccountNonLocked() {
        return false;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return false;
    }

    @Override
    public boolean isEnabled() {
        return false;
    }
}

spring security의 사용자 정보를 담는 UserDetails 인터페이스를 이용하여 UserDetailsImpl 클래스를 따로 구현하여 사용자를 구분하고 id, password를 받아온다.

TodoService - createPost

    public TodoResponseDto createPost(TodoRequestDto dto, User user) {
        Todo todo = new Todo(dto);
        todo.setUser(user);

        todoRepository.save(todo);

        return new TodoResponseDto(todo);
    }

UserController에서 받아온 request정보(title, content)와 UserDetails를 이용해 받아온 User를 TodoEntity에 저장하고 기능 실행 시 성공 or 실패 유무를 확인하기 위해 성공했을 때의 정보를 ResponseDto로 반환한다.

TodoController - getTodo, 조회

    @GetMapping("/{todoId}")
    public ResponseEntity<CommonResponseDto> getTodo(@PathVariable Long todoId) {
        try {
            TodoResponseDto responseDto = todoService.getPost(todoId);
            return ResponseEntity.ok().body(responseDto);
        } catch (IllegalArgumentException e) {
            return ResponseEntity.badRequest().body(new CommonResponseDto(e.getMessage(), HttpStatus.BAD_REQUEST.value()));
        }
    }

조회할 todo를 @PathVariable 어노테이션을 이용하여 요청 URI 매핑에서 템플릿 변수를 처리하고 메서드 매개변수로 설정한다.

TodoService - getPost

    public TodoResponseDto getPost(Long todoId) {
        Todo todo = todoRepository.findById(todoId)
                .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 할일 ID 입니다."));
        return new TodoResponseDto(todo);
    }

createPost에서 save메서드를 이용하여 todoRepository에 저장했던 TodoEntity를 findById를 통해 정보를 가져온 후 반환한다.

Postman을 이용한 기능 구현 확인

  1. 생성

  2. 조회

profile
2025.04.01~

0개의 댓글