스프링 1

[스프링]
# 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. 실행


1 2 3 4 5 6 7 8 9 10 다음