간단한 Restful Server 만들기(리팩토링 버전)
26 Nov 2019 | SpringBootSimple Restful Server
기존에 UserApplication.kt 내부에서 만들었던 User 리스트 정보를 UserService 클래스로 이동시킵니다.
그리고 UserService 클래스를 직접 참조하는게 아니라 인터페이스를 통해 접근하기 위해서,
IUser 인터페이스와 UserService 클래스로 분리를 합니다.
UserApplication.kt
@SpringBootApplication
class UserApplication
fun main(args: Array<String>) {
runApplication<UserApplication>(*args)
}
IUser.kt
interface IUser {
fun getUser(id: Int): User?
fun searchUser(nameFilter: String): List<User>
fun createUser(user: User)
fun updateUser(id: Int, user: User)
fun deleteUser(id: Int)
}
UserService.kt
@Service
class UserService : IUser {
private val userMap = ConcurrentHashMap<Int, User>()
init {
userMap[1] = User(1, "snowdeer")
userMap[2] = User(2, "ran")
}
override fun getUser(id: Int): User? {
return userMap[id]
}
override fun searchUser(nameFilter: String): List<User> {
return userMap.filter {
it.value.name.contains(nameFilter, true)
}.map(Map.Entry<Int, User>::value).toList()
}
override fun createUser(user: User) {
userMap[user.id] = user
}
override fun updateUser(id: Int, user: User) {
userMap[id] = user
}
override fun deleteUser(id: Int) {
userMap.remove(id)
}
}
UserController.kt
@RestController
class UserController {
@Autowired
private lateinit var service: UserService
@GetMapping("/user/{id}")
fun getUser(@PathVariable id: Int): ResponseEntity<User> {
return ResponseEntity(service.getUser(id), HttpStatus.OK)
}
@GetMapping("/users")
fun userList(): ResponseEntity<List<User>> {
return ResponseEntity(service.searchUser(""), HttpStatus.OK)
}
@GetMapping("/search")
fun search(@RequestParam(required = false, defaultValue = "") nameFilter: String): ResponseEntity<List<User>> {
return ResponseEntity(service.searchUser(nameFilter), HttpStatus.OK)
}
@PostMapping("/create")
fun createUser(@RequestBody user: User): ResponseEntity<Unit> {
service.createUser(user)
return ResponseEntity(Unit, HttpStatus.OK)
}
@DeleteMapping("/delete/{id}")
fun deleteUser(@PathVariable id: Int): ResponseEntity<Unit> {
service.deleteUser(id)
return ResponseEntity(Unit, HttpStatus.OK)
}
@PutMapping("/update/{id}")
fun updateUser(@PathVariable id: Int, @RequestBody user: User): ResponseEntity<Unit> {
service.updateUser(id, user)
return ResponseEntity(Unit, HttpStatus.OK)
}
}
POST 함수 테스트하기
터미널에서 curl 명령어를 이용해서 간단하게 테스트할 수 있습니다.
curl -X POST "http://localhost:8080/create" \
-H "content-type: application/json" \
-d '{
"id": 3,
"name": "yang"
}'