Supersett
개발자의 하루
Supersett
Blockchain Dev
전체 방문자
오늘
어제
  • 분류 전체보기
    • 프론트
    • 회사생활
    • 블록체인
    • 프로젝트
      • 창업 프로젝트 (DRF + AWS)
      • Spring 프로젝트
    • [중앙대]멋쟁이 사자처럼
    • 기술서적
    • Problem Solving
      • 알고리즘
    • 일기장
      • 하루 정리
      • 삽질 일기
      • 조급할 때 눌러보기

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 멋쟁이 사자처럼 서류
  • 프로젝트
  • 국비지원
  • 국비교육
  • 멋쟁이사자처럼 중앙대
  • Near Scan
  • 면접준비
  • 신입개발자
  • 비트코인
  • java
  • 멋사 중앙대
  • 해커톤
  • 초보개발자
  • 컴퓨터학원
  • DEPROMEET
  • 멋쟁이 사자처럼 면접
  • 자바스크립트
  • Luniverse
  • 니어프로토콜
  • 국비
  • Near Explorer
  • 구글소셜로그인
  • 블록체인 서버설계
  • 취업준비
  • 블록체인정보가공
  • 멋쟁이 사자처럼
  • 자바
  • 글리치해커톤
  • Multichain API
  • 디프만16기

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Supersett

개발자의 하루

220308 [화] Annotation , AOP
일기장/하루 정리

220308 [화] Annotation , AOP

2022. 3. 8. 10:47

 

[To Do List]

1. 리플렉션이란?

- 리플렉션은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API

2. 객체지향

- 객체지향이란? 객체간의 관계를 통해 메세지를 주고받아 프로그램을 작성하는 방법.

- 모듈화

 

3. 금요일 할것 : 이메일 전달프로그램 ->

월요일(14) 테스트프로그램 나갈 예정

화요일(15) -> Spring MVC 들어갈 예정

 

[공부 정리]

**결합도가 높은 프로그램 예시

결합도가 높을수록 유지보수의 효율성이 낮아진다 ㅠㅠ

**결합도가 낮은 프로그램 예시

인터페이스를 통한 의존성 주입으로 결합도가 낮은 프로그램을 만들어준다 (DI)

 


byType 속성값 사용 유의점

- 필드의 자료형이 인터페이스인 경우, 자식클래스의 빈객체가 여러개 등록된 경우, 의존관계 설정시 UnsatisfiedDEpendencyException 예외가 발생한다.

 

Constructor 속성값

- 의존관계를 설정하기 위한 매개변수가 있는 생성자가 반드시 선언되어 있어야 한다.

 

 

[의존관계를 Annotation만으로 구현해보기]

bean Configuration file 만들때 [next] 누르고 beans와 context 체크해주고 밑에 파일 총 두개 추가해준다.

 

@Component : 클래스를 Spring Bean으로 등록하기 위한 어노테이션

-> 기본적으로 클래스명을 beanName으로 자동 설정하며 value 속성을 사용하여 beanName을 변경 가능

-단순하게 빈으로만 등록해줌 ( 기능이 아주 단순함! -> 고로 이걸 안쓰고 밑의 어노테이션을 사용한다)

 

@Autowired : 스프링 빈 객체로 의존관계를 자동 설정하는 어노테이션

-> 빈 엘리먼트의 autowire 속성의 [byType] 속성값과 동일한 방법으로 의존관계 설정

- 필드에 setter 메소드를 선언하지 않아도 Setter Injection 기능을 제공한다.

- 객체를 만들때 리플렉션기능을 이용하고, 접근지정자에 상관이 없다.

(문제점)

필드의 자료형이 인터페이스인 경우 자식클래스의 스프링빈 객체가 여러개 있다면 의존관계 설정시 UnsatisfiedDEpendencyException 예외가 발생한다.

(해결법-1) 

스프링빈으로 등록된 자식클래스 중 하나의 beanName을 필드명과 같은 이름으로 변경한다.

->자식클래스의 스프링빈 객체가 여러개 있는경우 autowire 속성의 [byName]과 같은 방법으로 의존관계를 설정

(해결법-2)

@Qualifier("   ") :의존관계를 설정하기 위한 스프링 빈 객체를 선택하기 위한 어노테이션

-> @Autowireed 어노테이션에 종속된 어노테이션

-> 의존관계가 주입되었다.

- value 속성 : 의존관계를 설정하기 위한 스프링빈 객체의 beanName을 속성값으로 설정

@Repository (권장) : 클래스를 Spring bean으로 등록하기 위한 어노테이션

- @Component와 역할이 비슷하다? X

- 트랜잭션 매니저가 관리 가능하게끔 도와준다. (Commit or Rollback)

 

@Service : Service 클래스를 스프링빈으로 등록하기 위한 어노테이션

- 주로 예외를 발생하는 역할을 한다. -> exceptionHandler 가 받아서 처리!!!

 


AOP

메소드에 중복코드가 존재할경우 , 중복코드 대신 사용될 메소드 선언

-> 중복코들르 최소화하여 유지보수 효율성 증가

 

추상화 -> 어떤 대상을 클래스로 표현하려는것. 

모듈화 

 

객체지향을 만들때는 웬만하면 모듈화 클래스를 사용하는것이 좋다.

 

AOP(관점 지향 프로그래밍) : 로그처리(위버 라이브러리가 따로 필요함), 보안, 트랜잭션관리, 예외사항처리(나머지 세개는 위버가 내장되어있어서 따로 필요하지 않음) (횡단관심) 필요한 시점에 핵심코드를 삽입하여 동작

1.핵심관심 Core Concerns

2.횡단관심 Crosscutting Concerns (예- 로그처리,보안,트랜잭션관리,예외사항처리)

3.프록시클래스

포인트컷(필요한 시점)에 핵심관심모듈+횡단관심모듈 합쳐진다. 

AspectJ의 기능

AOP의 용어

joinpoint : 어떤메소드에 호출할지(어디에)

pointcut : 

advice : 횡단관심클래스 (무엇을)

weaving : 섞는것.(합쳐서)

aspect : (를 만든다)

 

 

흐름

 

★★서비스클래스는 dao 클래스를 필드로 갖는게 핵심이다!!

 

 Advice 클래스 - 횡단관심모듈(Crosscutting Concern Module)이 선언된 클래스

- 횡단관심코드 : 핵심관심코드 전 또는 후에 실행될 보조적인 명령

-> 로그처리, 보안(권한)처리,트랜잭션 처리,예외처리 등의 명령

- 

 

★★핵심인지 횡단인지 구분해서 메소드로 만들어줄줄 알아야 한다.

 

타겟메소드(핵심관심모듈 중에서도 포인트컷으로 지정된 메소드)

 

타겟메소드(핵심관심모듈)의 명령실행 전에 삽입되어 실행될 명령을 작성한 메소드 = 횡단관심모듈

=> JoinPoint : before Advice

 

JoinPoint : 핵심관심모듈을 기준으로 횡단관심모듈이 삽입될 위치를 표현한다.

before advice : 주로 void로 선언한다.

public void beforeLog() {
		logger.info("[before]핵심관심코드 동작 전 삽입되어 실행될 횡단관심코드");
	}

 

[AspectJ 를 통해 AOP를 설정해주자]

**xml의 Namespace를 설정해주자

 

<aop:config>

config : Spring AOP(AspectJ)를 구현하기 위한 상위 엘리먼트

 

<aop:aspect>

aspect : 핵심관심모듈에 횡단관심모듈을 원하는 위치(JoinPoint)에 삽입되어 실행되도록 설정하는 엘리먼트

-> 핵심관심모듈을 PointCut을 사용해서 타겟메소드로 설정

ref속성 : 횡단관심모듈이 선언된 스프링빈 객체의 beanName을 속성값으로 설정한다.

 

<aop:before>

before :  타겟메소드 앞에 횡단관심모듈을 삽입하기 위한 엘리먼트 - joinPoint

method 속성 : 횡단관심모듈 중 삽입되어 실행될 횡단관심모듈의 메소드명을 속성값으로 설정한다.

pointcut 속성 : execution 또는 within 중 하나를 속성값으로 설정.

-> 핵심관심모듈 중 원하는 메소드를 타겟메소드로 지정하기위한 정보를 속성값으로 설정

  execution 속성값 : pointcut 표현식을 이용하여 타겟메소드 지정 -> 확장성이 조금 더 좋다~

  within 속성값 : 클래스(스프링 빈)의 모든 메소드(핵심관심모듈)를 타겟메소드로 지정

=> 클래스 대신 인터페이스 사용 불가능

->pointcut 속성값으로 연산자 사용이 가능합니다 : !(NOT), &&(AND), ||(OR)

pointcut-ref 속성 :  pointcut 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정

->타겟메소드를 지정하는 정보를 제공받아 사용

 

 

[Weaver lib 설정을 pom.xml에서 해주어야한다]

log4j.xml도 바꿔줘야한다

★★★[ execution 속성값을 이용하여 타겟메소드를 지정하는 방법 ]
형식)execution([접근지정자] 반환형 [패키지명.클래스명.]메소드명(자료형,자료형,...)) 
=> 메소드의 머릿부를 표현하여 타겟메소드 지정 - pointcut 관련 패턴문자 사용 가능 
=> 클래스 대신 인터페이스 사용 가능 
=> 반환형 또는 매개변수의 자료형이 클래스인 경우 패키지를 포함하여 표현 
 pointcut 관련 패턴문자 : ..(0개 이상), *(1개 이상), +(0개 또는 1개) 

 

★★★[ within 속성값을 이용하여 타겟메소드를 지정하는 방법 ]

 형식)within(패키지명.클래스명) 
=> Spring Bean으로 등록된 클래스의 모든 메소드를 타겟메소드로 지정 
=> 클래스명은 pointcut 관련 패턴문자 사용 가능 
=> 클래스 대신 인터페이스 사용 불가능 
<aop:before method="beforeLog" pointcut="within(xyz.itwill07.aop.StudentDAOImpl)"/> 

 

<aop:pointcut>

pointcut : 핵심관심모듈을 타겟메소드로 지정하기 위한 엘리먼트

-> pointcut 설정을 재사용하여 유지보수의 효율성 증가

expression 속성 : execution 또는 within 중 하나를 속성값으로 설정한다.

id 속성 : pointcut을 구분하기 위한 식별자를 속성값으로 설정

 

이런식으로 많이 씁니다

<aop:pointcut expression="execution(* xyz.itwill07.aop.StudentDAO.*(..))" id="studentDAOPointcut"/>
<aop:before method="beforeLog" pointcut-ref="studentDAOPointcut"/>

<aop:after>

after : 타겟메소드 뒤에 횡단관심모듈을 삽입하기 위한 엘리먼트

-> 타겟메소드에서 발생되는 예외와 상관없이 횡단관심모듈이 무조건 삽입된다

 

<aop:after-returning>

after Returning : 타겟메소드 뒤에 횡단관심모듈을 삽입하기 위한 엘리먼트

-> 타겟메소드가 정상적으로 실행된 경우만!!! 횡단관심모듈이 무조건 삽입된다, 예외발생시 발생 (x)

 

<aop:after-throwing> 주로 예외처리에 사용된다

after-throwing : 타겟메소드의 명령 실행 후에 삽입되어 실행될 명령을 작성한 메소드

->타겟메소드에서 예외가 발생된 경우 삽입되어 실행


타겟메소드의 명령실행 전후에 삽입되어 실행될 명령을 작성한 메소드

=> joinPoint : Around Advice

public Object aroundLog(ProceedingJoinPoint joinPoint) throws Throwable {
		logger.info("[around]핵심관심코드 동작 전 삽입되어 실행될 횡단관심코드");
		Object object=joinPoint.proceed();//타겟메소드 호출 - 핵심관심코드 실행
		logger.info("[around]핵심관심코드 동작 후 삽입되어 실행될 횡단관심코드");
		return object;
	}

★★★<aop:aroud>★★★ 이걸 제일 많이 씀

around : 타겟메소드(핵심관심모듈) 앞과 뒤에 횡단관심모듈을 삽입하기 위한 엘리먼트

 

 


☆☆☆☆자식객체로 주입하지않고 인터페이스 객체로 주입하여도 , 컨테이너가 자식객체로 연결해줌☆☆☆☆

<bean class="xyz.itwill07.aop.StudentServiceImpl" id="studentService">
		<property name="studentDAO" ref="studentDAO"/>
	</bean>

 

mysql??

 

 

 

 

 

'일기장 > 하루 정리' 카테고리의 다른 글

220310 [목] 검색 동적 Query 완성, Mapper 입력  (0) 2022.03.10
220309 [수] MySql , query 짜기  (0) 2022.03.09
220307 [월] DI , Spring Ioc , 파이널 회의  (0) 2022.03.07
220303 [목] 멋쟁이사자 자소서 , 메이븐  (0) 2022.03.03
220302 [수] 부트스트랩(마이페이지) / 멋쟁이사자 자소서 / 동적 sql  (1) 2022.03.02
    '일기장/하루 정리' 카테고리의 다른 글
    • 220310 [목] 검색 동적 Query 완성, Mapper 입력
    • 220309 [수] MySql , query 짜기
    • 220307 [월] DI , Spring Ioc , 파이널 회의
    • 220303 [목] 멋쟁이사자 자소서 , 메이븐
    Supersett
    Supersett
    하루를 돌아보고 공부한 티를 내기 위해 블로그를 만들었습니다.

    티스토리툴바