Spring Bean

스프링 컨테이너에 의해 관리되는 자바 객체를 의미합니다.

 

 

Spring Bean 을 왜 사용하는가?

개발자는 new 키워드, Interface 호출, 팩토리 호출 방식으로 객체를 생성하고 소멸합니다.

하지만 Spring Container를 사용하면 이러한 역할을 대신 해줍니다.

1) 제어 흐름을 외부에서 관리하게 됩니다.

2) 객체들 간의 의존 관계를 스프링 컨테이너가 런타임 과정에서 알아서 생성해줍니다.

 

 

Spring Bean 등록 방식

1. Component Scan

 

- @Component 를 클래스 위에 명시하면 스프링이 알아서 등록해줍니다.

- @Controller, @Service, @Repository, @Configuration 은 @Componenet를 상속 받고 있으므로

   모두 컴포넌트 스캔 대상입니다.

 

- Controller : Spring MVC Controller
- Repository : 스프링 데이터 접근 계층으로 해당 계층의 예외는 모두 DataAccessException 으로 변환
- Service : 핵심 비지니스로 인식 ( 가독성 역할 )
- Configuration : Spring 설정 정보로 인식하고, 스프링 빈이 싱글톤 유지를 하도록 처리해줌

 

  •   컴포넌트 스캔 방법1 ( @Component를 붙쳐주는 방법 )

1) 각 서비스/레포지토리 등에 어노테이션을 달아줌 ( @Repository, @Service, @Controller )

@Service
public class MemberServiceImp implements MemberServiceInterface{
    
    private MemberRepository memberRepository;

    @Autowired
    public MemberServiceImp(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    // 회원가입
    @Override
    public Long join(Member member) {
        // 휴대폰 번호 중복 체크
        memberRepository.save(member);
        return member.getId();
    }
}
@Repository
public class JPQLMemberRepository implements MemberRepository{
    
    public Member save(Member member) {
        return member;
    }
}

 

2) 빈 등록이 됬으면 의존성 주입

 

 

  •   컴포넌트 스캔 방법2 ( @Bean를 붙쳐주는 방법 )

1) IoC컨테이너에 등록을 해줌 ( @Configuration )

@Configuration
public class SpringConfig {
	
    //등록
    @Bean
    public EntityManager getEm() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("5xik");
        return emf.createEntityManager();
    }
    
    @Bean
    public MemberServiceInterface memberService() {
        return new MemberServiceImp(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new JPQLMemberRepository(getEm());
    }
}

2) Repository / Serivce 에 필요한 의존성 주입

public class JPQLMemberRepository implements MemberRepository{

    private EntityManager em;

	@Autowired
    public JPQLMemberRepository(EntityManager em) {
        this.em = em;
    }
    
    public EntityTransaction getTx() {
        return em.getTransaction();
    }

    public Member save(Member member) {
        em.persist(member);
        return member;
    }
}

 

 

  •   컴포넌트 스캔 방법3 ( AutoConfig 설정 방식 )
@Configuration
@ComponentScan(
        excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
                Configuration.class))
public class AutoSpringConfig {

}

@ComponentScan 은 @SpringBootApplication 에 기본적으로 포함되어 있습니다.

그런데 만약 기존에 @Configuration 으로 컨테이너를 만들어 놨다면 두 설정파일을 읽어서 오류가 발생하겠죠??

 

이렇게 직접 컴포넌트 스캔을 설정해주면은 기존의 IoC컨테이너에 영향을 주지 않고

컴포넌트 스캔을 구현할 수 있습니다.

 

만약, 다른 IoC컨테이너가 없다면 따로 AutoConfig는 따로 설정할 필요 없습니다.

 

@SpringBootApplication 에 기본적으로 Component Scan 이 포함되어 있다는 의미는
IoC컨테이너가 없이도 @Component 관련 어노테이션을 다 읽는다는 의미이므로

@Repository 로 빈 등록하고,
@Configuration 내부에서 @Bean으로 또 등록하는 실수를 하게되면

Unique~~~ 와 관련 에러가 발생하니 유의하시길 바랍니다.

< 관련 오류 >
https://tjdwns4537.tistory.com/67?category=949574

 

 

+ Recent posts