실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기

Ch02. Java 서버를 Kotlin 서버로 리팩토링하자 - DTO,Controller를 Kotlin으로 변경하기

webmaster 2022. 11. 1. 23:44
728x90

DTO 변경하기

UserResponse

//DTO는 취지에 맞게 data클래스로 만든다
data class UserResponse(
    val id: Long,
    val name: String,
    val age: Int?,
) {
    /*
    constructor(user: User): this(
        id = user.id!!,
        name = user.name,
        age = user.age
    )
     */
    companion object{
        fun of(user: User): UserResponse{
            return UserResponse(
                id = user.id!!,
                name = user.name,
                age = user.age,
            )
        }
    }
}
  • JAVA 클래스/패키지에 마우스 우측 클릭 -> convert Java File to Kotlin File 클릭하여 변환
  • DTO 같은 경우에는 취지에 맞게 data 클래스로 만드는 것이 좋다
  • init을 사용해서 만드는 것보다 부생성자(constructor(user:User) 를 통해 만드는 것이 더 좋다.
    • 이보다 더 좋은 방법은 동반 객체에서 of 메서드를 통해 생성하는 것이다.
  • 나머지는 모두 같으므로 생략한다.

Controller 변경하기

BookController

@RestController
class BookController(
    private val bookService: BookService,
) {

    @PostMapping("/book")
    fun saveBook(@RequestBody request: BookRequest) {
        bookService.saveBook(request)
    }

    @PostMapping("/book/loan")
    fun loanBook(@RequestBody request: BookLoanRequest) {
        bookService.loanBook(request)
    }

    @PutMapping("/book/return")
    fun returnBook(@RequestBody request: BookReturnRequest) {
        bookService.returnBook(request)
    }
}

UserController

@RestController
class UserController(
    private val userService: UserService,
) {

    @PostMapping("/user")
    fun saveUser(@RequestBody request: UserCreateRequest) {
        userService.saveUser(request)
    }

    @GetMapping("/user")

    @PutMapping("/user")
    fun updateUserName(@RequestBody request: UserUpdateRequest) = userService.updateUserName(request)

    @DeleteMapping("/user")
    fun deleteUser(@RequestParam name: String){ //?연산자를 붙이면 스프링이 required = false설정을 한다
        userService.deleteUser(name)
    }
}
  • Controller 같은 경우 테스트 코드가 없어 실제 화면을 통해 확인할 수 있다(localhost:8080/v1/index.html)
  • 코틀린에서는 함수를 만들 때 반드시 블록일 필요 없이 바로 값을 대입할 수도 있다.
  • 널 허용 파라미터를 받게 되면 스프링이 알아서 required=false 속성을 적용시켜, null 값을 허용시켜 준다.
  • jackson 라이브러리 같은 경우 JAVA에서는 잘 변환해 주었지만 kotlin 코드로는 잘 변환 못 시켜 주는 경우도 있기 때문에 build.gradle에서 의존성을 추가해 주어야 한다.

Application을 실행시켜주는 Main문

@SpringBootApplication
class LibraryAppApplication

fun main(args: Array<String>) {
    runApplication<LibraryAppApplication>(*args) //가변인자는 * 연산자를 통해 넣어야한다
}
  • main문은 코틀린에서 클래스 안에 있을 필요 없다.
  • 가변 인자는 코틀린에서 * 연산자를 통해 파라미터로 사용해야 한다.
728x90