SPRING/스프링프레임워크 핵심개념
-
스프링 AOP: @AOPSPRING/스프링프레임워크 핵심개념 2021. 5. 29. 17:12
Spring AOP를 시작하기 위해서는 아래와 같이 의존성을 추가해야 한다. org.spring.framwork.boot spring-boot-starter-aop @Aspect을 통해 Aspect로 정의하고 Component 등록을 한다. @Component @Aspect public class PerfAspect { // 1. com.springaop로 시작하는 패키지의 EventService 클래스의 모든 메서드에 적용 //@Around("execution(* com.springaop..*.EventService.*(..))") // 2. 아래 PerfLogging 어노테이션이 적용된 곳만 적용 @Around("@annotation(PerfLogging)") // 3. 해당 Bean의 모든 메서드에..
-
Spring AOP: 프록시 기반 AOPSPRING/스프링프레임워크 핵심개념 2021. 5. 29. 15:46
스프링 AOP 특징 - 프록시 기반의 AOP 구현체 - 스프링 빈에만 AOP를 적용할 수 있음. - 모든 AOP 기능을 제공하는 것이 목적이 아니라, 스프링 IOC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제에 대한 해결책을 제공하는 것이 목적임. 프록시 패턴 Proxy 패턴은 위와 같이 Interface가 있고, Client는 Interface Type으로 Proxy 객체를 사용한다. Proxy객체는 또한 Real Subject(target) 객체를 참조하고 있다. 아래 코드는 Proxy 패턴의 예제이다. // Client 역할 @Component public class AppRunner implements ApplicationRunner { @Autowired EventService eve..
-
스프링 AOP : 개념SPRING/스프링프레임워크 핵심개념 2021. 5. 29. 01:14
AOP : Aspect-oriented Programming (AOP)은 OOP를 보완하는 수단으로, 흩어진 Aspect를 모듈활 할 수 있는 프로그래밍 기법 흩어진 관심사 (Crosscutting Concerns) 위 그림에서 같은 색깔의 영역들은 여러 클래스에서 공통적으로 사용하는 로직들이다. AOP는 주로 Logging이나 Transaction에 사용이 되는데 Logging할 때 AOP가 필요한 이유는 다음과 같다. 메서드가 실행되는 시간을 재는 로그를 쌓고자 할때, class A,B,C 각각에 시간을 재는 코드를 추가해야 한다. 이러한 경우에는 각각의 클래스에 있는 시간을 재는 로직을 수정해야 하기 때문에 유지보수가 어렵다. 그렇기 때문에 AOP를 이용하여 해결한다. Aspect X, Y, Z 각..
-
SPEL(스프링 Expresssion Language)SPRING/스프링프레임워크 핵심개념 2021. 5. 23. 22:44
스프링 EL - 객체 그래프를 조회하고 조작하는 기능을 제공 - 스프링 3.0 부터 지원 - Unified EL과 비슷하지만, 메소드 호출을 지원하며 문자열 템플릿 기능도 제공 SpEL 구성 ExpressionParser parser = new SpelExpressionParser() StandardEvaluationContext context = new Standard EvaluationContext (bean) Expression expression = parser.parseExpression(“SpEL 표현식”) String value = expression.getValue(context, String.class) 문법 - #("표헌식") - ${"프로퍼티"} - 표현식은 프로퍼티를 가질 ..
-
데이터 바인딩 추상화 : Converter와 FormatterSPRING/스프링프레임워크 핵심개념 2021. 5. 23. 18:03
스프링 3.0 이후부터는 Converter와 Formatter를 이용해서 데이터 바인딩을 할 수 있다. PropertyEditor의 단점 - Thread-safe하지 않음. - String-Object 변환만 가능하다. Converter - S타입을 T타입으로 변환할 수 있는 일반적인 변환기 (여러 Type 변환가능) - Thread-safe하기 때문에 Bean으로 등록하여 사용해도 됨. - ConverterRegistry에 등록하여 사용해야함. 일반적인 Spring에서는 아래와 같이 환결설정 파일(WebConfig)에 Converter를 등록하여 사용한다. 그러나 Spring Boot에서는 Converter를 bean으로 등록하여 사용할 수도 있다. @Configuration public class W..
-
데이터 바인딩 추상화: PropertyEditorSPRING/스프링프레임워크 핵심개념 2021. 5. 19. 20:24
Property의 값을 Target 객체 설정하는 기능을 데이터 바인딩이라고 한다. 사용자 관점에서 보자면 사용자 입력값을 애플리케이션 도메인 모델에 동적으로 변환해 넣어주는 기능 EX:) 입력값은 String인데, 입력값을 int, long, Boolean, Date 등 또는 Event, Book 같은 도메인 타입으로 변환해서 넣음. PropertyEditor - 스프링 3.0 이전까지 DataBinder가 변환 작업 사용하던 인터페이스 - 쓰레드-세이프 하지 않음. (싱글톤 빈으로 등록해서 사용 X) - Object와 String 간의 변환만 가능하기 때문에 사용 범위가 제한적임. - PropertyEditor를 implements하여 직접 Editor를 구현할 수도 있지만, PropertyEdito..
-
Validation추상화SPRING/스프링프레임워크 핵심개념 2021. 5. 19. 15:20
스프링에서 애플리케이션에서 사용하는 객체들을 검증용 Interface를 제공한다. -> 모든 계층 (웹, 데이터, 서비스)에서 사용 가능 하다. -> Validation은 DataBinder에 들어가 바인딩 할 때 같이 사용되기도 한다. Validator Interface를 구현하는 Class는 두 가지 Method를 구현해서 사용한다. 1. supports : parameter로 받은 Instance의 클래스를 검증 2. validate : 실질적인 Validation이 이루어지는 Method import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.spring..
-
Resource 추상화SPRING/스프링프레임워크 핵심개념 2021. 5. 18. 22:11
Resource 추상화 - java.net.URL을 추상화한 것 - 스프링 내부에서 많이 사용 추상화를 한 이유 - 클래스패스 기준으로 리소스 읽어오는 기능 부재 - ServletContext를 기준으로 상대 경로로 읽어오는 기능 부재 - 새로운 핸들러를 등록하여 특별한 URL 접미사를 만들어 사용할 수는 있지만 구현이 복잡하고 편의성 메소드가 부족 Resource 인터페이스를 구현한 구현체들의 목록 UrlResource URL을 기준으로 리소스를 읽어들임 지원하는 프로토콜 http, https, ftp, file, jar ClassPathResource 클래스패스를 기준으로 리소스를 읽어드림. classapth: FileSystemResource 파일시스템을 기준으로 리소스를 읽어드림. ServletC..