본문 바로가기

분류 전체보기

(79)
데이터 바인딩 추상화: 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..
퍼사드 패턴(Facade Pattern), 최소 지식 원칙 퍼사드 패턴 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다. 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있다. 어댑터 패턴과의 차이 어댑터 패턴은 인터페이스를 변경해서 클라이언트가 필요로 하는 인터페이스로 변환하는 것 퍼사드 패턴은 어떤 서브시스템에 대한 간단한 인터페이스로 제공하는 것이다. 퍼사드 패턴 다이어그램 수많은 subsystem class 들을 Facade에서 통합된 인터페이스로 제공한다. Clent는 Facade 하나만 알고 있으면 수많은 subsystem class들을 사용할 수 있다. 예제 영화관에서 영화를 상영하는 시스템이 있다고 생각해보자. 영화를 상영하기 위해 필요한 절차는 아래와 같다. (1) 조명을 영화관 모드로 변경 ..
어댑터 패턴(Adapter Pattern) 어댑터 패턴 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스 들을 연결해서 쓸 수 있다. ​ Target 클라이언트는 Target만을 알고 있다. 즉 다른 인터페이스는 이 Target으로 변환되어야 한다. Adapter Adaptee를 Target으로 변환해주는 중간 매개체이다. Adaptee 변환이 될 대상이다. 예제 새로운 번역기가 있고 오래된 번역기가 있는데 클라이언트는 새로운 번역기만 알고 있다. Target public interface NewTranslator { public void koreanTranslation(); public void chineseTranslation(); pu..
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로 설정..
커맨드 패턴(Command Pattern) 커맨드 패턴 요청을 객체의 형태로 캡슐화하여 요청과 해당 요청 수행을 분리하는 디자인 패턴 요구 사항을 객체로 캡슐화할 수 있으며, 매개변수를 써서 여러 가지 다른 요구 사항을 집어넣을 수도 있다. 요청 내역을 큐에 저장하거나 로그로 기록할 수도 있으며 작업 취소 기능도 지원 가능하다. Client ConcreteCommand를 생성하고 Receiver를 설정한다. Receiver 요구 사항을 수행하기 위해 어떤 일을 처리해야 하는지 알고 있는 객체이다. ConcreteCommand에서 Receiver를 가지고 있으며 ConcreteCommand는 명령에 따라 Receiver의 기능을 수행한다. ConcreteCommand 특정 행동과 리시버 사이를 연결해 준다. Invoker에서 excute(), un..