본문 바로가기
Today I Learned 2024. 6. 13.

(24.06.13)[9주차] Spring 심화 강의 02 (마무리)

Spring 심화 강의와 학습을 진행하면서

Spring AOP, Aspect Oriendted Programming 과 API 에서의 Exception Handling에 대해서

공부하면서, 나의 말로 정리를 하려고 했다.

 

추가적으로 개인 과제를 진행하면서 더 파고들면서 분석해야하는 부분이 있다면 앞으로 차례로 정리를 할 것 


Spring 심화 강의 간단정리

더보기

Spring AOP, Aspect Oriented Programming

  • 관점 지향 프로그래밍
    • 핵심기능/ 부가기능 관점을 기준으로 묶어서 프로그래밍하는 방식
  • 모든 핵심기능에 똑같은 부가기능을 다 붙여서 수정시키기엔 많은 리소스를 낭비할 수 없음
    • ex) Controller 핵심기능을 사용자가 사용하는 시간을 모두 트래킹해서 다 더하려는 부가기능을 만드려면 원래는 모든 Controller 기능마다 다 사용시간 계산하는 로직을 구현해야하는 상황이 생겨버림
  • 따라서 모듈화로 만들어 떼내어 AOP로 만드는 것

핵심기능

  • 각 API 가 수행해야하는 비지니스 로직

부가기능

  • 핵심 기능을 보조하는 기능
    • 회원 패턴 분석을 위한 로그 기록
    • API 수행 시간 저장 등

@Aspect

  • Bean 에만 적용

어드바이스

  • 부가 기능이 핵심기능 대비 언제 전후에 실행될 것인지 : 핵심기능의 반환 값을 사용할 것인지, 핵심 기능 섹션에서 예외가 발생할시 어떻게 할지 등에 대한 것

@Around

  • '핵심기능' 수행 전과 후 (@Before + @After) 실행 시키겠다는 의미

@Before

  • '핵심기능' 호출 전 (ex. Client 의 입력값 Validation 수행)

@After

  • '핵심기능' 수행 성공/실패 여부와 상관없이 언제나 동작 (try, catch 의 finally() 처럼 동작)

@AfterReturning

  • '핵심기능' 호출 성공 시 (함수의 반환값을 ‘부가기능’ 에서 사용)

@AfterThrowing

  • '핵심기능' 호출 실패 시. 즉, 예외 (Exception) 가 발생한 경우에만 동작 하는 기능(ex. 예외가 발생했을 때 개발자에게 email 이나 SMS 보냄)

포인트컷

  • 부가 기능을 핵심 기능의 어느 지점에 적용시킬지에 대한 것
  • 포인트 컷은 특수한 Expression Language가 존재

Expression Language

  • modifiers-pattern
    • 접근 제어자 관련
    • public, private, *(상관없다는 표시)
  • return-type-pattern
    • 메서드가 반환하는 타입과 관련하여
    • void, String, List<String>, *****(상관없다는 표시)
  • declaring-type-pattern
    • 클래스명 (패키지명 필요)과 같이 어떤 특정 지점에서 적용할 것인지에 대한 것
      • com.sparta.myselectshop.controller.* - controller 패키지의 모든 클래스에 적용
      • com.sparta.myselectshop.controller.. - controller 패키지 및 하위 패키지 까지의 모든 클래스에 적용
  • method-name-pattern(param-pattern)
    • 적용 메서드를 이름 또는 규칙에 의해 지정해주는 것
    • 함수명
      • 특정이름 또는 이름패턴을 가지는 메서드 전체에 적용할 수 있음 : * 사용
        • addFolders : addFolders() 함수에만 적용
        • add* : add 로 시작하는 모든 함수에 적용
    • 파라미터 패턴 (param-pattern)
      • 인수와 관련된 메서드 전부데 대하여 정할 수 있음
        • (com.sparta.myselectshop.dto.FolderRequestDto) - FolderRequestDto 인수 (arguments) 만 적용
        • () - 인수 없음
        • (*) - 인수 1개 (타입 상관없음)
        • (..) - 인수 0~N개 (타입 상관없음)
  • ?
    • 생략 가능

 

@Pointcut

  • 많은 부가기능에 대하여 모두 적용하거나 중복한 부가기능에 대하여 처리할 수 있는 Annotation
  • 재사용, 결합을 하면서 효율적으로 사용 가능

Spring AOP 의 동작

  • 핵심 기능 사이에 Proxy = 가짜/대리 객체가 생성되는 것
    • @Transactional 과 유사한 형태
  • joinPoint.proceed() 부분에서 Controller단에서 메서드를 실행시키고, Result 결과 까지 Proxy단까지 잡아채서 가지고 오게 됨

API 예외처리

  • Web Application에서의 Client-Server간에 발생하는 환경에서의 에러를 적절히 대응을 할 수 있도록 하기 위해
  • AOP 처럼 모듈화로 분리 하듯이 API 의 예외를 분리해서 효율적으로 관리할 수 있도록 하기 위해

Spring의 Exception Handling

ResponseEntity 직접사용

  • Spring 에서 제공하는 ResponseEntity 클래스를 사용
  • ResponseEntity
    • 일종의 HTTP response 객체를 위한 Wrapper 엔터티 이기 때문에 여러 HTTP 관련 객체를 포함해서 응답
      • HTTP status code
      • HTTP headers
      • HTTP body

@ExceptionHandler Annotation 사용

  • Global이 아닌 특정 Controller에 추가할 시, 해당 Controller에서 발생하는 지정한 Exception클래스(위IllegalArgumentExcpetion.class 등)에 대하여 Handling하여 ResponseEntity로 Client로 응답가능

 

Golbal Exception Handling

  • 각 Controller 마다, 또는 Exception 종류마다 모두 지정하지 않아도 한번에 Exception을 Handling 할 수 있는 것
  • 중앙관리화를 통해서 예외를 중복, 관리가 간편
    • 협업에서도 협의와 공유가 빨라지게 되는 효율적인 개발이 가능

@ControllerAdvice / @RestControllerAdvcie

  • 모든 예외를 채와서 @ExceptionHandler 로 안에서 처리
  • @Target(ElementType.TYPE) 이 포함되어있기 때문에 메서드단이 아닌 클래스 단에서 발생하는 Exception을 처리

Spring 의 properties 를 이용한 Error 메시지 관리

below.min.my.price=최저 희망가는 최소 {0}원 이상으로 설정해 주세요.
not.found.product=해당 상품이 존재하지 않습니다.
  • key-value Pair 형태로 작성을 하게 되었을 때, Spring 자체에서 messageSource 로 Bean을 자동으로 등록
  • 단, 한국어는 UTF-8 인코딩이기 때문에 IntelliJ에서 작동시키기 위해서는 인코딩 설정을 변경해줘야함

Exception Handler일 경우에는 과제를 하면서 매우 필요했던 기능이였기 때문에

미리 알고 있어 간단하게 짚어가면서 더 자세한 부분을 정리하면서 넘어갔다.

 

하지만, 과제가 TEST코드를 잘 다뤄야하는 부분인 만큼 오늘 배운 내용 외에 연간된 MVC 모델과 Controller테스트에 관하여 더 학습하고, 개인과제를 진행을 해야할 것