Spring

Spring STEP 3 - DI & AOP

IT의 큰손 2023. 6. 14. 11:35
728x90

★ DI

  • 파일 구성 요소
src/main/java > "com.test.di04"
                > "BoardController.java"		// 컨트롤러(흐름 통제)
                > "BoardService.java"(I)		// OOOService. 주업무 객체
                > "BoardServiceImpl.java"(C)		// OOOServiceImpl.
                > "BoardDAO.java"(I)			// OOODAO. 데이터 객체
                > "BoardDAOImpl.java"(C)		// OOODAOImpl.

src/test/java > "com.test.di04"
								> "XMLTest.java"
								> "AnnotationTest.java"
  • XML 방식
  • - root-context 설정
<bean id="controller" class="com.test.di04.BoardController">
    <constructor-arg ref="service"></constructor-arg>
</bean>

<bean id="service" class="com.test.di04.BoardServiceImpl">
    <property name="dao" ref="dao"></property>
</bean>

<bean id="dao" class="com.test.di04.BoardDAOImpl"></bean>
  • Annotation 방식
의존 주입 방식 : @Autowired
Component 설정 
- 기본 : @Component
- 컨트롤러 : @Controller
- 주요 서비스 : @Service
- DB, 저장소 : @Repository
  • - context 설정 
<context:component-scan base-package="com.test.di05"></context:component-scan>

 

★ AOP

  • 파일 구성 요소
- "com.test.aop1" 패키지 생성	
            > "Main.java"					//메인
            > "Memo.java"(I)				//메인 업무 객체(인터페이스)
            > "MemoImpl.java"(c)		//메인 업무 객체(클래스)
            > "Logger.java"(c)				//보조 업무 객체(클래스)
            > "memo.xml"					//스프링 설정 파일(<beans>)
  • XML 방식
  • - memo.xml 설정
<!-- 주 업무 객체 -->
<bean id="memo" class="com.test.aop1.MemoImpl"></bean>

<!-- 보조 업무 객체 -->
<bean id="logger" class="com.test.aop1.Logger"></bean>

<!-- 주 업무 객체 + 보조 업무 객체 -->
<aop:config>

    <!-- 보조 업무를 담당할 객체를 지정: 역할 -->
    <aop:aspect id="loggerAdvice"  ref="logger"></aop:aspect>

</aop:config>
  • 주 업무 객체를 지정 > 메소드 찾기 > PointCut 지정하기
주 업무 객체를 지정 > 메소드 찾기 > PointCut 지정하기

PointCut > 주 업무 객체의 특정 메소드
            > Memo 객체의 메소드 중 하나(이상)

AspectJ 표현식 > PointCut 지정
- execution() 지시자
- execution([접근지정자] 반환형 [클래스].메소드(인자))

- execution(public void com.test.aop1.MemoImpl.add(String))

- '*' : 와일드 카드(접근 지정자, 반환형, 패키지, 클래스, 메소드)
- '..' : 와일드 카드(인자) > 0개 이상의 인자 값'

- within() 지시자
- within(패키지.클래스)
  • memo.xml -> PointCut 사용 ex)
<aop:pointcut expression="execution(public void com.test.aop1.MemoImpl.add(String))" id="p1"/>

<aop:pointcut expression="execution(public String com.test.aop1.MemoImpl.read(int))" id="p2"/>

<aop:pointcut expression="execution(public void com.test.aop1.MemoImpl.add(String)) || execution(public String com.test.aop1.MemoImpl.read(int))" id="p3"/>

<!-- 가장 줄인 표현 -->
<aop:pointcut expression="execution(void add(String))" id="p4"/>

<!-- 패턴으로 잡을 때의 표현 -->
<aop:pointcut expression="execution(void add(String))" id="p5"/>

<aop:pointcut expression="execution(* com.test.aop1.MemoImpl.*(..))" id="p6"/>

<aop:pointcut expression="execution(* com.test.aop1.MemoImpl.*(..))" id="p7"/>

<aop:pointcut expression="within(com.test.aop1.MemoImpl)" id="p8"/>

<aop:pointcut expression="execution(void add(String))" id="p9"/>
  • memo.xml -> PointCut 주업무와 결합
<!-- 
 <aop:after method="log" pointcut-ref="p1" />
 <aop:after method="log" pointcut-ref="p2" />
 <aop:after method="log" pointcut-ref="p3" />
 <aop:after method="log" pointcut-ref="p4" />
 <aop:after method="log" pointcut-ref="p6" />
 <aop:after method="log" pointcut-ref="p7" />
 <aop:after method="log" pointcut-ref="p8" />
 -->
 <!-- 로그를 전에 찍는 것 -->

 <!-- 
    <aop:before method="log" pointcut-ref="p9" />
 -->

 <!-- <aop:around method="time" pointcut-ref="p9" /> -->

 <!-- <aop:after-returning method="history" pointcut-ref="p2" returning="memo" /> -->

 <aop:after-throwing method="check" pointcut-ref="p2" throwing="e" />

 

★ IOC, Inversion of Control

  • 역제어
IOC, Inversion of Control
- 역제어
- DI를 만들면서 생성 되는 것

객체 생성 순서
- 기존 방식
	- BoardController > BoardService > BoardDAO
- 의존 주입
	- BoardDAO > BoardService > BoardController :: IOC
728x90