Spring Triangle
Dependency Injection :
car은 tire에 의존성을 주입당했다. car생성자 매개변수로 tire이 들어온다. 만약 생성자에 매개변수 받지 않고, 기본 생성자로
Car () {
this.tire = new KoreaTire();
}
와 같이 하면, Car 생성할 때 car은 무조건 Tire 타입의 타이어를 갖게 된다. car와 tire가 강한 결합?이 되어서, 타이어를 갈게 되면, 무조건 KoreaTire에 의존성을 갖게 된다. OCP측면에서 나쁘다.
Car (Tire tire) {
this.tire = tire;
}
와 같이 하면 생성자 매개변수로 새로운/다른 타입의 tire을 넣을수 있다.
ApplicationContext ctx = new ClassPathXmlApplicationcontext("config.xml", Kyu.class);
config.xml은 new로 생성하려 할 때 xml file..
어플리케이션 context에서 getBean으로 koreaTire이란 name의 Bean을 가져오라고 하면, 에러가 난다. 그런 이름의 빈이 없다고 한다. xml파일에 <bean>
으로 name koreatire, class honux.KoreaTire로 등록해주면 된다.
POJO: plain old java ~. xml설정이 모여있다. code를 돌아다니며 고치는것보다, xml 파일 단 하나만 보면 되므로 설정파일을 xml에 모아 둔 것이다. (마이바티스 쓰면 쿼리를 모아서 xml파일에 모아둔다. 코드가 아닌 모든 것을 resource아래 xml에 두는데, 모든 빈과빈을 엮는 것을 xml로 해준다. 한 xml에 모두 다 넣기엔 너무 내용이 많기 때문에, 쪼개서 넣는다.
xml 로 하면, setter로 주입시켜줘야한다.
코드에선 Tire tire = ctx.getBean("tire", Tire.class);로 빈을 가져오고, xml에서 <bean>
에다 KoreaTire, MichellinTire로 어떤 종류의 tire인지 지정해주면 된다. main클래스의 코드는 건드리지 않고, xml 설정파일에서 어떤 타이어를 쓸지 수정할수 있는 것이다.
또는, 생성자 주입으로하고, xml에서 <property>
로 매개변수 주입??
@autowired를 하면 생성자, setter 필요없다. xml에 <context:annotation-config/>
추가하고, <beans>
에는 xmls:context="http:www.springframework.org/schema/context"
를 추가해준다.
어떤 타이어를 쓸지 메인코드에서 지정해주지 않아도, autowire을 통해 tire이면 car에 주입해준다. 이때 xml파일에서 설정한 tire의 종류를 따른다. 만약 한국타이어 타입으로 빈 설정이 되어있으면 car에 한국타이어가, 미셰린 타이어 타입으로 빈설정이 되어있으면 car에 미세린 타이어가 달린다. tire타입 빈이 하나밖에 없으면 알아서 껴준다.
그런데 만약 한국타이어 타입, 미셰린타이어 타입 빈이 두개가 등록이 되어 있으면, @autowired에서 어떤 타이어 빈을 가져와서 주입시켜야할지를 모른기 때문에, 에러가 난다.
한국타이어, 미세린 타이어 중 어떤 타입의 빈을 등록할지 설정하려면, @autowired밑에 @Qualifier("빈이름")을 어떤 것 설정할지 정해준다.
@Resource도 @Autowire대신에 사용할 수 있는데, autowire은 스프링 어노테이션이고, @Resource는 자바의 표준 어노테이션이다. 둘의 차이는 크지 않다. 자바 표준으로도 dependency injection이 된다.
@Configuration이 xml파일을 대신하는 것이다. ApplicationContext ctx 가 annotationConfiguration~~로 설정된다. 어노테이션 기반으로 빈들을 엮어준다. 빈은 빈끼리 의존성을 갖는다. car을 빈으로 만들어준 이유도 @autowire을 쓰기 위해선 car가 빈이어야하기 때문이다.
웹서버가 있고, 그 안에 서블릿 컨테이너가 있다. 서블릿 컨테이너엔 여러 서블릿이 담긴다. 스프링도 서블릿의 일종이다.
스프링 부트 안에 내장 탐캣이 담겨 있다.
-스프링 컨테이너에 담긴 빈. 빈끼리 연결된 것은 빈끼리의 의존성이 생긴 것이다. 의존성은 xml, configuration으로 집어넣는다. applicationContext ioc, inversion of control이라고한다. 컨트롤이 역전된 컨테이너라고, 의존성을 날로생으로 주입하지않고, 설정파일을 이용해 의존성을 거꾸로 주입해준다고 해서 IOC Container이라고 한다. ApplicationContext가 IOC Container이다.
스프링 컨테이너가 관리하는 Object를 빈이라고 부른다. jar가 항아리(java archive)에 빈을 담는다는 뜻이다. 스프링 컨테이너가 여러분의 평범한 자바, pojo를 configuration metadata를 이용해서 빈으로 바꿔준다.
스프링 빈들은 전부 싱글톤이다. 라이프스타일에서 해당하는 객체가 단 한개 생기는 것이 싱글톤이다.
setter은 p namespace, 생성자는 c namespace로 <bean>
의존성을 한줄로 설정할 수 있따.
<context: cmponent-scan>하면 내 소스 전체 돌아서 @Component단 애들 전부 빈으로 등록한다.