프로그래밍 노트/SPRING

MessageSource란 국제화(i18n)기능을 제공하는 인터페이스이다. public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver { ... } ApplicationContext가 MessageSource를 구현한 것을 볼 수 있다. 즉, ApplicationContext는 MessageSource기능을 사용할 수 있다. ApplicacionContext extends MessageSource getMessage(String code, Object[..
ApplicationContext는 프로파일과 프로퍼티를 다루는 EnvironmentCapable을 구현하여 사용한다. ApplicationContext extends EnvironmentCapable ... getEnvironment() 프로파일은 빈들의 그룹이라고 생각하면 된다. Environment의 역할은 활성화할 프로파일을 확인 및 설정. 만약에 테스트시에만 필요한 빈들이 있다면 프프로파일(테스트)을 정의하여, 사용하면 된다. 프로파일 정의하기 // 이 자바 config는 Test할때 사용할 꺼야. // Test할때는 TestBookRepository가 필요하거든... @Configuration @Profile("test") public class TestConfiguration { @Bean ..
@ModelAttribute로 지정된 모델 오브젝트의 바인딩 작업이 실패로 끝나는 경우는 두 가지가 있다. 타입 변환이 불가한 경우 타입 변환은 성공했지만 검증기(Validator)를 이용한 검사가 통과하지 못했을 때 Validator를 통한 검증 과정의 결과는 BindingResult를 통해 확인할 수 있다. BindingResult는 Errors의 서브인터페이스다. Validator 스프링에서 범용적으로 사용할 수 있는 오브젝트 검증기를 정의할 수 있는 API @Controller로 HTTP요청을 @ModelAttribute 모델에 바인딩 할 때 주로 사용된다. 또한 비즈니스 로직에서 검증 로직을 분리하고 싶을 때도 사용할 수 있다. public interface Validator{ boolean s..
PropertyEditor의 여러가지 장점에도 불구하고, PropertyEditor는 매번 바인딩을 할 때마다 새로운 오브젝트를 만들어야 한다는 약점이 있다. 그래서 스프링 3.0에는 PropertyEditor를 대신할 수 있는 새로운 타입 변환 API가 도입됐다. 바로 Converter 인터페이스다. Converter는 PropertyEditor와 다르게 변환과정에서 메소드가 한 번만 호출된다. ⇒ 변환 작업 중 상태를 인스턴스 변수로 저장하지 않음 (멀티스레드 환경에서 안전) Converter Converter는 소스 타입에서 타깃 타입으로의 단방향 변환만 지원한다. (PropertyEditor는 양방향 지원) 물론 소스 타입과 타깃 타입을 바꿔서 컨버터를 하나 더 만들면 양방향 변환이 가능해 진다...
컨트롤러 메소드에 @ModelAttribute가 지정된 파라미터를 @Controller 메소드에 추가하면 세 가지 작업이 자동으로 진행된다. 파라미터 타입의 오브젝트를 만든다. @ModelAttribute User user 라는 파림터 선언이 있다면 User타입의 오브젝트를 생성한다. 준비된 모델 오브젝트의 프로퍼티에 웹 파라미터를 바인딩해준다. 전환이 불가능한 경우라면, BindingResult 오브젝트 안에 바인딩 오류를 저장해서 컨트롤러로 넘겨주거나 예외를 발생시킨다. 모델의 값을 검증한다. 타입에 대한 검증은 끝났지만, 그 외의 검증할 내용이 있다면 적절한 검증기를 등록해서 모델의 내용을 검증할 수 있다. ⇒ 스프링에서는 컨트롤러로직과 검증 로직을 분리할 수 있다. 데이터 검증은 대개 폼의 값이 ..
Controller 파라미터에 붙는 자주사용되는 위 두개의 어노테이션을 정리해보자 @ModelAttribute @ModelAttribute와 @RequestParam의 다른 점은 RequestParam은 파라미터를 1:1로 받는 반면, ModelAttribute는 도메인 모델이나 DTO 같은 모델을 받는 타입이다. @RestController public class SampleController{ @GetMapping("/sample") public String hello(@ModelAttribute Post post){ return "hello"; } } ModelAttribute는 메서드에 작성할 수도 있고 파라미터에 작성할 수 있다. 두 가지 동작 방식이 조금 다르다. 메소드의 매개변수로 선언 파라..
스프링이 개발자에게 제공하는 가장 중요한 가치는 객체지향과 테스트이다. 웹을 통한 DAO 테스트의 문제점DAO뿐만 아니라 서비스 클래스, 컨트롤러, JSP 뷰 등 모든 레이어의 기능을 만들고 나서야 테스트가 가능하다는 점이 가장 큰 문제였다.사실 테스트하고 싶었떤 건 UserDao 였는데 다른 계층의 코드와 컴포넌트, 심지어 서버의 설정 상태까지 모두 테스트에 영향을 줄 수 있기 때문에 이러한 방식으로 테스트하는 것은 번거롭고, 오류가 있을 때 빠르고 정확하게 대응하기가 힘들다는 문제가 있다. 테스트하고자 하는 대상이 명확하다면 그 대상에만 집중해서 테스트하는 것이 바람직하다.(단위 테스트)=> 안하게되면 이유를 찾기위해서 디버거를 돌려가며 스텝별로 확인해야하는 수고를 하게될지도 모른다. 테스트를 위한 ..
팩토리빈과 팩토리 메소드 팩토리메소드를 통한 인스턴스 생성은 XML에서 어떻게 표현할 수 있을까? (spring xml factory) 생성자 대신 오브젝트를 생성해주는 코드의 도움을 받아서 빈 오브젝트를 생성하는 것을 팩토리 빈이라고 부른다. 빈 팩토리와 비슷하지만 전혀 다르니 혼돈 ㄴㄴ 팩토리 빈 자신은 빈 오브젝트로 사용되지 않는다. 대신 빈 오브젝트를 만들어주는 기능만 제공해줄 뿐이다. 팩토리 기능을 가진 빈을 통째로 사용하는 방법도 있지만, 특정 빈이나 클래스의 팩토리 메소드를 사용해서 빈을 등록하는 방법도 있다. 1. FactoryBean 인터페이스 new 키워드나 리플렉션 API를 이용해 생성자를 호출하는 방식으로는 만들 수 없는 JDK 다이내믹 프록시를 빈으로 등록하기 위해 FactoryB..
초기화 메소드(initialization method) 초기화 메소드(initialization method)는 빈 오브젝트가 생성되고 DI 작업까지 마친 다음에 실행되는 메소드를 말한다. 오브젝트의 기본적인 초기화 작업은 생성자에서 진행하면 된다. 하지만 DI를 통해 모든 프로퍼티가 주입된 후에야 가능한 작업도 있다. 이런 경우 사용할 수 있는것이 초기화 메소드다. 초기화 메소드를 지정하는 방법은 네 가지가 있다. 1. 초기화 콜백 인터페이스InitializingBean 인터페이스를 구현해서 빈을 작성하는 방법이다. InitializingBean의 afterPropertiesSet() 메소드는 이름 그대로 프로퍼티 설정까지 마친 뒤에 호출된다.하지만 권장되지 않는다. 빈 코드에 스프링 인터페이스를 노출..
스프링 컨테이너는 초기화 과정에서 몇 가지 빈을 기본적으로 등록해준다. ApplicationContext, BeanFactory스프링에서는 컨테이너 자신을 빈으로 등록해두고 필요하면 일반 빈에서 DI 받아서 사용할 수 있다.스프링 컨테이너인 애플리케이션 컨텍스트는 ApplicationContext 인터페이스를 구현한 것이기 때문에 일반 빈에서 사용하고 싶다면 ApplicationContext 타입의 빈을 DI받도록 해주면 된다. (또한 ApplicationContext는 BeanFactory 인터페이스의 구현체)123456@AutowiredApplicationContext context; public void do(){ this.context.getBean(...); // 애플리케이션 컨텍스트를 직접 사..
깡냉쓰
'프로그래밍 노트/SPRING' 카테고리의 글 목록 (3 Page)