스프링 빈이란?

스프링이 객체를 생성해 들고 있는다.

즉, 스프링 컨테이너가 생성될 때 컨트롤러(빈)가 같이 생성된다.

 

why?

객체를 계속 생성할 필요가 없고 미리 생성해 그것을 사용한다.

 

빈과 의존관계

 

컨트롤러(@Controller) -> 서비스

컨트롤러로 요청이 들어오면 서비스를 통해 비즈니스 작업을 해야 하기에 컨트롤러가 서비스에 의존한다.

 

의존관계 주입방법

컨트롤러, 서비스를 다 빈으로 등록해준다.

의존관계를 생성할 땐 @Autowired를 사용한다.

 

빈등 록 방식

1. 컴포넌트 스캔

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

 

빈 등록은 메인 메서드가 있는 패키지부터 시작한다.

즉, 하위 패키지에 있는 것만 등록된다.


자바 코드로 빈 등록하기

 

@Configuration

public class SpringConfig {



    @Bean

    public MemberService memberService() {

        return new MemberService(memberRepository());

    }



    @Bean

    public MemberRepository memberRepository(){

        return new MemoryMemberRepository();

    }

}

애노테이션으로 등록하기

@Aspect
@Component
public class TimeTraceAop {

    @Around("execution(* hello.hellospring..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
        long start =  System.currentTimeMillis();
        try {
            return joinPoint.proceed();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println(joinPoint.toString()+" / timeMs : "+timeMs+"ms");
        }

    }
}

@Component,@Service,@Repository 대신 자바로 등록할 수 있다.

정형화된 코드(@Service,@Repository)는 컴포넌트 스캔을 사용한다.

 

또, 생성자로 빈을 생성하는 게 제일 안전하다.

    private final MemberRepository memberRepository;
	
    //생성자
    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

IOC 

Inversion of Control

제어권이 뒤바뀐다.

원래는 자기가 사용할 의존성은 자기가 만들어 사용한다.

Ex) new로 생성해서 사용하는 것

 

Ioc는 사용하지만 만들지 않는다. 즉 누군가가 생성해준다.

누군가란? 스프링

Ex) new를 사용하지 않는다.

 

의존성 주입 예제

 

스프링에서 의존성을 주입해준다.(생성자 방식)

private final OwnerRepository owners;
public OwnerController(OwnerRepository clinicService, VisitRepository visits) { 
	this.owners = clinicService; 
    //vistis 는 생략 this.visits = visits;
}

 

만약 IoC가 적용 안되었다면?

이런 식으로 사용하면 원래 Null point Exception 에러가 난다.

 

Spring이 관리하는 객체를 Bean이라고 함.

즉, 스프링이 빈 객체를 생성해 주입해줘서 동작되게 한다.

 

결론 : IoC에서 객체 생성은 내가 하는 것이 아닌 스프링이 필요한 의존성을 주입해준다. 

 

IOC 컨테이너(Bean Factory) ApplicationContext

Bean Factory이 IOC 컨테이너인데 ApplicationContext는 BeanFactory를 상속받는다.

 

IOC컨테이너 역할

bean 생성하고 bean들 사이에 의존성을 엮어주고 스프링에 제공해준다.

 

OwnerController, OwnerRepository 등 즉 컨트롤러, 레파지토리 등은 빈으로 등록해 사용한다.

 

모든 클래스가 다 무조건 bean으로 등록되는 것이 아니다.

 

@Controller 등

@으로 등록하는 방식,

extends Repository 상속하는 방식,

@Bean으로 등록하는 방식 등

여러 가지 방법으로 Bean으로 설정이 가능하다.

 

의존성 주입은 bean끼리만 사용한다. 예외의 경우 다른 객체에 할 수 있지만 거의 하지 않는다.

즉, 주로 IOC컨테이너 안에 있는 객체에만 서로 의존성 주입을 한다.

 

IOC컨테이너는 매번 새로 객체를 생성하는 것이 아니라 생성된 객체를 같이 사용한다.

 

Bean

IoC 컨테이너가 관리하는 객체를 말한다. 

ApplicationContext가 만들어서 그 안에 담고 있는 객체를 말한다.

Component Scannig

-@Controller

-@Service

-@Repository

-@Component

등 여러 가지 등을 찾아서 bean으로 등록한다.

 

ex)

public interface OwnerRepository extends Repository<Owner, Integer>

Repository를 보면 특정한 @이 없더라도 특정 인터페이스를 상속받는 클래스를 찾아서 

내부에서 인터페이스를 구현하고 Bean으로 등록한다.

 

직적 Bean으로 등록

@Configuration과 @Bean으로 등록할 수 있다.

@Configuration(proxyBeanMethods = false)

@EnableCaching

class CacheConfiguration {



@Bean

public JCacheManagerCustomizer petclinicCacheConfigurationCustomizer() {

return cm -> {

cm.createCache("vets", cacheConfiguration());

};

}

}

 

 

@Autowried로 IoC컨테이너에서 객체를 꺼내 사용할 수 있다.

 

 

의존성 주입(Dependency Injection)

 

@Autowried로 보통 주입을 한다.

생성자

스프링 4.3부터 이상부턴 생성자에서 생략하고 사용할 수 있다.

public OwnerController(OwnerRepository clinicService, VisitRepository visits) {

this.owners = clinicService;

this.visits = visits;

}

,

필드

@Autowired

private final OwnerRepository owners;

, set

public void setOwners(OwnerRepository r){

this.owners = r;

}

등으로 주입할 수 있다.

 

주의점 : final로 생성하면 무조건 생성하거나 생성자를 만들어야 한다.

 

 

생성자를 생성하자 않고 @Autowried로 생성자 주입도 가능하다. (자주 사용하는 방법)

bean으로 등록되어있지않으면 의존성주입은 불가능하다.

'개발 소발 > 개발 Spring' 카테고리의 다른 글

Spring Autowired와 ComponentScan이란  (0) 2020.07.10
AOP란? AOP 기초개념  (0) 2020.07.09
프레임워크 개념  (0) 2018.01.26
SpringMVC란?  (0) 2018.01.11
MVC패턴이란?  (0) 2018.01.11

Bean등록 및 메타정보구성이란?


Bean등록 메타정보 구성전략


1. XML 단독 사용

- 모든 Bean을 명시적으로 XML에 등록하는 방법이다.

- XML장점:생성된 Bean을 XML에서 확인할 수 있는 장점이 있다.

- XML단점:Bean개수가 많아지면 XML관리가 번거로워진다.

- 여러개발자가 같은 설정파일을 공유해서 개발할시 설정파일을 동시에 수정하면 충돌문제가생긴다.

- DI에필요함 Setter,constructor가 코드내에 반드시 존재해야한다.

- 개발중 보다는 운영중에 적합하다.





2. XML과 빈 스캐닝((Bean Scanning)의 혼용

-Bean에 해당되는 클래스에 어노테이션을 부여해준다.

-어노테이션 붙은 클래스를 자동으로 찾아 빈스캐닝을 해준다.(자동스캔)

-어노테이션을 부여하고 자동 스캔하면 XML문서자 많이 줄어든다.

-단점:Bean설정 정보를 한번에 파악하기 어려움이 있다. (의존관계파악어려움)


적합한 환경

- XML 단독 사용 : 운영환경적합하다.(한눈에 확인가능)

- XML과 빈 스캐닝((Bean Scanning) : 개발환경에적합하다.(XML을 공유하는 상황이 줄어듬)




Bean등록 및 의존관계 설정(annotation)

-@Component

-일반적인 스테레오타입이다.

-<bean>태그와 동일한 역할을 한다.

-@Repository

-영속성을 가지는 속성(파일,DB)을 가진 클래스이다.

-@Service

-비지니스로직을 가지는 클래스를 말한다.

-@Controller

-프리젠테이션레이어에서 사용한다.(웹어플리케이션에서 웹요청과 응답처리) 화면과 연결


Bean의존관계를 주입 Annotation

-@autowired

- 정밀한 의존관계 주입(DI)이 필요한 경우에 사용한다.

- 프로퍼티,setter메서드,생성자,일반메서드에 적용된다.

- 의존 하는 객체를 주입할떄 주로 Type을 이용하게된다.

- XML에서 <property> ,<constructot-arg>태그와 동일한 역할이다.


-@Resource

-기능면에선 autowired와 동일하다.

-프로퍼티,setter에서 제한적 사용된다.

-해당되는 객체를 가져올때 주로 Name으로 이용하게된다.


-@Value

-단순한값줄때 사용한다.

-@Qualifier

-@Autowired와 같이 사용한다.

-@Autowired는 타입으로 찾아 주입하는데, 동일한타입의 Bean객체가 여러개 존재할 때 특정 Bean을 찾기위해 사용한다. 


Component Scan을 지원하는 태그

<context:component-scan>태그

- @Component를 통해 자동으로 Bean을 등록한다.

- @Autowired로 의존관계를 주입받는 어노테이션을 클래스에서 선언하여 사용했을 경우,

해당 클래스가 위치한 특정 패키지를 Scan하기위한 설정을XML에 해준다

- 즉 위에있는 어노테이션을 읽어줄수있게 패키지명을 XML에 등록한다.

ex><context:component-scan base-package="myspring.di.annot" />

<context:include-filter>태그 & <context:exclude-filter>태그

-자동 스캔될시 포함시킬클래스, 포함시키지않을 클래스 구체적으로 명시한다.



SpringPrinter클래스



Hello클래스



value.properties파일



annot.xml






bean,properties설정이란?


Bean의존관계 설정방법

Property값 설정방법

Property파일을 이용한 설정


Bean의존관계 설정방법


Setter Injection

- Setter 메서드를 통해 의존관계가 있는 Bean을 주입하려면 <property>태그사용한다.

- ref는 객체 Bean이름을 통해 주입할 Bean을찾는다.

- value는 단순값이다.


ex)

class

bean.xml


Constructor Injection

- Constructor를 통해 의존관계가 있는 Bean을 주입하려면<constructor-arg>태그를사용한다.

- Constructor 주입방식은 생성자의 파라미터를 이용하기 때문에 한번에 여러개의 객체를 주입할 수 있다.<------------------Setter와차이점


ex)

class


bean.xml

index경우

name경우



Property설정방법




프로퍼티 파일을 이용할 설정방법

- 자주변경되는정보를 사용할때 사용한다.(Ex:DB정보)

- properties파일로 분리하는 깔끔하다.

- key=value로 구성된다.



프로퍼티파일생성


bean.xml




+ Recent posts