열심히 끝까지

디바이스 융합 자바(Java) day66(1) - 9/14과제 설명, AOP(Advice) 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(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일자 확인)