1.스프링 프레임워크와 DI, AOP

이준경·2021년 6월 21일
0

프레임워크

  • 뼈대, 틀, 골자
  • 재사용 되는 공통 부분을 프레임워크로 구현하여사용

스프링 프레임워크

  • 애플리케이션 프레임워크
  • 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크
  • 일반적인 자바 객체(POJO:Plain Old Java Object)사용
  • DI 및 AOP기반 컨테이너이자 프레임워크

주요 기능과 특징

  • DI(Dependency Injection)
  • AOP(Aspect Oriented Programming)
  • POJO
  • 트랜잭션 처리를 위한 일관된 방법 제공
  • 영속성과 관련된 API제공
  • 자체적으로 mvc 프레임워크 제공

POJO

  • import 하지않고 순수한 자바로 이루어진것

DI(종속 객체 주입)

  • 두개 이상의 클래스가 서로 협력할때 종속 객체를 생성하거나 얻는 것이 아닌 주입함(단위 테스트 수월)
    (생성 및 얻는 것은 의존하는 클래스가 변경되는 경우 모든 코드를 변경해야 하는 문제 발생)
  • 객체간의 의존 관계를 외부의 조립기가 수행함(스프링)
  • 생성자나 setter메서드를 통해 의존 객체를 전달 받음
  • 느슨한 결합도

--만드는법

  • applicationContext.xml에서 객체를 만들어준다.
    1. bean을 이용한 DAO 객체 만들기

    1
    2
    <bean name="articleDAO" class="com.spring.di.OracleArticleDAO">
        </bean>
    cs
  • 이를 생성자 또는 메서드에 연결하여 넘긴다.
    1. 생성자의 경우

    1
    2
    3
    4
    5
    6
    <bean name="articleService2"
            class="com.spring.di.ArticleServiceImpl2">
            <constructor-arg>
                <ref bean="articleDAO" />
            </constructor-arg>
    </bean>
    cs
    2. setter의 경우
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <bean name="articleService3"
            class="com.spring.di.ArticleServiceImpl3">
            <property name="articleDao" ref="articleDAO"></property>
        </bean>
     
    <!-- 또는 -->
     
    <bean name="articleService3"
            class="com.spring.di.ArticleServiceImpl3"
            p:articleDao-ref="articleDAO">
        </bean>
    cs
  • 이렇게 만들어진 빈을 메인에서 불러와 사용한다.

    스트링 컨텍스트 로드 이용

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //1) 스트링 컨텍스트 로드
    ApplicationContext context
            =new ClassPathXmlApplicationContext("applicationContext.xml");
                    
    //2) 빈 얻어오기
    ArticleService service2 
            = (ArticleService) context.getBean("articleService2");
            
    //3) 빈 사용하기
    ArticleVO vo2 = new ArticleVO();
    vo2.setNo(2);
    vo2.setTitle("DI - 생성자 이용한 종속객체 주입");
    service2.write(vo2);
    service2.edit(vo2);
    cs

와이어링

  • 애플리케이션 컴포넌트 간의 관계를 정함
  • 종속객체 주입.

애플리케이션 컨텍스트

  • applicationContext.xml 스프링 설정 파일을 로드하여 애플리케이션을 구동함.
  • 빈에 관한 전의들을 바탕으로 빈들을 엮음.
  • 객체의 생성과 와이어링을 책임짐
  • 위 소스의 ClassPathXmlApplicationContext임.

AOP(애스펙트 지향 프로그래밍)

  • 애플리케이션 전체에 걸쳐 사용되는 기능을 재사용할 수 있는 컴포넌트에 담는 것.
  • 핵심 로직을 구현한 클래스를 실행하기 전, 후에 Aspect를 적용함.(전, 후에 공통 모듈(기능) 수행)
  • 의존 관계의 복잡성과 코드 중복을 해소.

--만드는법

  • 공통 관심 사항을 구현한 POJO 클래스 작성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.aspectj.lang.ProceedingJoinPoint;
     
    public class LoggingAspect {
        private Log log = LogFactory.getLog(getClass());
        
        public Object logging(ProceedingJoinPoint joinPoint) throws Throwable{
            log.info("기록 시작:"+ joinPoint.toString());
            
            long start = System.currentTimeMillis();
            try {
                Object retValue = joinPoint.proceed(); //실제 타켓 메서드 호출
                /*ProceedingJoinPoint 객체는 Aspect 가 적용되는 객체 및 메서드에 
                 대한 정보를 담고 있으며, 이 객체를 통해서 핵심 로직을 실행할 수 있게 됨*/
     
                return retValue;
            }finally {
                long finish = System.currentTimeMillis();
                long time=finish-start;
                log.info("기록 종료");
                log.info(joinPoint.getSignature().getName() + "메서드 실행시간:"
                        + time +" 밀리초");
            }
            
            //설정 파일에서 Aspect를 어떤 클래스의 어떤 메서드에 적용할지를 설정한다
        }
    }
    cs
    1- JoinPoint : 공통 관심 사항이 적용될 수 있는 지점 (ex)메서드 호출 시, 객체 생성 시 등)

    2- ProceedingJoinPoint : JoinPoint 의 하위클래스로
    서 proceed() 메서드를 가지고 있다.

    3- ProceedingJoinPoint 객체는 Aspect 가 적용되는 객
    체 및 메서드에 대한 정보를 담고 있으며, 이 객체를 통
    해서 핵심 로직을 실행할 수 있게 됨

    4- proceed() 메서드를 사용하여 실제 타켓 메서드를 호
    출하게 된다

  • 공통기능 구현 후 Aspect를 어떤 클래스의 어떤 메서드에 적용할지 설정

    1
    2
    3
    4
    5
    6
    7
    8
    <aop:config>
            <aop:pointcut expression="execution(* *..*Service.*(..))" 
                id="servicePointcut"/>
            
            <aop:aspect id="loggingAspect" ref="loggingAsp">
                <aop:around method="logging" pointcut-ref="servicePointcut"/>
            </aop:aspect>
        </aop:config>
    cs
    1- loggingAspect의 logging()메서드를 이름이 Service로 끝나는 인터페이스를 구현 한 모든 클래스의 모든 메서드 앞, 뒤로 실행 하라

    <aop:around> 메서드 호출 전, 수 예외 발생등 모든 시점에 적용 가능한 Adcice를 정의한다.
    <aop:after> 메서드가 정상적으로 실행되는지 또는 예외 발생시키는지 여부 상관없이 적용되는 Advice를 정의. finally와 비슷함.
    <aop:after-throwing> 메서드가 예외를 발생시킬 때 적용되는 Advice를 정의. catch와 비슷
    <aop:after-returning> 메서드가 정상적으로 실행된 후에 적용 되는 Advice를 정의
    <aop:before> 메서드 실행 전에 적용되는 Advice를 정의

    2- 위 소스 중 execution(수식어패턴 리턴타입패턴 클래스이름패턴 이름패턴(파라미터패턴) 예외패턴)
    수식어 - 생략 가능, public, protected
    리턴타입 - 리턴 타입명시
    클래스이름 - 패키지명.클래스 이름. 메서드 이름을 패턴으로 명시
    파라미터 - 매칭될 파라미터 명시
    각 패턴은 이용하여 모든값 표현 가능
    '..'은 0개 이상이라는 의미
    execution(
    get*(..))
    이름이 get으로 시작하고 0개이상의 파라미터를 갖는 메서드 호출
    리턴,이름,파라미터 제외 나머지 생략가능

0개의 댓글

관련 채용 정보