본문 바로가기
  • 실행력이 모든걸 결정한다
반응형

Spring Series/Spring Framework80

[Spring] AspectJ로 bean이 아닌 오브젝트에 DI 적용하기 도메인 오브젝트에 비즈니스 로직을 대부분 적용하는 DDD(Domain Driven Design, 도메인 주도 설계) 방식을 사용한다면 도메인 오브젝트에도 DI가 필요할 것이다. 그렇다고 도메인 오브젝트를 프로토타입 스코프 bean으로 등록하면 iBatis, JPA 등의 프레임워크에서는 이런 방식의 적용이 불가능하다. 이럴 때는 어떡해야 할까? 1. DependencyInjectionAspect - @Configurable이 붙은 도메인 오브젝트가 생성될 때마다 이 어드바이스가 적용되어 자동으로 DI를 수행해주는 애스펙트다. 정확히 말하자면, 수정자 메소드의 이름을 이용해 필요한 bean을 주입해주는 어드바이스를 갖고 있고, @Configurable이 붙은 클래스의 생성자가 호출돼서 오브젝트가 만들어질 때.. 2022. 10. 13.
[Spring] AOP 포인트컷 표현식 1. 지시자의 종류 - 메소드가 아닌 오브젝트를 선정하는 경우에는 해당 오브젝트 안에 있는 메소드들이 AOP 적용 대상이 된다. 1) execution() - 표현식 언어를 사용해서 포인트컷을 작성하는 방법이다. - 메소드의 모든 특징을 문자열로 나타내어 비교하는 방식이다. - AspectJExpressionPointcut 클래스를 이용하여 클래스와 메소드 이름의 패턴을 한 번에 지정할 수 있다. ※ AspectJ AOP를 사용하면 스프링 bean이 아닌 일반 오브젝트에도 aop 기능을 적용할 수 있다. - OR(|) 조건에 대해서도 지정할 수 있다. execution([접근제한자] 리턴타입 [클래스타입.]메소드명(파라미터타입 | "..", ...) [throws 예외클래스] ※ 접근제한자 : 생략하면 .. 2022. 10. 12.
[Spring] 자바 코드를 이용한 MVC 전략 설정 1. @EnableWebMvc와 WebMvcConfigurer 1) @EnableWebMvc와 WebMvcConfigurer의 관계 - @Configuration 클래스에 @EnableWebMvc를 붙여주는 것만으로 를 xml bean 설정 파일에 넣었을 때와 동일하게 동작한다. 하지만, 기본 설정을 변경하게 된다면 어노테이션 방식이나 xml 방식으로는 설정이 너무 복잡해진다. 그래서 Spring은 자바 코드 방식의 설정을 위한 WebMvcConfigurer를 제공한다. - Spring은 @EnableWebMvc와 같은 @Enable 전용 어노테이션으로 등록되는 인프라 bean에 대한 추가 설정을 위해 컨피규어러(Configurer)라는 설정용 bean을 활용하는 방법을 제공한다. 컨피규어러 bean이 .. 2022. 10. 6.
[Spring] @RequestMapping 심화(2) - Spring 3.1의 RequestMapping 전략 [이전 포스팅] @RequestMapping 심화(1) https://kimcoder.tistory.com/513 [Spring] @RequestMapping 심화(1) @RequestMapping은 들어온 요청을 특정 메소드와 매핑하기 위해 사용되는 메소드다. 이번 포스팅에서는 @RequestMapping을 자세하게 알아보자. 1. DefaultAnnotationHandlerMapping - 디폴트 핸들러 매핑 전략으로.. kimcoder.tistory.com 1. RequestMappingHandlerMapping 1) RequestMappingHandlerMapping 소개 - 요청의 처리 단위로 클래스보다 메소드가 선호되기 시작하면서, Spring 3.1에서 DefaultAnnotationHand.. 2022. 10. 3.
[Spring] AnnotationMethodHandlerAdapter의 확장 AnnotationMethodHandlerAdapter은 다양한 관례와 규칙을 이용해 컨트롤러 메소드를 호출해주는 핸들러 어댑터다. 1. WebBindingInitializer - 아래 포스팅의 [3)-(4) WebBindingInitializer]를 참고하길 바란다. https://kimcoder.tistory.com/521 [Spring] 프로퍼티 바인딩 방식(1) - PropertyEditor 프로퍼티 바인딩은 텍스트 형식의 값을 적절한 타입으로 변환해서 객체의 프로퍼티에 넣어주는 것으로, 대표적으로 XML 설정이나 HTTP 요청 파라미터 처리에 필요하다. 여러 개의 포스팅에 걸쳐 S kimcoder.tistory.com 2. HttpMessageConverter - 아래 포스팅을 참고하길 바란다... 2022. 9. 29.
[Spring] MVC 전용 태그 Spring의 @MVC 기능을 손쉽게 등록할 수 있게 해주는 mvc 스키마의 전용 태그들을 알아보자. mvc 전용 태그를 활용하면 xml 설정이 간결해질 것이다. 참고로, 일반적으로 mvc 스키마는 다음과 같이 bean xml 설정에 추가되어 있다. 만약에 /schema/mvc가 없다면 꼭 추가해주자. 1. - 어노테이션 방식의 컨트롤러를 사용할 때 필요한 각 최신 DispatcherServlet 전략에 해당하는 bean들을 자동으로 등록해준다. - 최신 @MVC 지원 기능을 제공하는 bean도 함께 등록되어 전략 bean의 프로퍼티로 설정된다. - 이 태그를 사용하면 DispatcherServlet의 디폴트 전략은 무시된다. 1) 자동 등록 bean - Spring 3.0 기준으로 에 의해 자동으로 등.. 2022. 9. 29.
[Spring] 메시지 컨버터를 이용하는 Ajax 컨트롤러 1. 메시지 컨버터 소개 - 메시지 컨버터는 HTTP 요청/응답 메시지 본문 자체를 메시지로 다룬다. - 메시지 컨버터는 AnnotationMethodHandlerAdapter를 통해 등록할 수 있다. 여러 개의 메시지 컨버터를 등록해두고 요청 타입이나 오브젝트 타입에 따라 선택되게 하는 것이 일반적이다. 2. 메시지 컨버터의 종류 1) 디폴트로 등록된 메시지 컨버터 (1) ByteArrayHttpMessageConverter - byte[] 타입의 오브젝트를 지원한다. - 미디어 타입은 모든 종류를 다 허용한다. - @RequestBody로 전달받을 때는 모든 종류의 HTTP 요청 메시지 본문을 byte[] 타입으로 가져올 수 있고, @ResponseBody로 응답할 때는 application/octe.. 2022. 9. 28.
[Spring] 프로퍼티 파일에서 BindingResult 메시지 관리하기 1. MessageCodeResolver 1) 기본 동작 - BindingResult에 저장될 에러 메시지의 키 후보를 생성해두고, messages.properties와 같은 프로퍼티 파일에서 해당 키 값을 찾아 그에 대한 메시지를 에러 메시지로 활용한다. - 기본 동작을 살펴보자. 아래 예시에서는 messages.properties에 담긴 field.required 값을 에러 메시지로 활용한다. ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "field.required"); fields.required=field required 2) DefaultMessageCodeResolver - MessageCodeResolver가 기본적으로 사용하는 구현.. 2022. 9. 25.
[Spring] JSR-303 Bean 검증 방식 LocalValidatorFactoryBean - JSR-303의 검증 기능을 사용할 수 있도록 하는 일종의 어댑터다. - JSR-303의 bean 검증 방식을 통해 오브젝트의 필드에 달린 제약조건 어노테이션을 이용해 검증을 진행할 수 있다. 예시 public class User { int id; @NotNull // null 값이 아님을 검증 @Size(min=1, max=50) // 빈 문자열 방지, 최대 크기 제한 String name; @Min(0) // 최소값을 0으로 지정 int age; } - 이 팩토리 빈이 생성하는 bean의 타입은 org.springframework.Validation.Validator다. LocalValidatorFactoryBean을 bean으로 등록해두고 이를 DI.. 2022. 9. 25.