티스토리 뷰

반응형

중복 코드를 제거하고 API 처리와 컨트롤러의 결합을 제거하기 위해 사용합니다.

Interface인 Service를 만들고 Service를 상속받는 Component를 만들고 사용하면 됩니다.

 

 

서비스 인터페이스

interface CustomerService {
    fun getCustomer(id: Int): Customer?
    fun createCustomer(customer: Customer)
    fun deleteCustomer(id: Int)
    fun updateCustomer(id: Int, customer: Customer)
    fun searchCustomer(nameFilter: String): List<Customer>
}

 

RESTful API에서 동작할 작업들을 담은 interface를 만들었습니다.

 

 

구현 생성

@Component
class CustomerServiceImpl : CustomerService {

    companion object {
        val initialCustomers = arrayOf(
                Customer(1, "Hello"),
                Customer(2, "Kotlin", Telephone("+82", "56453423")),
                Customer(3, "Spring"))
    }

    private val customers = ConcurrentHashMap<Int, Customer>(initialCustomers.associateBy(Customer::id))

    override fun getCustomer(id: Int): Customer? = customers[id]

    override fun createCustomer(customer: Customer) { customers[customer.id] = customer }

    override fun deleteCustomer(id: Int) { customers.remove(id) }

    override fun updateCustomer(id: Int, customer: Customer) {
        deleteCustomer(id)
        customers[id] = customer
    }

    override fun searchCustomer(nameFilter: String): List<Customer> =
            customers.filter {
                it.value.name.contains(nameFilter, true)
            }.map(Map.Entry<Int, Customer>::value).toList()
}

 

CustomerServiceImpl이라는 클래스를 만들고 Service를 상속받았습니다.

그리고 함수들을 오버라이드 해주고 구현하였습니다.

 

initialCustomers라고 기본 값을 생성하고 customers에 지정해주었습니다.

 

@Component 어노테이션을 붙여서 CustomerServiceImpl를 컴포넌트로 만들어 줍니다. ( 나중에 빈 구현할 때 주입이 됩니다. )

 

 

 

서비스 사용

@RestController
class CustomerController {

    @Autowired
    private lateinit var customerService : CustomerService

    @GetMapping(value = ["/customers"])
    fun getCustomers(@RequestParam(required = false, defaultValue = "") nameFilter: String) = customerService.searchCustomer(nameFilter)

    ...
}

 

변수에 서비스를 넣고 @Autowired 어노테이션을 붙여줍니다.

컴포넌트 스캔이 CustomerServiceImpl를 해당 인터페이스에 주입합니다.

 

customerService를 통해 구현한 함수들을 사용하면 됩니다.

반응형
댓글