인프런 스프링-11

Cloudman·2022년 11월 27일
0

항해99 스프링 공부

목록 보기
13/15

스프링 빈과 의존관계

스프링 빈을 등록 하고 의존관계를 어떻게 설정하는지 알아보는 시간이다.

지금까지는 Member 서비스와 리포를 만들었다.
그리고 Member 객체를 만들고 서비스를 통해서 Member 를 가입할 수 있고 리포에 저장이 된다.
그러고나서 리포에서 꺼내올수 있게 만들어 주고 Test 를 만들었다.

이제 화면에 붙여야 하는데 그럴려면 컨트롤러와 뷰템플릿이 필요하다.
회원가입 하고 회원가입된 결과를 html 에 뿌려주는 등의 과정이 필요하다.

그렇게 하기 위해서는 Member 컨트롤러를 만들어야 한다.
Member 컨트롤러가 Member 서비스를 통해서 회원가입을 하고 Member 서비스를 통해서 데이터를 조회할 수 있어야 한다.

이렇게 되는것을 서로 의존관계가 있다고 한다.
Member 컨트롤러가 Member 서비스를 의존한다고 표현한다.

위에서 말한 내용을 이미지로 표현

이제 이 작업을 스프링 스럽게(?) 해 보도록 하자.





가장 먼저 컨트롤러에 MemberController 를 만들어 준다.
이후 아래 사진의 내용처럼 작성을 해준다.

위의 설명대로 읽어보면서 해 주었으나 memberService 에 빨간줄이 뜬 것을 볼 수 있다.

이를 해결해주기 위해서는 컨트롤러에 @Controller 어노테이션을 달아 주었듯이 memberService 에도 이같이 어노테이션을 달아 주어야 한다.

위 처럼 해주면 스프링이 실행될 때 memberService 를 클래스가 아닌 서비스로서 인식하고 컨테이너에 등록을 해준다.

위 처럼 리포도 똑같이 해준다.

이게 만드는 과정에 있어서 정형화 되어있는 패턴이다.

위에 어노테이션을 이용해서 등록해 주는것을 보고 스프링 빈 등록 이라고 한다.
즉, memberService 스프링 빈 등록 MemoryMemberRepository 스프링 빈 등록 이런식으로 표현된다.

이렇게 해주면 MemberController 가 생성될 때 스프링 빈에 등록되어 있는 MemberService 객체를가져다가 넣어준다.
이것을 디펜던시 인젝션 이라고 한다.( 의존관계 주입 )

그래서 저렇게 스프링이 실행 되었을 때(영상에선 올라갔을 때 라고 표현 하신다) @Autowired 가 있으면 알아서 MemberRepository 가 들어가는 것이다.

  • MemberControllerMemberService 를 필요로 하고,
  • MemberServiceMemberRepository 를 필요로 한다.
  • MemberRepository 를 타고 들어가 보면 MemoryMemberRepository 가 구현체로 있다.
  • 그래서 최종적으로 MemoryMemberRepositoryMemberService 에 주입해주면...

위 같은 그림의 모습으로 최종적으로 완성이 된다.





이제 메인 메서드를 실행해 주면...

Tomcat 이 정상적으로 올라오고 잘 실행된 것을 볼 수 있다.


스프링 빈 등록방법 2가지

1. 컴포넌트 스캔과 자동 의존관계 설정
2. 자바 코드로 직접 스프링 빈 등록하기



컴포넌트 스캔과 자동 의존관계

지금까지 진행한 방법이 1번에 해당하는 컴포넌트 방식이다.
컴포넌트는 @Component 라는 어노테이션을 의미하는데 나는 쓴적이 없는데 왜 1번 에 해당하냐면...

@Controller 어노테이션을 Ctrl + 클릭 을 해서 들어가 보면 안에 컴포넌트 어노테이션이 포함되어 있는것을 볼 수 있다.

@Service@Repository 도 마찬가지다.





그렇다면 이 어노테이션을 아무데나 부쳐도 가능한가???
결론부터 말하자면 NO 이다.

위의 사진에서 HelloSpringApplication 파일의 패키지 경로를 의미하는 package hello.hellospring; 이 부분의 하위 패키지 까지만 찾아서 등록을 한다.

즉, hello.hellospring 패키지를 포함한 하위 패키지 까지만 찾아서 들어간다.

따로 설정을 해주면 외부에 것들도 인식하는것이 가능하지만 기본적으로는 저렇게 설정되어 있다.

참고
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록을 한다.(유일하게 하나만 등록해서 공유)
따라서 같은 스프링 빈이면 모두 같은 인스턴스 이며 설정으로 싱글톤이 아니게 설정이 가능하지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.





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

바로 시작해보자~~

위 사진상에서 @Service 어노테이션을 지워주자

이후 @Repository@Autowired 도 지워준다.

단, @Controller 는 지우지 말고 MemberService 안에 있는 @Autowired 도 살려둔다.

이후 실행하면 MemberService 가 스프링 빈에 등록이 안되어있기 때문에 오류가 난다.

이후에는 이제 자바 코드로 직접 등록하기 위해서 아래와 같이 파일을 만들고 입력을 해주자.

이후 반환되는 곳에 행선지를 설정을 해 줘야 하는데 무엇을 넣어야 하는지 단축키 Ctrl + P 를 통해 알아볼 수 있는데 확인해보니

즉, 최종적으로 아래의 이미지의 순서대로 볼 수 있다.

이 후 실행해서 Tomcat 올라오면 정상적으로 실행이 된 것이다.

이 방법이 더 번거로운거 같은데 그렇다면 이 둘의 차이점은 무엇인가... 에 대한건 이제 얘기해보자.





앞서 말한 두 방식의 차이점

예전에는 XML 으로 설정하는 방식도 있었으나 최근에는 잘 사용하지 않기 때문에 여기서는 설명을 생략 !!

DI(의존성 주입)에는 필드 주입, setter 주입, 생성자 주입 이렇게 총 3가지 방법이 있다.

기존에 했던 위 방식이 생성자 주입 방식

위 방식이 필드 주입 방식이다.

위 방식은 setter 주입 방식 이다.

각각의 방식에 장단점이 있으나 사실상 생성자 방식 만을 쓴다고 보면 된다.
왜냐하면 의존관계가 실행중에 동적으로 변하는 경우가 거의 없기 때문이다.

실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다.
그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.

profile
코린이

0개의 댓글