Today I Learned
(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
- 일종의 HTTP response 객체를 위한 Wrapper 엔터티 이기 때문에 여러 HTTP 관련 객체를 포함해서 응답
@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테스트에 관하여 더 학습하고, 개인과제를 진행을 해야할 것
'Today I Learned' 카테고리의 다른 글
(24.06.17)[10주차] Validator 객체 생성과 테스트 코드에서의 활용 (0) | 2024.06.17 |
---|---|
(24.06.14)[9주차] Servlet 객체 활용하기 (0) | 2024.06.14 |
(24.06.12)[9주차] Spring 심화 강의 01 (0) | 2024.06.12 |
(24.06.11)[9주차] HashMap + 사용자 정의 Comparator 사용하기 (1) | 2024.06.11 |
(24.06.10)[9주차] 원시타입 Array -> List 변환 (0) | 2024.06.10 |