인프런 커뮤니티 질문&답변

hello world님의 프로필 이미지
hello world

작성한 질문수

스프링 핵심 원리 - 기본편

생성자 자동주입, 필드주입 관련 궁금합니다

작성

·

195

0

안녕하세요

정말 좋은 강의를 해주신 덕에 첫 프로젝트를 해보고 있습니다. 강의를 다 듣고 나서도 여러모로 두고두고 감사하네요 :)

프로젝트를 진행하던 중 자동주입에 대해

궁금한 점이 생겨 이전 질문글도 보고 검색도 해보고 강의자료도 다시 봤는데 확실히 잘 모르겠어서 여쭤보고 싶습니다ㅠㅠ..

배운 내용을 토대로 이것저것 검색해가면서 만들어보고 있는 프로젝트라

강의내용에 직접적인 관련이 있는 것은 아니라서 답변을 주지 않으셔도 괜찮습니다!

@Configuration
public class RootAppContext {
	@Bean("signInUserBean")
	@SessionScope
	public UserBean signInUserBean() {
		
		return new UserBean();
	}
}

//---------------------------------------------------------------------------------

@Controller
@RequestMapping("/user/sign_in")
@RequiredArgsConstructor
public class SignInContorller {
	
	private final UserService userService;
	@Resource(name = "signInUserBean")
	private final UserBean signInUserBean;

     .....
}
바로 @Resource가 붙은 signInUserBean에 대한 것인데요.
** 생성자 주입 외에는 final이 붙을 수 없는 것과
** @Resource는 필드 주입이나 수정자 주입만 된다는 것이 제 머릿속에서 충돌합니다
**** 이전 질문글을 통해 롬복의 @RequiredArgsConstructor 가 애노테이션까지 포함해서 생성자를 만들어주진 않는다는 글을 보았습니다.

제가 만든
UserBean은 스프링빈으로 관리되는 빈이 아니고,
로그인에 따라 화면 처리를 다르게 하기 위해 
따로 세션 스코프로, 이름을 signInUserBean으로 지정해 스프링빈으로 수동 등록했는데요..!
컨트롤러에 @RequiredArgsConstructor 가 붙은 상태에서
@Resource(name = "signInUserBean")
private final UserBean signInUserBean;
으로 해도,
@Resource(name = "signInUserBean")
private UserBean signInUserBean;
으로 해도,
@Resource 애노테이션 없이
private final UserBean signInUserBean;
으로 해도
모두 수동등록한 스프링 빈이 잘 주입이 됩니다..

두번째는 필드 주입이고
첫번째, 세번째 경우 모두 생성자 주입인 것 같은데
두번째, 세번째 경우는 별로 헷갈리는 게 없다고 생각하는데 첫번째 경우 때문에 궁금합니다..
첫번째의 경우는 @Resource 애노테이션은 무시가 되는 걸까요..? 왜 오류가 안 나는.. 걸까요...?

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. hello world님

@RequiredArgsConstructor를 사용하면

다음과 같은 생성자가 하나 추가됩니다.

@Controller

@RequestMapping("/user/sign_in")

public class SignInContorller {

private final UserService userService;

@Resource(name = "signInUserBean")

private final UserBean signInUserBean;

    public SignInContorller(UserService userService, UserBean signInUserBean) {

      this.userService = userService;

      this.signInUserBean = signInUserBean;

    }

}

여기서 스프링은 생성자가 딱 1개만 있으면 의존관계를 해당 생성자를 통해서 자동 주입합니다.

감사합니다.

hello world님의 프로필 이미지
hello world
질문자

감사합니다! 애노테이션을 쓰지 않고 답변 주신대로 생성자를 만들어 보았었는데 그럼에도 ' 생성자 주입을 받으면 붙여놓은 @Resource는 뭐가 되는 거지' 싶었거든요. 배운 걸 각각 따로따로 보면 아! 그렇구나 싶은데 무언가를 만들거나 다른 코드를 볼 때는 머릿 속에서 안다고 느꼈던 것들이 바로 딱딱 적용되는 단계가 아닌가봐요 그게 잘 모르는 거겠죠..? 더 달려야겠어요!!

김영한님의 프로필 이미지
김영한
지식공유자

네 이렇게 경험하면서 본인 것으로 만들어가야지요^^ 화이팅!

hello world님의 프로필 이미지
hello world

작성한 질문수

질문하기