[Spring] Spring DI
Spring
등장 배경
EJB 쓰다가 기능이 좋지만 복잡한 스펙으로 쓰기 어려움. 웹 사이트가 커지면서 엔터프라이즈 급의 서비스가 필요하게 됨. 세션빈에서 트랜잭션의 관리가 용이함. 로긴, 분산처리, 보안 등
자바 진영에서는 EJB가 엔터프라이즈급 서비스로 각광받음.
POJO(Plain Old Java Object)
- 특정 프레임워크나 기술에 의존적이지 않은 자바객체
- 특정 기술에 종속적이지 않아서 생산성 이식성 향상.
- Plain: 컴포넌트 인터페이스를 상속받지 않는 특징(특정 프레임워크에 종속되지 않는)
Old: Ejb 이전의 자바클래스를 의미
- 경량 프레임워크 : EJB가 제공하는 서비스를 지원해줄 수 있는 프레임워크 등장. Hibernate, JDO, ibatis(Mybatis), Spring
pring은 내부적으로 아무것도 안해도 싱글턴이며 팩터리 메서드가 지원이 된다. dto같은건 싱글턴 되면 안되지만 그거도 물론 설정이 가능.
스프링은 기본적으로 싱글턴으로 만들어짐.
밑이 xml설정, 위가 어노테이션 설정
서비스는 dao 필요 중간에 프로퍼티 이용해서 멤버 dao라는 프로퍼티에
이 서비스라는 클래스 안에 public void set member라는 애가 있는 거
실제로 설정하는 하나하나의 객체를 컴포넌트라 한다.
이 컴포넌트 하위에는 웹 mvc의 경우 컨트롤러, 서비스 이렇게 있고 dao있는데 dao는 영속성(자료의 집합)이라 리포지토리로 관리 가능. dto같은 경우는 포함 안되니 그냥 @Component라 설정.
@autowired는 그냥 설정해두면 타입에 맞는걸 그대로 주입 시켜줌. 저 한줄에 의해 타입인 레퍼런스를 얻어서 바로 주입해줌. 쓰기 위해선 빈 스캐닝을 사용해야한다.
회원의 이름 관리하는 프로퍼티는 name
컴포넌트 스캔. 베이스 패키지에있는 모든클래스에서 검색해서 타입 맞는 거 주입시켜줌.
DI가 없으면 설정 못함. DI가 설정 한 애들 객체간의 결합을 느슨하게 만든다는 점이 중요.
생성자를 이용하는 방법도 있다.
프로퍼티 이용하는 법 사용하는 법이 2가지가 거의 같다.
컬렛션 넣는건 흔하지는 않을 것.
엔터프라이즈 환경 = 분산환경
의존관계
클래스와 클래스간에 존재하는 의존관계(의존도)를 낮추는 게 중요하다. 의존도가 높아지면 문제가 생길 수 있다.
B를 가져다 쓰는게 A면 B가 바뀌면 A가 바뀌어야 할 수도 있다. C도 마찬가지.
컨테이너 기능
이용 되는 쪽 애들이 변동이 되 그걸 쓰는 애도 변경
컨테이너 제공되는애가 활용이 안 되면 아무것도 안된다.
톰캣을 컨테이너라 불렀다. 컨테이너라는 애가 하는 기능 중 객체를 생성. 웹 할 때 클라이언트가 서버쪽으로 요청. hello servlet을 달라고 했다 치면 서블릿이 new 해서 생성한 적이 없음. 클라이언트는 HelloServlet 달라 요청만 하면 서버쪽의 톰캣이 요청 들어오면 들어와서 서블릿 여러개 중 내부에 톰캣이 생성한거.
서비스를 이용하는 최종자는 A,B 신경 안 쓰고 중간에 낀 컨테이너(인력사무소)에 요청만 하면 된다.
bean 설정파일, 환경파일이라 부를 수 도 있다.
컨테이너라는 애가 객체를 미리 만들어서 공급해줘야 한다.
XML=컨테이너가 미리 생성해서 대기 시켜놓을 객체들에 관한 정보가 들어있음.
컨테이너가 미리 준비해야 되는데 a,b,c,d,e,f,g 를 준비해야 된다면 다 xml 문서에 언급 되어있어야 한다.
컨테이너 등장(스프링에서 제공) 객체를 미리 만들어서 대기시켜줌. 그리고 공급해줌.
공급기라는 용어가 사용 되기도 함. xml 문서가 나와야 뭘 만들라고 정보가 들어있음.
결론은 스프링은 쓰면 엔터프라이즈 어플리케이션을 만들때 편하다
근데 일반 메인함수 있는 어플리케이션 만들 때도 사용이 된다.(아까 맨처음 교시떄 쓰던거)
자바는 src/main에 자바 코드 넣고 src/main/resource엔 자바코드가 아닌 xml문서를 넣는다.