Controller
// java
public class TodoController {
private final TodoService todoService;
public TodoController(TodoService todoService) {
this.todoService = todoService;
}
...
// kotlin
class TodoController(
private val todoService: TodoService,
) {
...
- 기존의 함수들을 kotlin 형태로 바꿔준다.
- kotlin에서 Response Entity의 전체를 import 해준다.
// java
@GetMapping
public ResponseEntity<TodoListResponse> getAll() {
List<Todo> todos = todoService.findAll();
return ResponseEntity.ok(TodoListResponse.of(todos));
}
...
// kotlin
@GetMapping
fun getAll() =
ok(TodoListResponse.of(todoService.findAll()))
...
- Delete의 경우 Return 타입이 ResponseEntity<Void> 였지만, kotlin의 경우 unit이라는 타입을 사용하기 때문에 ResponseEntity<Unit>으로 변경해준다.
// java
@DeleteMapping("/{id}")
public ResponseEntity<Void> delete(@PathVariable Long id) {
todoService.delete(id);
return ResponseEntity.noContent().build();
}
// kotlin
@DeleteMapping("/{id}")
fun delete(@PathVariable id: Long): ResponseEntity<Unit> {
todoService.delete(id)
return noContent().build()
}
DTO
- data class 가 @NoArgsConstructor (기본 생성자) 를 제공해준다.
TodoListResponse
- 생성자의 표현 방식을 바꿔준다.
- final ⇒ val
- size를 함수가 아닌 프로퍼티로 만들어 준다.
- getter를 생성하여 iterms의 사이즈를 응답해주도록 한다.
- jackson에서 자동으로 api의 응답을 내려주는데, 기존 프로젝트에서는 size값을 응답으로 내려주지 않았기 때문에 @JsonIgnore라는 annotation을 추가해준다.
- of 라는 static Factory 함수를 제공해줬었는데, kotlin 에서는 static 키워드가 없으므로 companion object 키워드를 사용한다.
- stream, sequence 를 사용할 필요없이 간단하게 inline함수인 map을 사용하였다.
// java
@Data
public class TodoListResponse {
private final List<TodoResponse> items;
private TodoListResponse(List<TodoResponse> items) {
this.items = items;
}
public int size() {
return items.size();
}
public TodoResponse get(int index) {
return items.get(index);
}
public static TodoListResponse of(List<Todo> todoList) {
List<TodoResponse> todoListResponse = todoList.stream()
.map(TodoResponse::of)
.collect(Collectors.toList());
return new TodoListResponse(todoListResponse);
}
}
// kotlin
data class TodoListResponse(
val items: List<TodoResponse> // Immutable
) {
val size: Int
@JsonIgnore
get() = items.size
fun get(index: Int) = items[index]
companion object {
fun of(todoList: List<Todo>) =
TodoListResponse(todoList.map(TodoResponse::of))
}
}