본문 바로가기

분류 전체보기

(79)
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를..
싱글톤 패턴(Singleton Pattern) 싱글톤 패턴 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있게 한 패턴 심플한 싱글톤 패턴 public class Singleton { private static Singleton singletonInstance; private Singleton(){ } public static Singleton getInstance(){ if (singletonInstance == null){ singletonInstance = new Singleton(); } return singletonInstance; } } 가장 심플한 싱글톤 패턴 구현 방법이다. 인스턴스는 오직 static 메서드인 getInstance로만 만들 수 있다. 만약 singletonInstance가 null이면..
추상 팩토리 패턴(Abstract Factory Pattern) 추상 팩토리 패턴 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체들을 구상 클래스를 지정하지 않고도 생성하는 패턴 다이어 그램을 보면 지난번의 팩토리 메서드 패턴과는 조금 다른 것을 알 수 있다. 팩토리 메서드 패턴은 실제 팩토리를 구현하는 인스턴스를 만들 때 상위 클래스를 확장하고 팩토리 메서드를 오버라이드 하여 상속을 통해 인스턴스를 생성하였다. 하지만 추상 팩토리 패턴은 AbstractFactory를 Interface 타입으로 생성하고 그 인터페이스를 실체화하여 객체를 생성하는 것을 알 수 있다. 예제 운영체제에 따른 GuiFactory에 대한 예제이다. AbstractFactory public interface GuiFactory { public Button createButton(); p..
데이터 바인더: @InitBinder @InitBinder 특정 컨트롤러에서 바인딩 또는 검증 설정을 변경하고 싶을 때 사용한다. 바인딩 설정 event의 id값은 데이터 바인더를 통해 받아오지 않게 하기 이벤트 클래스와 resources/templates/events/ 에 form.html을 이렇게 작성하였다. 모델을 통해 뷰에게 넘겨주고 그것을 Postmapping으로 받아오는 컨트롤러를 작성하였다. 디버그 모드로 웹을 띄우고 event값을 확인하면 모든 값이 제대로 전달된 것을 알 수 있다. 데이터 바인더 적용 @InitBinder를 이용해 데이터 바인더를 적용한 후 id를 setDisallowedFields에 추가한다. 그리고 동일하게 디버그 모드로 웹을 띄워서 데이터를 전송해보면 id값은 걸러진 것을 알 수 있다. 아래와 같이 In..
모델 @ModelAttribute @ModelAttribute 사용법 1. @RequestMapping을 사용한 핸들러 메서드의 아규먼트에 사용하기 지난 게시글에서 사용해본 방법이다. 2.@Controller 또는 @ControllerAdvice를 사용한 클래스에서 모델 정보를 초기화할 때 사용한다. 첫 번째 방법 모든 핸들러에서 공통적으로 참고해야 하는 모델 정보가 있을 때 매번 각 핸들러에서 모델 정보를 받지 않고 @ModelAtrrtibute를 이용하면 모든 핸들러에게 제공된다. 테스트 두 번째 방법 만약 모델에 담을 객체가 하나라면 이렇게 하여도 정상적으로 동작한다. 참고 자료