Todo프로젝트의 CRUD기능 중 생성, 조회이다.
@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을 사용하여 받아왔다.
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를 받아온다.
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로 반환한다.
@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 매핑에서 템플릿 변수를 처리하고 메서드 매개변수로 설정한다.
public TodoResponseDto getPost(Long todoId) {
Todo todo = todoRepository.findById(todoId)
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 할일 ID 입니다."));
return new TodoResponseDto(todo);
}
createPost에서 save메서드를 이용하여 todoRepository에 저장했던 TodoEntity를 findById를 통해 정보를 가져온 후 반환한다.
생성

조회
