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
'Spring' 카테고리의 다른 글
Spring STEP 6 - MyBatis 활용 게시판 만들기 (0) | 2023.06.16 |
---|---|
Spring STEP 5 - MyBatis 응용 (1) | 2023.06.15 |
Spring STEP 4 - Spring MVC (0) | 2023.06.14 |
Spring STEP 2 - 스프링 구성요소 (2) | 2023.06.13 |
Spring STEP 1 - 기초 및 셋팅 (0) | 2023.06.13 |