개발자
@Configuration public class ControllerConfig { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MemberConfig.class); @Bean public SearchController serachController() { return new SearchController(ac.getBean("memberDao", MemberDao.class)); } } ------------------------------------------------------------------------------------ @Configuration public class ControllerConfig { @Autowired private MemberDao memberDao; @Bean public SearchController serachController() { return new SearchController(memberDao)); } } autowired 사용을 지양하고, 생성자 주입을 사용하는게 좋다고 들었는데 설정 클래스에서는 생성자 주입이 안되는데 위 코드 중 어느 방식으로 코딩하는게 맞는 방식일까요? 혹시 위 방식 말고 다른 방식이 있다면 알려주시면 감사하겠습니다.
답변 1
인기 답변
익명
작성자
2024년 03월 01일
생성자 주입 사용을 권장하는 가장 큰 이유 중 하나로 테스트 용이성과 코드 가독성 향상 등이 있습니다. `@Autowired` 대신 생성자Injection을 사용할 수 있는 `@Configuration` 클래스 예시를 아래에 제시해드리겠습니다: ```java @Configuration public class ControllerConfig { private MemberDao memberDao; public ControllerConfig(MemberDao memberDao){ this.memberDao = memberDao; } @Bean public SearchController serachController() { return new SearchController(memberDao); } } ``` 위의 코드는 `@Configuration` 클래스 내에서 생성자를 사용한 역할을 합니다. 또한, 이 방식은 Spring 4.3부터 `@Autowired`를 생략할 수 있게 해줍니다. 단, 이 경우 `MemberDao`가 스프링 빈으로 등록되어 있는지 확인해야합니다. gpt 답변으로 해결했습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 03월 01일
두 코드 모두 맞는 방식이지만, 스프링의 DI(Dependency Injection)을 이용하여 의존성 주입을 처리하는 것이 더 좋습니다. 첫 번째 예시에서는 직접 ApplicationContext를 생성해서 Bean을 주입하고 있습니다. 이 방법은 수동적인 방법으로, 빈의 라이프사이클 관리 및 DI 기능 등 스프링 프레임워크가 제공하는 장점을 크게 활용하지 못합니다. 반면, 두 번째 예시에서는 `@Autowired` 어노테이션을 사용한 필드 주입 방식입니다. 이 방식은 간단하다는 장점이 있지만, 의존성 변경에 유연하지 않고 테스트하기 어렵다는 단점들이 있습니다. 생성자 주입 사용을 권장하는 가장 큰 이유 중 하나로 테스트 용이성과 코드 가독성 향상 등이 있습니다. `@Autowired` 대신 생성자Injection을 사용할 수 있는 `@Configuration` 클래스 예시를 아래에 제시해드리겠습니다: ```java @Configuration public class ControllerConfig { private MemberDao memberDao; public ControllerConfig(MemberDao memberDao){ this.memberDao = memberDao; } @Bean public SearchController serachController() { return new SearchController(memberDao); } } ``` 위의 코드는 `@Configuration` 클래스 내에서 생성자를 사용한 역할을 합니다. 또한, 이 방식은 Spring 4.3부터 `@Autowired`를 생략할 수 있게 해줍니다. 단, 이 경우 `MemberDao`가 스프링 빈으로 등록되어 있는지 확인해야합니다. 추가적으로, Lombok 라이브러리의 `@RequiredArgsConstructor` 어노테이션을 사용하면 필드에 대한 생성자를 자동으로 만들어주는 기능도 있습니다. 따라서 코드를 좀 더 간결하게 만들 수 있습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!