AOP

Walter Mitty·2023년 2월 1일
0

객체지향 프로그래밍의 목적

  • 재사용성

객체 지향프로그래밍 특징

  • 상속화
    • 중복코드를 부모로 만듦
  • 다형성
  • 캡슐화

가 가능하다. 즉 이 세가지가 되지 않는다면 객체지향 플로그래밍 언어가 될 수 없다.

클래스란
1.객체를 만드는 틀이자
2.하위 클래스들의 공통점을 모아두는 곳이다.

일반적인 클래스라면 이래야 하지만,

  • 추상(abstract)클래스
    • 하위 클래스들의 공통점만 모아둘 수 있다.
  • final 클래스
    • 객체를 만드는 틀만 될 수 있다.
클래스 조건abstract 클래스final 클래스
객체를 만드는 특 역할을 한다.XO
하위 클래스들의 공통점을 모아두는 곳 역할을 한다OX

확장된 것이 interface이다.

  • System.out.println()이 공통적인데, 부모쪽에 이 부분을 몰아넣고, 그걸 상속받아 쓰는게 좋은가?

    이때는 별로 상속관계가 도움은 안된다. 수직적으로 봤을 때 상속이라하면 맞지만, 수평적으로 봤을 때는 system이 중요할까? 로그인, 로그아웃, 장바구니 보기등이 중요할까?
    당연히 후자고 로그인, 로그아웃, 장바구니 보기 등을 핵심로직,
    Sysout은 부가로직이 된다.
    핵심 로직은 중복되는 경우가 거의 없으며 부가로직은 중복되는 경우가 많다.
    따라서 부가로직을 따로 떼놓고 이 부가로직의 핵심로직 전/후/전후에 알아서 필요한대로 끼워넣기를 한다. = Aspect Oriented Programming
    즉, AOP, 관점지향프로그래밍라고 한다.
    따라서 핵심인지 부가인지 판단하는것이 관점지향 프로그래밍의 핵심이다.


    핵심로직에 부가로직을 전/후/전후에 요리조리 갖다 붙이는 작업을 위빙이라고 한다.
    = 부가로직을 필요로하는 핵심로직의 전/후/전후에 엮는 것!

    aspect: 측면, 양식, 관점


  • try 내부 로직: 핵심로직
    • Point Cut : 부가로직이 끼어들어 갈 수 있는 핵심로직을 묶어둔것.
  • catch 내부 로직: 부가로직

자세히보면 catch 내부 로직은 내용이 거의 비슷하다!
그렇다면, 각 컨트롤러에서 하는게 아니라 스프링 내부의 라이프사이클과 관련된 클래스에 옮겨서 사용하면 더 간결한 코드가 되지않을까?

객체지향은 수직적이다 보니, 자식은 부모로부터 상속받는 부모영역까지 가진 큰 덩어리가 될 수 밖에 없는데, 부모 자식관계에서 벗어나서 관점지향적으로 핵심로직/부가로직을 따로 관리하게 되었다.


  • @ControllerAdvice: 핵심로직이 처리되기 전/후/전후 어디에 부가로직을 넣을것인지 결정하는 어노테이션
    • before/after/around 가 있다.
      나는 ProductController가 @RestController라 @RestControllerAdvice를 썼다. 만약 일반 @Controller라면 @ControllerAdvice
    • Exception Handler 핸들링
    • 스프링 컨테이너에게 예외를 throws하고, 스프링 컨테이너는 이 핸들러를 자동 호출을 해준다.

  • 원래코드
  • ProductControllerAdvice 클래스 생성
  • try-catch 지우고, catch 블락은 ProductControllerAdvice에 옮겨준 후 Add throws declaration을 선택해준다.
    • 포스트맨에서 없는 상품 검색시, Sysout으로 설정해둔 ----- ProductControllerAdvice ------ 값이 잘 찍히는 걸 볼 수 있다.
    • 로그인 실패의 경우
      • Product 패키지에 넣어놨는데 왜 이게 가능한건가..?
        • com.my.advice패키지에 ControllerAdvice라는 이름으로 클래스파일을 옮겨주고, component-scan!
  • 로그인 후, 없는 상품번호를 장바구니에 추가
  • ------ ControllerAdvice : AddException ------ 잘나오는거 확인


1.트랜잭션 시작
2.DML 작업

  • 주문 추가(insert) : 트랜잭션 시작/종료 - 포인트 컷
  • 주문 수정(update) : 트랜잭션 시작/종료 - 포인트 컷
  • 주문 삭제(delete) : 트랜잭션 시작/종료 - 포인트 컷

3.트랜잭션 종료(commit/rollback)

-> 각 포인트 컷에 트랜잭션이 시작/종료되는 로직이 있다 = 부가로직

선언적 트랜잭션 처리를 권장

  • @Transactional(rollbackFor = AddException.class)

    • insert 메서드를 호출하다가 AddException이 발생하면 rollback 해!
  • 특정익셉션이 발생햇을 때 rollback 처리를 해줄 수 있다.

    주의!
    Runtime Exception이 발생하면 자동 rollback 이 된다.
    orderInfo이 null이라면 orderInfo.getLines()이 null = 자동 rollback

  • 로그인 후, 장바구니에서 말도안되게 큰 값 넣은 후에

  • 주문하기를 해보면 에러가 뜨고,

    • 이클립스 콘솔
      • rollback 확인
        • 42번이 생길차례였는데 41로 끝!

0개의 댓글