오늘도 Spring 복습을 하면서 어제 작성해둔 개인 과제를 다시 살펴보고, 선택 구현 과제를 살펴보면서 시간을 보냈다. 막히는 부분이 생겼을 때 해결하는데에 시간이 꽤 오랜 시간이 걸려서 많은 것을 하지는 못했다. 시간이 생각보다 빠르게 지나갔던 것 같다.
여기에는 할 일 앱에서 할일을 작성했을 때 작성 시간과 수정했을 때 마지막으로 수정한 시간이 같이 저장되는 것을 구현해보았던 과정을 적어보았다.
1. Spring 개인 과제
- 작성시간, 최종수정시간 저장하기
먼저 엔티티가 저장될 때 자동 생성되어 값이 저장되게 하는 법과 엔티티 값이 변경되었을 때 시간이 자동 저장되게 하는 법을 찾아봐야 했다. JPA Auditing이라는 것을 사용해야 했는데 완전히 처음 보는 것이어서 조금 헤맸던 것 같다.
아래와 같이 엔티티를 작성하였고 원하는 결과를 얻을 수 있었다.
// Spring Data JPA가 Auditing 기능을 사용하게 만든다.
@EntityListeners(AuditingEntityListener::class)
@Entity
@Table(name = "todo2")
class Todo(
@Column
var name: String,
@Column
var title: String,
@Column
var description: String?
) {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null
// 엔티티가 생성되어 저장될 때 시간이 자동 저장된다.
@CreatedDate
@Column(updatable = false)
var createdat: LocalDateTime? = null
// 조회한 엔티티 값을 변경할 때 시간이 자동 저장된다.
@LastModifiedDate
var updatedat: LocalDateTime? = null
}
사실 문제가 조금 있었다. LocalDateTime에 해당하는 자료형을 PostgreSQL에서도 맞게 지정해줘야 했는데 이것이 잘못된 것인지 계속 해당 칼럼을 찾을 수 없다는 메시지가 떴었다.
아래와 같이 JAVA 시간 타입에 대해 어떤 PostgreSQL 타입에 매치되는지 찾을 수 있었다. 나는 LocalDateTime을 사용했기 때문에 time zone이 없는 timestamp를 사용하면 되었다. PostgreSQL에서 자료형을 변경해주니 제대로 작동하는 것을 확인할 수 있었다.
응답을 내보낼 때에도 timestamp로 내보내면 프론트엔드 쪽에서 받아다가 시간으로 변경하는 것도 가능은 하겠지만 그래도 이쪽에서 아예 변경해서 내보는 것도 해보는 것도 해보고 싶어서 한 번 찾아서 해보았다. 년도, 월, 날짜, 시간, 분, 초 까지 문자열로 내보낼 수 있게 다음과 같이 코드를 작성해서 내보냈다.
createdDateTime = createdat!!.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
문제없이 잘 작동하는 것을 알 수 있었다.
하지만 API의 모든 기능을 확인해보려고 이것저것 해보다보니 문제를 하나 찾게 되었다.
수정하기 기능 자체는 잘 작동하고 DB에 값이 잘 저장되는 것을 확인했다. 하지만 Response body의 값을 확인해보면 작성시간이 최종수정시간으로 바뀌어 나오는 것을 확인할 수 있었다.
문제를 제대로 파악하느라 시간을 많이 소비했는데 결론적으로 말하면 업데이트 함수는 중간에 문제가 생기면 롤백이 되어야하기 때문에 트랜잭션을 걸어놨었고, 시간은 DB에 저장될 때 같이 저장되는 것이므로 Response Body로 변환하여 반환될 시점에서의 작성 시간과 최종수정시간은 DB에 이전에 저장되어 있던 값이 될 수 밖에 없는 것이었다.
아래 코드를 보면 이해하기 쉬울 것이다.
@Transactional
override fun updateTodo(todoId: Long, request: UpdateTodoRequest): TodoResponse {
val todo = todoRepository.findByIdOrNull(todoId) ?: throw TodoNotFoundException(todoId)
todo.name = request.name
todo.title = request.title
todo.description = request.description
return todoRepository.save(todo).toResponse()
}
따라서 Response Body의 내용을 수정하는 것은 어려울 것 같다. 그보다 PUT 메소드의 응답에 저 정보가 모두 포함될 필요가 있는가에 대해서 더 고민을 해봐야하는 것이 아닐까 하는 생각이 들었다.
긴 시간을 들였는데 원했던대로 문제를 해결하지는 못했지만 이것저것 찾아보고 알아볼 수 있어서 좋은 시간이었다고 할 수 있을 것 같다.
2. 오늘 배운 것
- 데이터 저장될 때 시간을 같이 저장하는 법을 찾아보았다.
- 기본적인 네트워크 지식에 대해 더 찾아보았다.
'오늘 배운 것' 카테고리의 다른 글
24-05-16 Spring 개인 과제 (4) (0) | 2024.05.16 |
---|---|
24-05-15 Spring 개인 과제 (3) (0) | 2024.05.15 |
24-05-13 Spring 개인 과제 (0) | 2024.05.13 |
24-05-12 네트워크 기본 지식 (0) | 2024.05.12 |
24-05-11 ERD 다이어그램 그리는 법 (0) | 2024.05.11 |