스프링 AOP (Aspect Oriented Programming)란? AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 그리고 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법이다. 위의 A, B, C 클래스에서 동일한 색깔의 선들의 의미는 클래스들에 나타나는 비슷한(중복되는) 메소드, 필드, 코드들이 나타난다는 것이다. 이러한 경우 만약 클래스 A에 주황색 부분을 수정해야 한다면 B, C 클래스들에 주황색 부분에 해당하는 곳을 찾아가 전부 코드를 수정해야 한다. (유지보수가 쉽지 않다) 이런식으로 반복되는 코드를 흩어진 관심사 (Crosscutting Concerns)라 부른다. 이러한 문제를 AOP는 Aspect를 이용해서 해결한다. 사진..
SpEL은 Spring Expression Language의 줄임말로 스프링의 객체들의 정보를 질의하거나 조작하여 어떤 값을 표현할 수 있는 강력한 표현 언어이다. 객체들의 정보는 레퍼런스로 연관되어 있는 객체 그래프를 탐색하여 얻어지므로 런타임 때 SpEL의 표현식 값이 결정(Resolve)된다. 참고로 객체 그래프는 런타임 때 객체 간의 연관 관계를 통해 그려지는 그래프를 의미하는 말이다. 객체 그래프 예시 @Value 어노테이션 import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.Applicat..
Converter란? 이전 글에서 정리했던 PropertyEditer가 가지고 있던 단점들 때문에 Converter가 생기게 되었다. Property 데이터 바인딩은 String에서 Object로의 데이터 바인딩이었지만, Converter는 A객체에서 B객체로 변환해야 하는 상황에서 사용할 수 있는 일반적인 상황에서 사용할 수 있는 변환기이다. 그리고 Stateless 하기 때문에 Thread Safe하다는 특징도 가지고 있다. import org.springframework.core.convert.converter.Converter; public class EventConverter { public static class StringToEventConverter implements Converter {..
데이터 바인딩 기술적 관점 : 프로퍼티 값을 타겟 객체에 설정하는 기능 사용자 관점 : 사용자 입력한 값을 애플리케이션 도메인 모델에 동적으로 변환해 넣어주는 기능 그러면 할당할 때 왜 바인딩이 필요할까? 사용자가 입력한 값은 대부분 문자열인데, 도메인 객체는 int, double, Date 등 Event, Book 같은 도메인 타입 그 자체로 받아야 할 때가 있기 때문이다. 이러한 기능을 제공해주는 org.springframework.validation.DataBinder라는 인터페이스가 있다. PropertyEditor 스프링 3.0 이전까지 DataBinder가 변환 작업 사용하던 인터페이스 쓰레드-세이프 하지 않음(상태 정보 저장 하고 있음 따라서 싱글톤 빈으로 등록해서 사용하면 아주 위험함) O..
Validator란? 애플리케이션에서 사용하는 객체 검증용 인터페이스이다. 주로 스프링 MVC에서 사용하긴 하지만 웹 계층에서만 사용하라고 만든 웹 계층 전용이 아니라 어떤 계층(웹, 서비스, 데이터)이라도 사용할 수 있는 일반적인 인터페이스이다. 그리고 BeanValidation 전용 여러 어노테이션들을 사용해서 객체의 데이터를 검증할 수 있다. Validator 내부 메소드 public interface Validator { boolean supports(Class clazz); void validate(Object target, Errors errors); } Validator 인터페이스를 implements 하기 위해서는 두개의 메소드를 오버라이딩 해야한다. supports 메소드는 인자로 넘어온..
Resouce 추상화란? 스프링의 Resource 객체는 java.net.URL을 추상화 인터페이스이며, Resource 객체는 스프링 내부에서 가장 많이 사용하는 인터페이스이다. 추상화란 말이 어려운데 java.net.URL이 무엇인지 알아보면서 좀 더 자세히 정리해보자. java.net.URL이란? java.net.URL 클래스는 웹상에 존재하는 자원에 접근할 때 사용한다. 웹상의 존재하는 자원이라 하면 프로토콜, 호스트, 포트번호 등등이다. 그러면 java.net.URL을 추상화한 이유가 무엇일까? 기존의 java.net.URL 클래스의 classpath 기준으로 Resource를 가져오는 기능 부재 ServletContext를 기준으로 상대 경로를 읽어오는 기능 부재 새로운 핸들러를 등록하여 특별..
IoC 컨테이너의 핵심 인터페이스인 ApplicationContext의 상위 인터페이스인 ResourceLoader에 대해서 정리해보자. public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver 여기서 ResourcePatternResolver의 상위 인터페이스가 ResourceLoader이다. public interface ResourcePatternResolver extends ResourceLoader ResourceLoader 인터페이스는 말 ..
이번에 다뤄볼 ApplicationEventPublisher도 ApplicationContext의 상위 인터페이스이다. public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver ApplicationEventPublisher는 이벤트 프로그래밍을 할 때 유용한 인터페이스이다. MyEvent 클래스 import org.springframework.context.ApplicationEvent; public class MyEvent extends Applic..