반응형
코틀린을 공부하면서 자바와 의존성 주입 차이가 약간 다른 거 같아서, 이번 글을 통해 제대로 정리하고자 합니다.
코틀린이 자바보다 간결하게 처리가 가능하다고 말로만 들었는데, 의존성 주입부터 간결해지는 거 같다..
의존성 주입 방법은 제일 많이 사용하는 생성자 주입을 기준으로만 작성하겠습니다. (가장 흔히 쓰고, 안전한 방식)
Java 생성자 주입
@RestController
@RequiredArgsConstructor
public class HelloController {
private final HelloService helloService;
}
자바에서는 @RequiredArgsConstructor와 private final 빈 클래스 선언을 통해 간단하게 생성자 주입을 처리합니다.
@RestController
public class HelloController {
private HelloService helloService;
@Autowired
public HelloController(HelloService helloService){
this.helloService = helloService;
}
}
위 코드와 동일함, 어노테이션으로 처리가 가능하고 확실하게 final 처리를 할 수 있어 자바에서는 주로 첫 번째 방법을 사용합니다.
Kotiln 생성자 주입
@RestController
class HelloController(val helloService: HelloService) {
}
Kotlin에서는 클래스의 생성자에 Property를 정의할 수 있어 필드를 따로 선언하지 않아도 됩니다.
→ 코틀린에서 클래스 생성자의 변수에 val, var이 선언되어 있으면 Property도 자동으로 생성된다.
→ val, var이 선언되지 않으면, 단순 클래스의 생성 매개변수로만 사용된다.
Only Constructor Property
class Person(name: String) {
fun printName() {
println(name) // 오류: name을 찾을 수 없음
}
}
name 변수는 클래스 매개변수로만 사용됩니다.
즉, 클래스 생성시에만 사용된다.
val, var Property
class Person(val name: String)
fun main() {
val person = Person("Alice")
println(person.name) // 정상 출력: Alice
}
val을 선언했기에 클래스의 Property로 사용할 수 있습니다.
private val, var
class Person(private val name: String) {
fun printName() {
println(name) // 클래스 내부에서는 접근 가능
}
}
fun main() {
val person = Person("Alice")
println(person.name) // 오류: name은 private이라 외부에서 접근 불가
}
private 제한자를 사용하면 자바와 똑같이 외부에서 접근할 수 없도록 할 수 있습니다.
결론
- 생성자에서 변수만 선언하면 클래스 내부에서도 접근할 수 없음.
- 외부에서 접근할 필요 없으면 private val을 선언해야 함.
- 생성자 매개변수에 val 또는 var을 붙이면 프로퍼티가 생성됨
작업하면서 이게 맞나? 싶었는데 코틀린을 잘못 사용하고 있었다..
Before
@Service
@RequiredArgsConstructor
class NaverClient(
@Value("\${naver.auth.client_id}") clientId: String,
@Value("\${naver.auth.client_secret}") clientSecret: String,
private val restTemplate: RestTemplate,
): SocialLoginPort {
val naverClientId = clientId
val naverClientSecret = clientSecret
}
After
올바르게 사용해보니 훨씬 간결해진 것을 확인할 수 있었다.
@Service
class NaverClient(
@Value("\${naver.auth.client_id}") private val clientId: String,
@Value("\${naver.auth.client_secret}") private val clientSecret: String,
private val restTemplate: RestTemplate,
): SocialLoginPort {
}
반응형
'Kotlin > 코프링' 카테고리의 다른 글
Kotlin 로깅 찍는 방법, Logging - @slf4j 대체 방법 (0) | 2025.01.17 |
---|---|
코틀린 스코프 함수 총정리 - let, also, run, apply, with 제대로 사용하기 (0) | 2024.12.12 |
[Kotlin] 코틀린 엘비스 연산자와 firstOrNull 활용법 - 쿼리 시 서버 메모리 최적화 (1) | 2024.12.08 |
[Kotlin+Spring] 코프링 Kotlin으로 Spring DTO 클래스 생성하기 - data class (0) | 2024.06.18 |