반응형
프링 부트에서 의존성 주입(DI, Dependency Injection)은 주로 세 가지 방식으로 이루어집니다: 생성자 주입, 수정자 주입, 필드 주입. 각각의 방법에 대한 코틀린 예시를 제공하겠습니다.
1. 생성자 주입(Constructor Injection)
생성자 주입은 가장 권장되는 방법으로, 클래스의 의존성을 생성자를 통해 주입하는 방식입니다.
예시: 생성자 주입
package com.example.demo.service
import org.springframework.stereotype.Service
@Service
class GreetingService {
fun greet(name: String): String {
return "Hello, $name!"
}
}
package com.example.demo.controller
import com.example.demo.service.GreetingService
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
@RestController
class GreetingController(private val greetingService: GreetingService) {
@GetMapping("/greet")
fun greet(@RequestParam name: String): String {
return greetingService.greet(name)
}
}
2. 수정자 주입(Setter Injection)
수정자 주입은 의존성을 수정자 메서드(Setter)를 통해 주입하는 방식입니다.
package com.example.demo.controller
import com.example.demo.service.GreetingService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
@RestController
class GreetingController {
private lateinit var greetingService: GreetingService
@Autowired
fun setGreetingService(greetingService: GreetingService) {
this.greetingService = greetingService
}
@GetMapping("/greet")
fun greet(@RequestParam name: String): String {
return greetingService.greet(name)
}
}
여기서 GreetingController 클래스는 setGreetingService 메서드를 통해 GreetingService를 주입받습니다. 이 방법은 주입할 의존성이 선택적일 때 유용할 수 있습니다.
3. 필드 주입(Field Injection)
필드 주입은 의존성을 클래스의 필드에 직접 주입하는 방식입니다.
예시: 필드 주입
package com.example.demo.controller
import com.example.demo.service.GreetingService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
@RestController
class GreetingController {
@Autowired
private lateinit var greetingService: GreetingService
@GetMapping("/greet")
fun greet(@RequestParam name: String): String {
return greetingService.greet(name)
}
}
정리
• 생성자 주입: 가장 권장되는 방법으로, 변경 불가능하고 테스트가 용이합니다.
• 수정자 주입: 선택적 의존성을 주입할 때 유용합니다.
• 필드 주입: 간단하지만, 테스트와 유지보수가 어렵고 권장되지 않습니다.
반응형