열심히 끝까지
디바이스 융합 자바(Java) day66(1) - 9/14과제 설명, AOP(Advice) 본문
디바이스 융합 자바(Java) day66(1) - 9/14과제 설명, AOP(Advice)
노유림 2022. 9. 15. 12:55[ 9/14 과제 해설 ] - 어제 과제 9/14와 동일(추가된 거는 update delete뿐) 바꿀 것 없음
- 구글링을 해보니 com.회사명.dao | com.회사명.vo 라고 하는 곳을 봤음
>> 회사 내부의 규칙으로 어떤 것이 옳고 그르다는 것은 없음
: 각 회사의 "스타일"
>> 실제로 작업하는 MemberDAO는
public void insertMember(MemberVO vo){
}
의 반복
MemberDAO에 의존성 주입 @Component
>> 메모리에 해당 객체만 존재하면 됨 돌아가긴 함
>>> 메모리에 적재는 되지만 이름을 모르기 때문에 메모리 낭비
>> 모델꺼라고 알려주기 위해서 Repository(상속받음 Component로부터) 이름을 지정해줌
-> 뒤에 이름을 써주지 않아도 돌긴 함(타입만 보기 때문에)
-> 그러나 사람이 더 빨리 인식하기 위해 이름을 지정
[ 중요한 내용 다시 집기 ] - 디바이스 융합 자바(Java) day64(2) 참고
>> Spring 설정
xml 파일 | @(어노테이션) |
코드 변화 X 파일 분석만 하면 됨 설정이 과도하면 분석에 어려움이 생김 |
JAVA 코드와 함께 설계 및 분석 가능 코드 이곳저곳에 배치되어 있어 설정만 보기는 어려움 |
>> Spring 프레임워크 쓰는 이유
1. IoC와 AOP를 지원하는 경량의 프레임워크
- IoC 는 제어의 역행 + NEW를 controller에게 전가
- AOP 는 관점지향 프로그래밍 -> 높은 응집도
>> 높은 결합도(안 좋은 것) -> 코드에 new 작성됨
"컨테이너"
xml : <bean id="">
@ : Component("")
>> 이름 지어주기(id="") | ("") 강제는 아니지만 보통 지어줌
- 객체
- 멤버변수로 다른 객체를 이용
ex ) 아이폰-애플워치, 캐릭터-무기,....
의존관계(DI)
xml : 생성자, setter
@ : @Autowired => 타입만 봄
>> 타입이 여러개 존재할 경우 @Q, @R,... 사용
>> xml과 @ 둘 다 사용 가능
- AOP
AOP 설명의 용어가 엄청 어려움...
AOP만의 특별한 용어가 존재해서 AOP 용어 정리 필요
>> AOP 언제 사용하는가?
- 핵심로직(비즈니스 메서드, CRUD)에는
공통적으로 들어가는 로직이 존재함
==> 공통로직(횡단관심)이라고 함
ex ) 로깅, 예외처리, 트랜잭션, 보안(인증, 인가, 허가),....
>> 어떤 횡단관심을
어떤 핵심 로직에 연결할 지 "설정"
==> AOP 설정
>> LogAdvice.java
package com.ryo.biz.common;
public class LogAdvice {
public void printLog() {
System.out.println(">>> 공통로직 <<< 핵심로직 수행 전에 호출됨");
}
}
>> LogAdvice2.java 로 교체(새로 작성)
package com.ryo.biz.common;
public class LogAdvice2 {
public void printLog2() {
System.out.println("!!!!!!업그레이드된 공통로직!!!!!! 핵심로직 수행전에 호출됨");
}
}
>> 바꾸기 전
package com.ryo.biz.member.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ryo.biz.common.LogAdvice;
import com.ryo.biz.common.LogAdvice2;
import com.ryo.biz.member.MemberService;
import com.ryo.biz.member.MemberVO;
@Service("memberService")
public class MemberServiceImpl implements MemberService {
@Autowired // MemberDAO 타입
private MemberDAO memberDAO; // 핵심로직을 수행할 객체
private LogAdvice2 logAdvice; // 공통로직을 수행할 객체
public MemberServiceImpl() {
logAdvice=new LogAdvice2();
}
@Override
public void insertMember(MemberVO vo) {
logAdvice.printLog2();
memberDAO.insertMember(vo);
}
@Override
public MemberVO selectOneMember(MemberVO vo) {
// TODO Auto-generated method stub
logAdvice.printLog2();
return memberDAO.selectOneMember(vo);
}
@Override
public void updateMember(MemberVO vo) {
// TODO Auto-generated method stub
logAdvice.printLog2();
memberDAO.updateMember(vo);
}
@Override
public void deleteMember(MemberVO vo) {
// TODO Auto-generated method stub
logAdvice.printLog2();
memberDAO.deleteMember(vo);
}
}
>> IoC 에서..
- new 쓰여 있으면 높은 결합도로 좋지 않음
- 반복되는 코드 + 바꿀 수 밖에 없는 코드기에 삭제
>> 바꾼 후
package com.ryo.biz.member.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ryo.biz.member.MemberService;
import com.ryo.biz.member.MemberVO;
@Service("memberService")
public class MemberServiceImpl implements MemberService {
@Autowired // MemberDAO 타입
private MemberDAO memberDAO; // 핵심로직을 수행할 객체
@Override
public void insertMember(MemberVO vo) {
memberDAO.insertMember(vo);
}
@Override
public MemberVO selectOneMember(MemberVO vo) {
return memberDAO.selectOneMember(vo);
}
@Override
public void updateMember(MemberVO vo) {
memberDAO.updateMember(vo);
}
@Override
public void deleteMember(MemberVO vo) {
memberDAO.deleteMember(vo);
}
}
☆ 그럼 LogAdvice를 어디에 작성하는가?
>> 우선 사용하려면 pom.xml에 <dependencies></dependencies> 사이에 작성해야함
+ 저장하고 나서 100%가 되기 전에는 아무것도 하지 말 것
+ Maven Dependencies에 aspectjrt와 aspectjweaver이 잘 들어와 있나 확인할 것
<!-- AOP -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
</dependency>
>> applicationContext에 namespaces를 통해 aop 추가 후 진행
<bean id="logAdvice" class="com.ryo.biz.common.LogAdvice" />
<aop:config>
<aop:pointcut expression="execution(* com.kim.biz..*Impl.*(..))" id="aPointcut"/>
<aop:aspect ref="logAdvice">
<!-- 언제 넣어줄 지 지정, 어떤 포인트에서 넣어줄 지 지정 -->
<aop:before method="printLog" pointcut-ref="aPointcut"/>
</aop:aspect>
</aop:config>
>> 여기서 printLog로 넣어야 할 것을 printlog로 넣어 오류 발생([예외발생노트] 9/15일자 확인)
'디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)' 카테고리의 다른 글
디바이스 융합 자바(Java) day67(1) - 바인드 변수, joinPoint (0) | 2022.09.16 |
---|---|
디바이스 융합 자바(Java) day66(2) - AOP 관련 용어정리 및 예시 (0) | 2022.09.15 |
디바이스 융합 자바(Java) day65(2) - 스프링(@(어노테이션),컴포넌트(@Component),@Repository,@Service) (1) | 2022.09.14 |
디바이스 융합 자바(Java) day65(1) - 스프링(생성자 인젝션(day64(2)참고), Setter 인젝션) (1) | 2022.09.14 |
디바이스 융합 자바(Java) day64(2) - Spring (IoC[제어의 역행], AOP[관점지향 프로그래밍]) (1) | 2022.09.13 |