본문 바로가기

스프링/스프링 핵심 기술

(12)
스프링 AOP AOP(Aspect-Oriented Programming) OOP를 보완하는 수단으로, 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법이다. 왼쪽 그림의 A, B, C Class에서 같은 색의 띠가 공통되는 로직이라고 생각해보자. 만약 노란색 띠의 로직의 문제가 생긴다면 A, B, C Class 제각각 수정을 해야 한다. 공통되는 로직들을 오른쪽 그림처럼 한 곳에 모아 모듈로 간편하게 만들어 사용하는 것을 AOP라고 한다. 보안, 로깅, 트랜잭션 등에 주로 사용하는 것으로 알고 있다. AOP의 주요 개념 Aspect Advice와 PointCut을 합친 개념이다. Advice 해야 할 일들을 담고 있는 모듈 Target 적용이 되는 대상 PointCut 어드바이스를 어디에 적용을 해야 하는지에 ..
SpEL(Spring Expression Language) SpLE(Spring Expression Language) 스프링 3.0부터 지원 객체 그래프를 조회하고 조작하는 기능을 제공한다. Unified EL과 비슷하지만, 추가적으로 메서드 호출, 문자열 템플릿 기능을 제공한다. SpLE은 모든 스프링 프로젝트 전반에 걸쳐 사용할 EL로 만들었다. 예제 application.properties나 빈으로 등록된 클래스의 값들을 SpLE를 통해 받아올 수 있다. 값을 사용할 수 있는 다양한 방법들이 존재한다. 빨간 박스처럼 properties값들을 받아올 수 있다. 그리고 파란 박스에서는 빈으로 등록된 데이터를 받아온 것을 알 수 있다. #{ }으로 표현식 을 사용할 수 있고, ${ }으로 property를 참고할 수 있다. 참고 #{ ${ } }이런 식으로 표현..
데이터 바인딩 추상화: Editor, Converter, Formatter 데이터 바인딩 추상화 기술적인 관점: 프로퍼티 값을 타깃 객체에 선정하는 기능 사용자 관점: 사용자가 입력한 값을 애플리케이션 도메인 모델에 동적으로 변환해 넣어주는 기능. 입력값은 대부분 문자열이다. 그 값을 int, log, Boolean 등 심지어 Event, Book 같은 도메인 타입으로도 변환해서 넣어주는 기능이다. EventEditor Event 도메인을 생성한다. EventController에서 @PathVariable로 Event를 파라미터로 받아온다. test에서 mock객체를 이용하여 url에 event/1로 요청을 보낸다. editor를 매칭 하지 못한다는 에러가 발생하는 것을 알 수 있다 event/1에서 1을 event로 매핑해야 하지만 이 매핑은 Editor가 필요하다. Edit..
Validation 추상화 Validation 추상화 애플리케이션에서 사용하는 객체 검증용 인터페이스이다. 특징 모든 계층(웹, 서비스, 데이터)에서 사용 가능하다. Data Binder에 들어가 바인딩할 때같이 사용되기도 한다. Validator를 만들어서 사용하기 Event 클래스를 만들고 Getter, Setter를 붙여주었다. EventValidator를 만들어 Validator를 구현한다. supports는 어떤 타입의 객체를 검증할 때 사용할 것인지 결정하는 것이다. Event.class를 검증할 것이므로 Event.class와 파라미터를 비교해준다. validate는 실제 검증 로직을 구현하는 곳이다. ValidationUtils를 이용하여 title field가 비어있으면 에러를 확인하였다. Application R..
ResourceLoader, Resource 추상화 ResourceLoader 리소스를 읽어오는 기능을 제공하는 인터페이스 ApplicationContext는 ResourceLoader를 상속받기 때문에 사용 가능하다. ResourceLoader를 이용하여 Resource를 읽어 올 수 있다. 리소스 존재 유무, 파일 이름 등 다양한 기능이 존재한다. Resource 추상화 java.net.URL을 추상화한 것이며 스프링 내부에서 많이 사용하는 인터페이스 추상화한 이유 클래스 패스 기준으로 리소스를 읽어올 수 없었다. ServletContext를 기준으로 상대 경로로 읽어오는 기능 부재 새로운 핸들러를 등록하여 특별한 URL 접미사를 만들어 사용할 수는 있지만 구현이 복잡하며 편의성 메서드가 부족 주요 Method getInputStream() exits..
7. IoC 컨테이너: ApplicationEventPublisher ApplicationEventPublisher 이벤트 프로그래밍에 필요한 인터페이스 제공. 옵저버 패턴 구현체로 이벤트 기반의 프로그래밍에 유용한 인터페이스이다. ApplicationContext은 EventPublisher를 상속받고 있다.​ 옵저버 패턴 참고 예제 MyEvent 클래스를 만들고 ApplicationEvent를 상속받은 후 data를 하나 추가하고 data가 포함된 생성자를 만든다. 이 이벤트를 빈으로 만들지 않는다. 이 이벤트를 받을 핸들러를 빈으로 하여야 한다. AppRunner에서 ApplicationEventPublisher를 이용해 이벤트를 생성할 수 있다. 생성된 이벤트를 받을 핸들러를 만들어야 한다. 이전에는 ApplicationListener를 상속받아 이벤트를 핸들링해야..
6. IoC 컨테이너: MessageSource MessageSource Message를 다국화할 수 있는 기능을 제공하는 Interface이다. ApplicationContext는 MessageSource 인터페이스를 상속받고 있기 때문에 ApplicationContext으로 사용할 수 있다. 예제 resources폴더 안에 위와 같이 messages.properties를 만든다. ko_KR에는 한국어, en에는 영어로 hello의 값을 입력한다. properties를 만들면 따로 폴더로 묶을 필요 없이 위와 같이 알아서 번들링이 된다. Locale 정보를 통해 hello의 message를 받아오면 Locale에 맞는 값이 출력되는 것을 알 수 있다. 한글이 깨지는 경우 setting의 File Encodings에 들어가 위와 같이 UTF-8로 설정..
5. IoC 컨테이너: Environment(Profile, Property) Environment 프로파일과 프로퍼티를 다루는 인터페이스이다. Profile Bean들의 그룹이다. 특정 환경에서 어떠한 빈들을 등록할 때 사용할 수 있다. 테스트 환경에서는 A그룹의 빈을 사용하고 배포 환경에서는 B 그룹의 빈을 사용하게 할 수 있다. ApplicationContext가 Environment를 상속받아 사용되기 때문에 Environment를 받아올 있다. 현재 아무런 설정을 하지 않았기 때문에 Active 값은 ""이며 Defalut 값은 "default"로 설정된다. Profile 사용해보기 @Profile을 이용하여 특정 Profile에만 원하는 로직을 수행할 수 있다. test Profile에서만 BookRepository를 빈으로 등록한다. test Profile이 아닐 경우..