[스프링]
# sts : 스프링에 최적화된 이클립스
# ejb를 제외하고도 j2ee개발을 가능하도록
# 장점
- 경량 컨테이너 : 객체의 라이프 사이클 관리, JEE 구현을 위한 API제공
- 객체간의 의존관계 : 필요한 객체를 알아서 만들어준다.
- aop : 필요한 부가적인 서비스 지원
- pojo : 기존 객체 사용가능
- 다양한 API와의 연동지원
# 3대 API
- 스프링 DI(Dependency Injection)
- AOP
- MVC
[DI]
# 의존성 주입(Dependency Injection, DI)
- 객체간의 의존관계를 만드는 것을 DI라 한다.
- 높은 결합도 : 하나를 수정하면 의존관계가 있는 다른 하나도 수정해야 한다.
- 느슨한 결합이 주요 강점
- 개발자가 편리하다(객체생성 및 연결관계를 만드는 작업)
# 스프링 설정파일
- root tag <beans>
- <bean> : 스프링컨테이너가 관리할 Bean객체를 생성
- xml을 가지고 있는건 스프링 컨테이너
- <bean id=“dao” class=“spring.di.model.MemberDAO”/>
ㄴ> dao라는 이름으로 memberdao생성
# 스프링컨테이너 생성
- xml을 가지고 스프링컨테이너를 만들고 그 안에 객체 사용
# 객체 주입의 방법
1) 컨스트럭쳐 방식 : 생성자를 이용해서
- <bean>의 하위태그
- <ref> -> 객체등을 넣을 때
<value> -> 문자, 숫자 등을 넣을 때
문자형
<bean id=“person” class=“vo.Person”>
<constructor-arg>
<value>abcde</value>
</constructor-arg>
</bean>
또는
<bean id=“person” class=“vo.Person”>
<constructor-arg value=“abc”/>
</bean>
객체형
<bean id=“dao” class=“spring.di.model.OracleDAO”/>
<bean id=“service” class=“spring.di.model.service.BusinessService”>
<constructor-arg>
<ref bean = “dao”/>
</constructor-arg>
</bean>
또는
<bean id=“service” class=“spring.di.model.service.BusinessService”>
<constructor-arg ref=“dao”>
</bean>
# 메이븐
- 빌드 => 일련의 과정을 해주는
- 빌드용 보다는 라이브러리를 손쉽게 가져오기 위해서 사용한다.
ㄴ> 라이브러리 관리용
- pom.xml => 라이브러리
<dependencies>
<dependency>
여 안에 붙히고
<dependency>
<dependencies>
- 메이븐이 문제가 생겼을 경우
c - 사용자 - kosta - .m2 - repositoy 안에 폴더를 날리고 다시 실행
C:\Users\kosta\.m2
- 레파지토리 받는 곳
https://mvnrepository.com/
여기서 spring 컨텍스트 4.3.2
-순서
sts 설치 및 환경설정(글꼴, utf-8)
jre 1.5 => 1.8로 변경
pom.xml에 <dependency> (스프링컨텍스트 라이브러리) 붙히고
컨텍스트(xml) 만들어서 만든 dao, service를 만들고
<bean id="oracleDao" class="kosta.OracleDao" />
<bean id="service" class="kosta.WriteService">
<constructor-arg ref="oracleDao"/>
</bean>
그 안에 dao, service 써주고 설정
스프링컨테이너 생성
//스프링 컨테이너 생성
// 1) xml 리소스 가져와서 리소스 객체에 넣음
Resource resource = new ClassPathResource("applicationContext.xml");
// 2) 빈팩토리 생성에 리소스 담는다.
BeanFactory factory = new GenericXmlApplicationContext(resource);
// 3) 서비스를 가져온다.
Service service = (Service)factory .getBean("service");
//실행 후 service, dao 호출
service.insert();
service가 dao를 가지니까 호출시 출력문 두개가 호출되야함
2) 프로퍼티 방식 : setter를 이용해서
- < property name=“dao” ref=“dao”>
name은 변수명, ref는 bean id와 맞춘다.
# 위의 두 방법은 명시적인 방법이고 자동으로 할 수 있다.
# 오토와이어 방식
- service와 dao를 선언
- @Autowired 선언 => 세터 위에 적어줌
- <context:annotation-config/> => xml에 적어서 설정한다.
- 생길수 있는 문제!!
ㄴ> 객체가 2개 이상일 경우 자동으로 매칭되지 못함.
- 해결법!!
ㄴ> @Autowired 선언밑에
@Qualifier("oracle") 으로 이름을 명시한다.
ㄴ> xml에는 명시한 이름을 아래 처럼 적어준다.
<bean id="oracleDao" class="kosta.OracleDao" >
<qualifier value="oracle"/>
</bean>
# 다른 자동 방법
# pom.xml에 javax inject을 붙힌다
- @Inject를
private Dao dao; 위에 붙힌다.
<!-- kosta안에 있는 것들 객체를 생성 => 모든클래스를 생성하는 것이 아님 -->
<context:component-scan base-package="kosta"/>
=> 자동으로 객체를 매칭시키기 때문에 명시적으로 사용 할 수 없다.
# 데이터타입으로 자동으로 매칭됨
// 아래의 어노테이션중 하나를 가진다면 객체를 생성한다.
// @Controller, @Service, @Repositoty, @Component
// 어노테이션 위의 네개 중 하나라도 가지고 있다면 객체를 생성한다.
위의 네개 중 컨트롤러를 제외한 세개를 같은 용도이지만 이름이 나눠진 이유는
그저 구분을 위해서
서비스는 서비스,
레파지토리는 dao,
그 외는 컴포넌트
# xml을 쓰지않고 java파일로 하는 방법
- xml대신 쓸 환경설정에 쓰일 java파일을 만들어준다 (Factory)
- @Configuration을 선언해준다.(설정파일 역할을 하기 때문에)
- @Bean을 통해서 객체를 생성한다. (메서드 형태로)
// 메서드이름을 id와 같이 해준다.
@Bean
public Dao oracleDao() {
return new OracleDao();
}
@Bean
public Service service() {
return new WriteService();
}
- main에서
// xml이 아닌 자바 파일을 이용해서한다.
ApplicationContext factory
= new AnnotationConfigApplicationContext(Factory.class);
// 3) 서비스를 가져온다. (형변환)
Service service = (Service)factory .getBean("service");
//실행 후 service, dao 호출
service.insert();
[Spring AOP] Aspect Oriented Programming
# 전체 로직을 두가지로 나눈다면
- 핵심 관심 사항
- 공통 관심 사항
- 중복된 코드 양산의 한계
# 핵심관심 사항을 바꾸면 공통관심 사항을 알아서 바꿔준다.(유연성)
# 핵심관심 사항만 실행 했는데 알아서 공통관심 사항도 같이 처리됨.
Aspect : 공통관심 사항 => 여러 객체에 공통으로 쓰이는 것
JoinPoint : 호출되는 지점
Pointcut : 포인트컷에 의해서 조인포인트가 결정된다.(조건)
Advice : Aspect가 어느 시점에 호출될 것인지(When)
Weaving : 설정
# 순서
1. aop 네임스페이스와 XML 스키마 추가
- 라이브러리 추가(pom.xml에 추가)
2. 공통관심사항(Aspect)가 들어갈 xml 생성
2. Aspect 생성(java파일),
메서드 생성(핵심로직 전,후 등에 실행될 것 만든다)
3. XML 스키마를 이용한 AOP 설정
명시자( 수식어패턴? 리턴타입패턴 패키지패턴? 클래스이름패턴. 메소드이름패턴( 파라미터패턴))
-?는 생략가능
예) execution(public * abc.def..*Service.set*(..)
<aop:config>
<aop:pointcut id=“publicmethod” expression=“execution(public * org.kosta.spring..*(..))”/>
<aop:aspect id=“logingAspect” ref=“writelog”>
<aop:around pointcut-ref=“publicmethod” method=“logging”/>
</aop:aspect>
</aop:config>
4. 메인
//배열로 핵심로직xml,공통로직xml 넣고 스프링 컨테이너 생성
String[] config = {"applicationContext.xml", "commonConcern.xml"};
ApplicationContext factory = new ClassPathXmlApplicationContext(config);
5. 실행



덧글