스프링 빈과 의존관계

slee2·2021년 11월 5일
0
post-thumbnail

회원가입 예제를 마쳤다면 이번에는 컨트롤러를 통해 이를 제어하는 작업을 해야된다.

처음에 컨트롤러와 서비스를 연결을 먼저 해야하는데 어떻게 하면 될까

여기서 의존관계가 나오게 된다. 멤버 컨트롤러에서 멤버 서비스로 의존하도록 만들면 된다. 이는 아래 그림처럼 @Autowired라는 어노테이션을 사용하면 된다.

컨트롤러 어노테이션을 생성하면 이 컨트롤러는 스프링에서 관리하게 된다.
위 그림에서는 MemberController 객체를 생성하여 스프링이 가지고 있는다. 이것을 스프링 컨테이너에서 스프링 빈이 관리한다 라고 표현한다.

참고로 new MemberService();를 이용해서 사용해도 되지만, 여러 컨트롤러들이 멤버 서비스에 접근하여 사용하기 위해서는 컨테이너에 넣고 꺼내쓰는 방식이 훨씬 좋다.

위처럼 작성한 후 실행하면 찾을 수 없다며 에러가 뜬다. 그 이유는 memberService에있는데

보시다시피 멤버서비스는 순수한 자바 클래스이다. 즉, 스프링에서 MemberService를 찾으려고 했으나, 알 수 있는 방법이 없기 때문에 찾을 수 없다는 에러가 뜨는 것이다.

그렇다면 해결책은 무엇일까

이렇게 @Service 어노테이션을 추가하면 된다. 그러면 실행할때 스프링 컨테이너가 MemeberService를 가져오고 연결을 해준다.

Repository도 넣어주고 다시 돌아와 Repository를 연결하는 곳에 @Autowired 어노테이션을 추가해 준다.

이렇게 되면 아래 그림처럼 스프링 빈이 등록된다.

스프링 빈 등록하는 방법 2가지

1. 컴포넌트 스캔과 자동 의존관계 설정

컴포넌트 스캔은 위에서 했던 @Controller, @Service, @Repository이다.
그 이유는 @Service를 뜯어보면

이렇게 Component가 포함된 것을 볼수 있고, 다른것들도 마찬가지기 때문이다.

또, 그림의 hellospring 패키지가 실행되는 파일의 위치 이거나 하위에 있는 어노테이션들만 스프링으로 가져온다. 다른 폴더에서는 스프링으로 못 가져온다.

그리고 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다. (하나의 인스턴스만 등록) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다.

2. 자바 코드로 직접 스프링 빈 등록

먼저, 어노테이션으로 등록했던 @Repository, @Service, ... 를 지운다.

그리고 그림처럼 추가하면 등록이 된다. @Configuration은 스프링에 등록할 것이라는 것을 암시하고, @Bean은 말 그대로 스프링 빈으로 등록할 것이라는 뜻이다. 위 코드를 통해 MemberController@Autowired를 통해 MemberService로 연결되고 MemberServiceMemberRepository로 연결된다.

@Autowired에는 3가지 주입 방법이있다.

위부터 차례로 필드 주입, 생성자 주입, setter 주입이다.
생성자 주입이 제일 좋으므로 생성자 주입 사용하면 된다.

인프런 홈페이지 - https://www.inflearn.com/
강의 제목 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

0개의 댓글