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

Spring Series97

[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.
[Spring] 자주 사용되는 WebDataBinder 설정 항목 이전 포스팅에서는 WebDataBinder에 커스텀 프로퍼티 에디터와 컨버전 서비스를 등록하는 방법을 소개했다. https://kimcoder.tistory.com/521 [Spring] 프로퍼티 바인딩 방식(1) - PropertyEditor 프로퍼티 바인딩은 텍스트 형식의 값을 적절한 타입으로 변환해서 객체의 프로퍼티에 넣어주는 것으로, 대표적으로 XML 설정이나 HTTP 요청 파라미터 처리에 필요하다. 여러 개의 포스팅에 걸쳐 S kimcoder.tistory.com 이번에는 WebDataBinder에 지정할 수 있는 더 많은 유용한 바인딩 옵션들을 살펴볼 것이다. WebDataBinder은 DataBinder 클래스를 상속받기 때문에, 아래 두 문서를 같이 보면서 이해하면 좋을 것 같다. WebD.. 2022. 9. 22.
[Spring] 프로퍼티 바인딩 방식(2) - Converter와 Formatter 1. Converter 1) Converter 소개 - Spring 3.0에서 PropertyEditor를 대신하기 위해 도입된 타입 변환 API다. 매번 바인딩을 할 때마다 새로운 오브젝트가 생성되는 것이 싫거나, prototype 스코프를 가지는 bean을 사용하기 불편한 경우에 적합하다. - Converter를 사용하면 바인딩 과정에서 메소드가 한 번만 호출되며, 상태를 인스턴스 변수로 저장하지 않는다. 따라서, 멀티스레드 환경에서도 singleton 스코프를 가지는 일반적인 bean을 사용할 수 있다. - PropertyEditor와 다르게 한 쪽 타입이 String으로 고정되어 있지 않고, 양 쪽 타입 둘 다 임의로 지정할 수 있다. 단, 소스 타입에서 타깃 타입으로의 단방향 변환만 지원한다. .. 2022. 9. 21.
[Spring] 프로퍼티 바인딩 방식(1) - PropertyEditor 프로퍼티 바인딩은 텍스트 형식의 값을 적절한 타입으로 변환해서 객체의 프로퍼티에 넣어주는 것으로, 대표적으로 XML 설정이나 HTTP 요청 파라미터 처리에 필요하다. 여러 개의 포스팅에 걸쳐 Spring에서 프로퍼티 바인딩을 위해 사용할 수 있는 API들을 살펴볼 것이다. 먼저, PropertyEditor을 살펴보자. PropertyEditor - Spring이 기본적으로 사용하는 바인딩용 타인 변환 API로, 자바빈 표준에 정의된 인터페이스다. - XML의 에서 정의된 프로퍼티 값을 실제 프로퍼티에 저장할 때 활용된다. 1) 기본 프로퍼티 에디터 - Spring이 기본적으로 제공하는 프로퍼티 에디터들은 아래 문서에서 확인하자. https://docs.spring.io/spring-framework/do.. 2022. 9. 17.
[Spring] @SessionAttributes와 SessionStatus 세션은 로그인 정보와 같이 애플리케이션 내에서 유지되어야 하는 정보를 저장하는 데 쓰인다. 1. 세션 도입의 필요성 수정 폼에서는 일부 정보만 수정할 수 있도록 일부 정보만 보여지기 때문에, 수정 데이터를 서버로 전송했을 때 역시 일부 정보만 전송될 것이다. 그렇게 되면, 수정한 내용이 들어있는 오브젝트를 서비스 계층이나 DAO에 전달하는 경우에 일부 프로퍼티 값은 null이거나 0인 상태로 전달될 것이고, 이러한 문제를 해결하기 위해 도메인 오브젝트 중심 방법이 아닌 계층 간의 결합도가 높은 데이터 중심 방식을 선택하게 되기 쉬워진다. 물론 다음과 같은 방법들을 생각해볼 수는 있겠지만 각각 작지 않은 단점이 존재한다. 태그로 정보를 유지하는 방법 : 보안에 매우 취약함 DB를 재조회해서 수정된 부분만 .. 2022. 9. 14.
[Spring] @Controller의 리턴 방식 저번 포스팅에서 다뤘던 @Controller의 메소드 파라미터의 종류에 이어서 이번 포스팅에서는 @Controller의 리턴 타입의 종류도 알아보자. https://kimcoder.tistory.com/515 [Spring] @Controller의 메소드 파라미터의 종류 이번 포스팅에서는 Spring의 AnnotationMethodHandlerAdapter가 호출하는 컨트롤러 메소드의 파라미터의 종류를 알아보자. 1. HttpServletRequest, HttpServletResponse - 컨트롤러와 DispatcherServlet 사이에서.. kimcoder.tistory.com 컨트롤러가 최종적으로 DispatcherServlet에 반환해야 하는 정보는 모델과 뷰다. 만약, 반환할 뷰 정보가 지정되.. 2022. 9. 13.
[Spring] @Controller의 메소드 파라미터의 종류 이번 포스팅에서는 Spring의 AnnotationMethodHandlerAdapter가 호출하는 컨트롤러 메소드의 파라미터의 종류를 알아보자. 1. HttpServletRequest, HttpServletResponse - 컨트롤러와 DispatcherServlet 사이에서 핸들러 어댑터가 전달하는 인터페이스다. - HttpServletRequest는 클라이언트 요청, 쿠키, 세션 등이 해당하는 HTTP 요청 정보를 제공하는 인터페이스다. - HttpServletResponse는 content-type, 응답 코드, 응답 메시지 등이 해당하는 HTTP 응답 정보를 제공하는 인터페이스다. 2. HttpSession - HttpServletRequest를 통해 가져올 수도 있다. - 서버에 따라서 멀티스레.. 2022. 9. 11.
[Spring] @RequestMapping 심화(1) - DefaultAnnotationHandlerMapping @RequestMapping은 들어온 요청을 특정 메소드와 매핑하기 위해 사용되는 메소드다. 이번 포스팅에서는 @RequestMapping을 자세하게 알아보자. 1. DefaultAnnotationHandlerMapping - 디폴트 핸들러 매핑 전략으로, @RequestMapping 어노테이션을 활용한다는 특징이 있다. - 다른 핸들러 매핑 빈을 등록했다면 디폴트 핸들러 매핑이 전략이 적용되지 않기 때문에 DefaultAnnotationHandlerMapping을 직접 bean으로 등록해줘야 한다. 2. @RequestMapping 속성 - 모든 @RequestMapping 속성은 생략이 가능하다. - 속성이 배열타입이기 때문에 {}를 사용해서 여러 개의 값을 넣을 수 있다. - 모든 속성의 조건이 맞.. 2022. 9. 8.
[Spring] web.xml 대신에 WebApplicationInitializer 사용하기 1. WebApplicationInitializer 소개 - Spring 3.1의 새로운 기능으로, 서블릿 3.0 환경 이상에서 사용 가능하다. - web.xml에서 다루는 주요 설정 방식을 모듈화 해서 관리할 때 사용된다. web.xml 내에서 나 을 이용해 등록했던 루트 컨텍스트나 서블릿 컨텍스트를 자바 코드에서 직접 등록하고 생성할 수 있다. - ServletContainerInitializer은 WebApplicationInitializer의 구현체를 찾아 컨텍스트의 초기화 작업을 위임한다. Spring의 웹 모듈 내에는 ServletContainerInitializer의 구현체가 포함되어 있다. public interface WebApplicationInitializer { void onStar.. 2022. 9. 7.