컴포넌트 스캔과 자동 의존관계 설정
이전까지는 memberservice랑 리포지토리를 만들었습니다. 그리고 member객체를 만들어 memberservice를 통해서 가입을 진행시키고 리포지토리에 저장을 시키고 가져오는 로직을 구성하고 테스트까지 진행해봤습니다.
이번시간에는 화면에 나타내기 위해 Controller랑 BeutifulSoup가 필요합니다. Controller랑 BeutifulSoup를 사용하기 위해서는 MemberController는 MemberService를 통해서 회원가입하고 MemberService를 통해서 조회할 수 있어야 합니다.
이러한 관계를MemberService가 MemberController를 의존한다고 표현하고 둘은 의존관계에 있다고 표현합니다.
스프링 빈 (Spring Bean)
스프링 빈: 스프링 컨테이너가 관리하는 자바 객체로 스프링에서는 객체를 빈이라고 표현합니다.
@의 기능 : 스프링 부트가 실행되면 스프링 컨테이너에 MemberController 객체를 생성하고 컨테이너에 넣어서 스프링이 관리를 합니다. 이러한 것을 스프링 빈이 관리된다고 표현합니다.
MemberController 생성
Controller 패키지에 MemberController라는 클래스를 생성하고 @Controller라는 어노테이션을 달아줍니다.
MemberController에서 MemberService 객체를 new로 생성해서 MemberService를 사용할 수도 있지만 스프링을 사용하면 스프링 컨테이너에 등록하고 컨테이너에서 가져와서 사용해야 합니다.
이유는 Memberservice 객체는 MemberController 뿐만 아니라 다른 Controller에서 MemberService를 가져다 써야하는데 MemberService의 기능은 특별하지 않습니다. 그래서 Controller별로 구분지어서 새로 만들 필요가 없이 하나의 MemberService를 컨테이너에 등록해서 사용하는 것이 훨씬 효율적입니다.
컨테이너에 등록하는 방법은 다음과 같습니다.
생성자를 이용해서 memberService 객체를 선언하고 생성자에 @Autowired 어노테이션을 추가합니다. 이렇게 되면 생성자에 있는 @Autowired로 인해 스프링이 memberService를 컨테이너에 있는 memberService를 가져다가 연결을 시켜줍니다.
@Autowired 에러
하지만 이렇게 에러가 발생하는 것을 확인할 수 있습니다.
이유는 아직 MemberService가 컨테이너에 등록되어 있지 않기 때문입니다.
위는 MemberService 클래스 입니다. 위에 아무런 @(어노테이션)이 없어서 MemberService의 @Autowired의 에러가 발생한 것입니다. 이를 고치기 위해 @Service를 MemberService 클래스 위에 추가합니다.
추가로 MemoryMemberRepository 클래스로 이동해서 @Repository를 추가합니다.
지금 추가한 어노테이션은 @Controller, @Controller, @Repository 총 3개입니다. 컨트롤러를 통해서 외부요청을 받고, 서비스에서 비즈니스 로직을 만들고, 리포지토리에서 데이터를 저장하는 가장 정형화된 패턴으로 이러한 형식으로 자주 개발을 합니다.
DI(Dependency Injection), 의존성 주입
스프링의 가장 큰 장점중 하나인 의존성 주입입니다. MemberController를 생성할 때, 스프링 빈에 등록되어있는 MemberService 객체를 MemberController에 파라미터로 직접 넣어줍니다. 이를 의존성 주입이라고 하는데 MemberController는 가만히 있고 외부(스프링)에서 의존관계를 넣어주는 것입니다.
memberService는 memberRepository가 필요하기 때문에 MemberService 클래스에 가서 memberService생성자에 @Autowired를 추가합니다.
또한 memberService는 memberRepository가 필요하기 때문에 memberRepository를 파라미터로 넣어줍니다.
main 매서드를 실행하면 에러가 발생하지 않는 것을 확인할 수 있습니다.
스프링 빈을 등록하는 2가지 방법
- 컴포넌트 스캔과 자동 의존관계 설정
- 위 그림은 @Controller, @Controller, @Repository를 차례로 확인한 것입니다. 이를 통해 모두 @Component 어노테이션이 자동으로 있는 것을 확인할 수 있습니다. 이를 통해 스프링이 시작하고 @Component 가 있는 것을 스캔해서 @Component가 있는 객체를 생성해서 컨테이너에 저장을 시킵니다.
의존 관계는 @Autowired을 이용해 자동으로 연결시켜 줍니다. - 어노테이션을 이용해서 @Controller, @Service, @Repository를 추가한 것이 컴포넌트 스캔 방식입니다.
- 자바 코드로 직접 스프링 빈 등록하기
- 다음시간에 자세히 다뤄 볼 것입니다.
주의사항
- main 메서드가 있는 Hello.Hellospring 패키지 안에 컴포넌트만 스캔하여 스프링 빈에 등록합니다.
Hello.Hellospring 패키지 밖에서 선언된 컴포넌트들은 스캔할 수 없습니다. - 스프링은 컨테이너에 스프링 빈을 등록할 때, 싱글톤을 기본으로 하여 등록합니다.
싱글톤이란 딱 한 개만 등록한다는 말로 위에서는 helloController는 딱 한개만 등록한다는 의미입니다. 유일하게 한 개만 등록해서 공유한다는 말로 만약 memberService와 OrderService(가정)가 모두 memberRepository를 의존한다면 모두에게 같은 memberRepository 인스턴스를 반환합니다.
Tip
- 변수를 클릭하고 Shift + F6 누르면 단락에 있는 이름이 같은 변수들을 한번에 바꿀 수 있습니다.
- Alt +Enter 를 누르면 바로 Local 가져올 수 있습니다.
- 인텔리제이 주석 줄 단위 : ctrl + / 블록단위 : ctrl + shift + /
이 글은 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의를 들으며 공부한 것을 직접 정리한 내용입니다.
'자바 스프링' 카테고리의 다른 글
스프링 입문 17 - 7.스프링 DB 접근 기술 (1) (0) | 2022.03.28 |
---|---|
스프링 입문 16 - 6.회원 관리 예제 - 웹 MVC 개발 (0) | 2022.03.28 |
스프링 입문 13 - 4.회원 관리 예제 - 백엔드 개발 (5) (0) | 2022.03.28 |
스프링 입문 12 - 4.회원 관리 예제 - 백엔드 개발 (4) (0) | 2022.03.28 |
스프링 입문 11 - 4.회원 관리 예제 - 백엔드 개발 (3) (0) | 2022.03.28 |