제육's 휘발성 코딩
반응형

1. 스프링 빈이란?

Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라는 용어로 부른다.
우리가 new 연산자로 어떤 객체를 생성했을 때 그 객체는 빈이 아니다.
ApplicationContext.getBean()으로 얻어질 수 있는 객체는 빈이다.
즉, Spring에서의 빈은 ApplicationContext가 만들어서 그 안에 담고있는 객체를 의미한다.

스프링은 스프링 컨테이넌에 빈을 등록할 때 기본으로 싱글톤으로 등록한다. (하나의 객체만 등록하여 관리)
설정으로 싱글톤이 아니게 설정할 수 있지만, 대부분 싱글톤 사용

 

sec2캡쳐2

  • 스프링이 처음 실행될 때 스프링 컨테이너가 생성되고 스프링 컨테이너에서 @Controller, @Service, @Repository 등 어노테이션이 붙은 객체를 생성하여 관리한다.

2. 스프링 빈을 등록하는 방법

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

3. 컴포넌트 스캔 원리

  • @Component 어노테이션이 있으면 스프링 빈으로 자동 등록 된다.
  • @Controller, @Service, @Repository 등은 @Component를 포함하는 어노테이션으로 자동 등록이 된다.
<code />
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Controller { /** * The value may indicate a suggestion for a logical component name, * to be turned into a Spring bean in case of an autodetected component. * @return the suggested component name, if any (or empty String otherwise) */ @AliasFor(annotation = Component.class) String value() default ""; }

4. 의존관계 설정

sec4캡쳐1

  • Controller는 Service를 , Service는 Repository를 의존한다. 이를 의존 관계라고 말한다.
  • Controller, Service 의존 관계 설정 예시
<code />
private final MemberService memberService = new MemberService();
  • new 연산자 사용시 해당 컨트롤러가 아닌 다른 컨트롤러에서도 가져다 쓸 수 있는 문제점 발생 (사용하지 않는다)
<code />
@Controller public class MemberController { private final MemberService memberService; // 해당 클래스에 @Service 등록 필요 @Autowired // 의존관계 주입 DI 중 생성자 주입 public MemberController(MemberService memberService) { this.memberService = memberService; } /* // 의존관계 DI 중 세터주입 @Autowired public void setMemberService(MemberService memberService) { this.memberService = memberService; } //의존관계 주입 DI 중 필드 주입 @Autowired private MemberService memberService; */
  • final 키워드는 무조건 초기화가 이루어져야한다. 생성자를 통해 초기화를 해주거나 바로 초기화를 해줘야한다. (실수 예방)
  • @Autowired 를 통해 의존 관계 주입 (Dependency Injection), 생성자, 세터, 필드 DI 존재
    ※ @Autowired는 스프링 빈에 등록이 된 객체에서만 동작한다.
  • DI에서 의존관계가 실행중에 동적으로 변하는 경우가 거의 없으므로 생성자 주입을 권장한다.

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

  • 주로 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.
<code />
package hello.hellospring; import hello.hellospring.repository.MemberRepository; import hello.hellospring.repository.MemoryMemberRepository; import hello.hellospring.service.MemberService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SpringConfig { @Bean public MemberService memberService() { return new MemberService(memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } }
  • @Service, @Repository, @Autowired 등 어노테이션 사용하지 않고 @Configuration 과 @Bean을
    사용하여 직접 스프링 빈에 등록한다.

본 포스팅은 인프런 김영한님 강의(스프링 입문)를 토대로 정리한 내용입니다.

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^