본문 바로가기

스프링

(28)
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이 아닐 경우..
4. IoC 컨테이너: 빈의 스코프 빈의 스코프 스프링에서는 빈의 스코프를 싱글톤, 프로토 타입 등으로 설정이 가능하며 그에 따라 속해있는 빈들이 상태가 변경될 수 있다. 싱글톤 빈을 등록하면 기본값이 싱글톤이므로 싱글톤으로 등록이 된다. Single, Proto를 우선 @Component를 통해 빈으로 등록하였다. 아무 설정을 하지 않았으므로 Proto는 현제 싱글톤 객체이다. 출력을 확인해보면 Single에서 가져온 Proto와 일반 Proto와 같은 인스턴스인 것을 알 수 있다. 싱글톤 객체를 사용할 때는 프로퍼티가 공유되므로 Multi Thread 환경에서 Thread-safe 하지 않다. 프로토타입 Proto를 @Scope를 통해 prototype으로 지정한다. Bean을 여러 개 출력해보면 싱글톤은 같은 인스턴스가 출력되나 프로..
전역 컨트롤러: @(Rest)ControllerAdvice @(Rest)ControllerAdvice 예외 처리, 바인딩 설정, 모델 객체를 모든 컨트롤러 전반에 걸쳐 적용하고 싶은 경우에 사용한다. 예외를 처리하는 @ExceptionHandler와 함께 사용하면 전반에 걸친 예외처리가 가능하다. 바인딩 또는 검증을 설정할 수 있는 @InitBinder와 함께 사용하면 전반에 걸친 바인딩 설정이 가능하다. 모델 정보를 초기에 초기화할 수 있는 @ModelAttribute와 함께 사용하면 전반에 걸친 모델 정보 설정이 가능하다. 예제 이전 게시글들에서 작성한 @InitBinder, @ModelAttribute, @ExceptionHandler를 @ControllerAdivice로 정의한 BaseController에 작성하였다. 빨간 줄처럼 @ControllerAd..
예외 처리 핸들러: @ExceptionHandler @ExceptionHandler 어떤 요청을 처리하다가 예외들이 발생했을 때 직접 정의한 핸들러를 통해 예외를 처리해서 응답할 수 있다. 예제 RuntimException을 상속받은 EventException을 하나 만들었다. 그리고 예외가 발생했을 때 보여줄 페이지를 만든다. 빨간 박스의 message에 예외 메시지를 담아 보여줄 것이다. 컨트롤러에서 @ExceptionHandler를 사용한 메서드를 하나 작성한다. 메서드 파라미터에 원하는 Exception을 넣으면 예외 처리가 가능하다. EventException을 파라미터로 넣었으므로 EventException 발생 시 eventErrorHandler가 동작하여 message를 담아 줄 것이다. 그리고 위에서 작성한 error.html로 view를..
데이터 바인더: @InitBinder @InitBinder 특정 컨트롤러에서 바인딩 또는 검증 설정을 변경하고 싶을 때 사용한다. 바인딩 설정 event의 id값은 데이터 바인더를 통해 받아오지 않게 하기 이벤트 클래스와 resources/templates/events/ 에 form.html을 이렇게 작성하였다. 모델을 통해 뷰에게 넘겨주고 그것을 Postmapping으로 받아오는 컨트롤러를 작성하였다. 디버그 모드로 웹을 띄우고 event값을 확인하면 모든 값이 제대로 전달된 것을 알 수 있다. 데이터 바인더 적용 @InitBinder를 이용해 데이터 바인더를 적용한 후 id를 setDisallowedFields에 추가한다. 그리고 동일하게 디버그 모드로 웹을 띄워서 데이터를 전송해보면 id값은 걸러진 것을 알 수 있다. 아래와 같이 In..