Xokie
47
2020-08-01 21:21:41
2
202

스프링 @Autowired 주입과 생성자 주입의 차이? 질문드립니다.


안녕하세요 스프링 공부중인 학생입니다. 지금 뭘 만들고 있는데.. 일단 표를 그려봤습니다.(발퀄입니다.. )

구체적인 네이밍은 지웠습니다.

여튼 제가 기대한건 컨테이너를 불러오면 jdbc를 주입받은 DAO가 빈으로 등록되고, 그게 또 ServiceImpl(Service 인터페이스 구현 클래스)에 주입되서 사용 가능해질 것이라는 생각이었는데요.. 계속 jdbc가 DAO에 주입되지 않아서 @Autowired된 ServiceImpl의 멤버변수 DAO에 주입이 안된다는 에러가 나옵니다. 그런데 DAO의 멤버변수 jdbcTemplate에 @Autowired를 걸면 또 작동을 합니다만.. 어떤 부분이 문제가 있는건가요???
그리고 혹시 AOP를 어노테이션으로 설정했을 때 어노테이션을 지워도 계속 AOP가 동작하는 부분도 알고 계신분 있으시면 답변 부탁드리고 싶습니다. 스프링 서적 두권이랑 구글링하면서 이틀동안 찾아보고있는데 마땅한 해결방안을 모르겠어서 앓고 있습니다..ㅠ
0
0
  • 답변 2

  • 무도123
    377
    2020-08-02 09:21:22 작성 2020-08-02 09:21:44 수정됨

    어우.. 질문 내용은 이해가 안되고.. 제목 부분만 이해가 되서 @Autowire와 생성자 주입에 대해서만 답변드릴께요

    다른 클래스를 주입하는 방법은 제가 알기로 총 3가지가 있습니다.


    1. 필드에 @Autowired 붙이기

    2. 생성자에  파라미터로 받기

    3. Setter 메서드로 받기 (이 부분은 직접해보진 않아서 설명이 어렵습니다)


    기본적으로 주입을 하기위해서는 주입하려는 객체가 Bean으로 등록되어있어야합니다.

    Bean 등록 방법은 @Bean으로 등록 되거나, @Service, @Component, @Repository로 등록하거나, 또는 @Import를 통해서 넣을 수 있습니다.


    여기서 질문하신 @Autowired와 생성자의 차이는 @Autowired는 Spring 쪽에서 Reflection으로 강제를 주입한 방식이기 때문에 만약 스프링이 아닌 코드에서 해당 필드를 할당하려면 할당 할 수 있는 방법이 없습니다.

    그러므로 SonarQube나 Spring에서는 위 1, 2, 3 방법 중 2번 생성자 주입을 권장하고 있습니다.


    근데.. 구현하다보면 @Autowired 할게 많아질때도 있고 그런데 생성자에 그걸 다 넣기는 그렇고..

    또 Spring이 아닌 코드에서 이 코드를 쓸일이 없어서 개인적으로는 @Autowired를 애용하고있습니다.

    1
  • Xokie
    47
    2020-08-02 22:55:20

    소스코드를 올리면 보기 더 힘들 것 같아 말로 풀어썼는데 더 이상한 질문이 되었나보네요.. 정성 답변 감사드립니다 이것저것 삽질하다보니 원인은 대강 알아냈습니다 jdbcTemplate이 어쩔땐 빈으로 등록되는데 어쩔땐 등록이 안되는게 문제였습니다 더는 모르겠어서 그냥 dataSource주입해서 jdbcTemplate은 호출하는 식으로 코드를 바꿨네요 ㅠ

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.