오늘은 여태까지 학습하고 진행했던 Spring 과제 최종 제출이 있는 날이었다. 전체 코드를 여러번 체크해보았는데 꼼꼼히 체크했다고 생각했는데 계속 잘못된 부분과 고칠 수 있는 부분들이 보였었다. 프로그램이 더 복잡해지면 역시 테스트 코드 작성 같은 것이 매우 중요할 것이라는 생각이 들었다.
여기에는 오늘 최종 제출한 과제 내용과 과제를 진행하면서 새로 알게된 내용들을 정리해보았다.
1. Spring 개인 과제
1-1. 프로젝트 전체 설계
과제가 여러가지 단계가 있었기 때문에 단계를 진행할때마다 설계를 바꿔야하는 경우도 많았다. 때문에 왜 처음에 설계를 잘 해놓아야 하는지를 어느정도 알 수 있었다.
여기에는 최종적으로 완성한 유즈 케이스 다이어그램, API 명세서, ERD을 올려본다.
위 사진이 유즈 케이스 다이어그램이다. 여러가지 기능들이 초기에 비해 추가되었다.
출력 내용이 바뀌게 된 경우는 많지만 API 명세서에는 크게 추가된 내용이 없다.
데이터베이스의 무결성을 유지하기 위해서는 할 일과 댓글을 식별관계로 만드는 것이 좋겠지만 실제 프로그램을 만드는 측면에서는 여러 어려움이 있다는 것을 알게되었다. 위와 같은 형태로 만들었지만 실제로는 할일이 없다면 댓글도 존재할 수 없도록 프로그램이 작성되어있다.
1-2. 유효성(Validation) 검사 추가하기
먼저 Spring Boot에서 제공하는 Validation을 이용하려면 아래의 의존성을 추가해야한다.
implementation("org.springframework.boot:spring-boot-starter-validation")
이용방법은 너무나도 간단하다.
먼저 Validation 체크를 할 곳에 @Valid 어노테이션을 달아주면 된다. 클라이언트가 보낸 요청에다가 아래처럼 어노테이션을 추가해주기만 하면 된다.
@PostMapping()
fun createTodo(@Valid @RequestBody request: CreateTodoRequest): ResponseEntity<TodoResponse> {
return ResponseEntity
.status(HttpStatus.CREATED)
.body(todoService.createTodo(request))
}
그런다음 DTO에 유효성 검증 관련된 어노테이션을 달아주기만 하면된다. 관련 어노테이션은 검색하면 많이 나오는데 현재 String에 대해 글자수 제한만을 추가하면 되는 상황이기 때문에 그에 해당하는 어노테이션만 사용해보았다.
import jakarta.validation.constraints.Size
data class CreateTodoRequest(
@field:Size(min = 1, max = 200, message = "제목은 1~200글자 이어야합니다")
val title: String,
val writer: String,
@field:Size(min = 1, max = 1000, message = "본문은 1~1000글자 이어야합니다")
val description: String
)
위와 같이 Size 어노테이션과 min, max와 같은 매개변수를 이용해 제한사항을 넣어줄 수 있다. message의 경우는 예외가 발생했을 때 메시지를 출력해주기 위해 넣었다.
스프링 부트에서 제공해주는 유효성 검사 기능을 이용했을때 유효하지 않은 데이터가 들어오면 MethodArgumentNotValidException이 발생하게 된다.
@RestControllerAdvice를 이용해 전역으로 예외를 관리해주고 있었기 때문에 아래 코드를 추가하여 메시지와 HTTP 에러코드를 출력해주도록 만들 수 있었다.
@ExceptionHandler(MethodArgumentNotValidException::class)
fun handleMethodArgumentNotValidException(e: MethodArgumentNotValidException): ResponseEntity<ErrorResponse> {
return ResponseEntity
.status(HttpStatus.BAD_REQUEST)
.body(ErrorResponse(e.bindingResult.allErrors[0].defaultMessage))
}
2. 오늘 배운 것
- Spring 과제 내용 복기를 통해 복습을 해볼 수 있었다.
- SQL을 공부하면서 DB에 대해서 조금 더 알아볼 수 있었다.
'오늘 배운 것' 카테고리의 다른 글
24-05-26 Kotlin 식과 문의 차이 (0) | 2024.05.26 |
---|---|
24-05-25 알고리즘 문제 풀이 (0) | 2024.05.25 |
24-05-23 JPA의 영속성 컨텍스트와 Spring Data JPA (2) | 2024.05.23 |
24-05-22 알고리즘 문제 풀이 (0) | 2024.05.22 |
24-05-21 알고리즘 문제 풀이 (0) | 2024.05.21 |