[Spring/Kotlin] Java와 Kotlin의 의존성 주입 방법 비교

2024. 4. 4. 12:00·공부/Spring
728x90

이번에 프로젝트로 코틀린 + 스프링부트를 사용하게 되어서 자바 + 스프링부트와의 차이점을 비교해보려고 한다.

 

이전에 자바 + 스프링부트에서 의존성 주입 방법들과 그 특징들에 대해서 포스팅을 한 적이 있다.

 

(만약 의존성 주입 방법에 대해 잘 모른다면 아래 포스팅을 참고)

https://growth-coder.tistory.com/73

 

[Spring][스프링 핵심 원리] 의존 관계 주입 방법 및 옵션 처리

본 포스팅은 김영한 강사님의 인프런 강의 "스프링 핵심 원리 - 기본편"을 정리한 포스팅으로 강의 자료에서 사용한 자료를 사용했음을 밝힙니다. https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%E

growth-coder.tistory.com

 

코틀린도 크게 다르진 않지만 자바와의 약간의 차이점이 있어서 이번 포스팅에서 정리해보려고 한다.

 

생성자 주입과 필드 주입에 대해서만 알아보자.

 

HelloService라는 서비스가 이미 빈으로 등록되어있다고 가정한다.

1. 생성자 주입 

먼저 java에서 생성자 주입 방식으로 의존성을 주입하는 방식을 알아보자.

<Java>

@RestController
public class HelloController {
    private HelloService helloService;
    @Autowired
    public HelloController(HelloService helloService){
        this.helloService = helloService;
    }
}

 

생성자의 파라미터로 HelloService를 받는 모습을 볼 수 있고 생성자에 @Autowired가 붙어있는 모습을 확인할 수 있다.

 

참고로 생성자가 하나라면 @Autowired를 붙이지 않아도 된다.

 

그런데 만약 주입받아야 할 서비스가 늘어난다면 생성자를 수정해야하는 번거로움이 있다.

 

이럴 때는 @RequiredArgsConstructor를 사용하면 편하게 사용할 수 있다.

@RestController
@RequiredArgsConstructor
public class HelloController {
    private final HelloService helloService;
}

 

final, @NonNull이 붙은 필드에 대해 생성자 주입을 자동으로 생성해준다.

 

다음은 kotlin에서 생성자 주입 방식으로 의존성을 주입하는 방식을 알아보자.

<Kotlin>

@RestController
class HelloController(val helloService: HelloService) {
}

java에 비해서 간단한 모습을 볼 수 있다.

 

java는 생성자 파라미터로 받아서 필드에 저장을 하지만 kotlin에서는 클래스의 프로퍼티를 정의할 수 있기 때문에 따로 필드를 만들지 않아도 된다.

 

2. 필드 주입

<Java>

@RestController
public class HelloController {
    @Autowired private HelloService helloService;
}

 

필드에 대해서 직접 @Autowired를 붙여서 주입을 받는 방식이다.

 

<Kotlin>

@RestController
class HelloController {
    @Autowired
    lateinit var helloService: HelloService
}

 

코틀린은 기본적으로 프로퍼티를 사용하지 않는 이상 필드를 초기화하지 않고 생성하는 것이 불가능하다.

 

그럴 때 나중에 초기화하겠다는 뜻인 lateinit을 사용할 수 있다.

 

lateinit을 사용한 필드는 나중에 반드시 초기화를 해야 한다.

 

lateinit을 사용하지 않고 null로 초기화해도 된다.

@RestController
class HelloController {
    @Autowired
    var helloService: HelloService? = null;
}

 

코틀린은 기본적으로 null을 허용하지 않아서 null을 허용한다는 의미로 타입에 물음표를 붙여야 한다.

 

그런데 서비스에 null을 허용하는 순간 그 서비스에서 나오는 모든 반환 값은 null을 포함할 수 있기 때문에 해당 서비스를 사용할 때 null 가능성을 고려해야 한다.

 

lateinit을 사용한 필드는 사용하려는 클래스가 Bean에 등록되지 않았다면 주입을 할 수 없게되고 초기화 되지 않았다는 에러를 뱉으며 서버가 실행되지 않는다.

 

그런데 null을 허용했다면 사용하려는 클래스가 Bean에 등록되지 않았더라도 일단 null로 초기화 한 후 서버가 실행된다.

 

즉, 필드가 주입되지 않았다는 것을 컴파일 시점이 아닌 런타임 시점에 알 수 있다.

 

코틀린을 사용하는 장점이 없어지기 때문에 만약 필드 주입을 사용한다면 lateinit을 사용하는 것이 좋아보인다.

 

물론 필드 주입보다는 생성자 주입을 사용하는 것이 좋다.

 

728x90

'공부 > Spring' 카테고리의 다른 글

[WebRTC] WebRTC, KMS, OpenVidu 개념  (0) 2023.10.24
[Spring][Android/Kotlin] FCM으로 안드로이드에 푸쉬 알람 보내기 (1)  (0) 2023.08.14
[Spring] LocalDate, LocalDateTime의 serializer와 deserializer 커스텀하기 (Json과 LocalDate 혹은 LocalDateTime 변환)  (0) 2023.08.07
[Spring] 스프링 부트 Redis를 사용하여 refresh token 저장하기 (2) - docker-compose 사용법  (0) 2023.07.17
[Spring][Redis] 스프링 부트 RedisRepository 사용법  (0) 2023.07.15
'공부/Spring' 카테고리의 다른 글
  • [WebRTC] WebRTC, KMS, OpenVidu 개념
  • [Spring][Android/Kotlin] FCM으로 안드로이드에 푸쉬 알람 보내기 (1)
  • [Spring] LocalDate, LocalDateTime의 serializer와 deserializer 커스텀하기 (Json과 LocalDate 혹은 LocalDateTime 변환)
  • [Spring] 스프링 부트 Redis를 사용하여 refresh token 저장하기 (2) - docker-compose 사용법
웅대
웅대
알고리즘과 백엔드를 중심으로 열심히 공부 중입니다! 같이 소통하며 공부해요!
    250x250
  • 웅대
    웅대 개발 블로그
    웅대
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 백준 알고리즘
        • dp
        • 문자열
        • 정렬
        • 스택
        • 브루트 포스
        • 이진 탐색
        • 정리
        • 우선순위 큐
        • 자료구조
        • 그래프
        • 기타
        • 그리디
      • 컴퓨터 언어
        • Kotlin
        • Python
        • C#
      • 공부
        • Database
        • Android Studio
        • Algorithm
        • 컴퓨터 구조론
        • Spring
        • lombok
        • AWS
        • Network
        • OS
        • Git & GitHub
        • AI
        • Computer Vision
        • 보안
        • Nginx
        • 프론트
        • express
        • GCP
        • grokking concurrency
        • DevOps
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ChatPromptTemplate
    Vector Store
    bfs
    binary search
    다익스트라
    parametric search
    openvidu 배포
    ci/cd
    nn.RNN
    Merge
    RNN
    influxDB CLI
    파이썬
    AWS Lambda
    푸쉬 알람
    code tree
    스택
    codetree
    embedding
    스프링 OAuth2
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
웅대
[Spring/Kotlin] Java와 Kotlin의 의존성 주입 방법 비교
상단으로

티스토리툴바