일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Immutable
- Kotlin for Java Developers
- 프록시
- ApplicationContext
- 자바
- DesignPattern
- springboot
- hibernate
- 클린코드
- FunctionalInterfaces
- AutoConfiguration
- java
- 토비의스프링
- 링킹
- String
- beanfactory
- exception
- 컴퓨터시스템
- lambda
- gradle
- 메이븐
- 빌드툴
- ORM
- DispatcherServlet
- Spring
- IOC
- 토비의스프링3.1
- springwebmvc
- 링커
- JPA
- Today
- Total
목록프로그래밍/Spring (23)
엔지니어로 가는 길

PathVariable로 LocalDate 꼴의 문자열을 LocalDate 타입의 객체로 받는 메소드를 만들고 싶었다. 테스트 코드를 작성하였다. 결과는 실패. 메소드 인자 타입이 맞지 않아서 문제가 되었다고 하니 String을 LocalDate 타입으로 변환해주는 게 default로 설정되어있지는 않은가 보다. LocalDate 타입 정도는 등록되어있을 줄 알았기 때문에 살짝 당황했다. 그래서 Formatter를 만들었다. Formatter 만들어 등록하면 String과 Object 간의 변환이 가능해지기 때문이다. Spring boot를 이용할 경우 Formatter를 bean으로만 등록해주면 알아서 등록이 이루어진다. 근데 테스트가 또 깨졌다. 같은 이유로 말이다. Formatter가 제기능을 못했..

@RequestParam 또는 @PathVariable로 들어온 값을 객체로 받으려면 Formatter가 필요하다. String 타입 변수 name을 갖는 Person 클래스가 있다. 컨트롤러에서 위와 같이 name을 String이 아니라 바로 Person 객체로 받고 싶다고 해보자. 테스트를 돌리면 MethodArgumentConversionNotSupportedException가 발생한다. 매우 직관적인 이름이다. 컨트롤러의 인자로 Person 타입을 받겠다고 했는데 실제로 주어진 것은 String 타입이었다. String이 Person으로 conversion되지 않아서 예외가 발생한 것이다. 이렇게 Formatter를 등록(spring boot는 Formatter를 따로 등록할 필요 없이 빈으로만 ..

웹 환경에서 스프링 애플리케이션의 동작 방식 스프링 웹 애플리케이션도 결국 스프링 애플리케이션이므로 빈을 생성하고 관리해줄 IoC 컨테이너가 필요하다. 이때 사용되는 IoC 컨테이너가 바로 WebApplicationContext로, 이름 그대로 웹 환경에서 사용할 때 필요한 기능이 추가된 ApplicationContext이다. 웹 환경에서 스프링 애플리케이션의 동작 방식을 이해하려면, 우선 일반적인 스프링 애플리케이션의 동작 방식을 이해해야 한다. 일반적인 스프링 애플리케이션은 IoC 컨테이너가 빈 설정 메타 정보를 이용해서 빈 객체들을 만들고 DI(의존성 주입)를 수행한 후에 최초로 애플리케이션을 기동할 빈 하나를 제공해줌으로써 (마치 자바 애플리케이션에서 main() 메소드를 호출하듯) 동작한다. 스..

스프링 애플리케이션의 동작 방식 스프링 IoC 컨테이너는 빈(Bean) 설정 메타정보를 이용하여 빈 객체(Object)를 만들고 DI(Dependency Injection) 작업을 수행한다. 하지만 이것만으로는 애플리케이션 동작하지 않는다. 자바 애플리케이션의 main() 메소드처럼 어디에선가 특정 빈 오브젝트의 메소드를 호출함으로써 애플리케이션을 동작시켜야 한다. 즉, 적어도 한 번은 위의 예와 같이 IoC 컨테이너에게 요청하여 빈 객체를 가져와야 하는데, 이때는 반드시 getBean()이라는 메소드를 사용해야 한다. 그러나 그 이후로는 다시 getBean()으로 빈 객체를 가져올 필요가 없다. 빈 객체들끼리 DI로 서로 연결되어 있으므로 의존관계를 타고 필요한 객체가 호출되면서 애플리케이션이 동작하기..

스프링의 가치를 제대로 누리며 사용하려면 스프링을 제대로 공부해야 한다. 스프링이 지향하는 가치와 프로그래밍 모델을 충분히 이해하지 못하고는 제대로 활용할 수 없다. 스프링을 성공적으로 학습했는지를 확인할 수 있는 좋은 방법이 있다. 스프링을 공부하고 적용한 이후에 자신이 좀 더 나은 개발자가 되었는가 확인해보는 것이다. ... 스프링을 공부하고 적용했지만 스프링의 사용법에 조금 익숙해진 것을 빼면 더 나아진 게 없다고 느낀다면 스프링을 잘못 공부한 것일지도 모른다. IoC와 IoC 컨테이너 스프링 애플리케이션에서는 객체 생성과 관계설정, 사용, 제거 등의 작업을 애플리케이션 코드 대신 독립된 컨테이너가 담당한다. 컨테이너가 코드 대신 객체에 대한 제어권을 갖고 있다고 해서 Inversion of Con..
스프링이란 스프링은 자바 엔터프라이즈 애플리케이션 개발에 사용되는 애플리케이션 프레임워크다. 애플리케이션 프레임워크는 애플리케이션 개발을 빠르고 효율적으로 할 수 있도록 애플리케이션의 바탕이 되는 틀과 공통 프로그래밍 모델, 기술 API 등을 제공해준다. 애플리케이션 기본 틀 – 스프링 컨테이너 스프링은 스프링 컨테이너 또는 애플리케이션 컨텍스트라고 불리는 스프링 런타임 엔진을 제공한다. 공통 프로그래밍 모델 – IoC/DI, 서비스 추상화, AOP 프레임워크는 애플리케이션 코드가 어떻게 작성돼야 하는지에 대한 기준도 제시해준다. 이런 틀을 프로그래밍 모델이라고 한다. 스프링은 세 가지 핵심 프로그래밍 모델을 지원한다. 1. IoC/DI IoC/DI는 객체의 생명주기와 의존관계에 대한 프로그래밍 모델이다..

ApplicationContext를 쓰지 말아야 할 특별한 이유가 있지 않는 한 ApplicationContext를 쓰는 게 좋다. (ApplicationContext는 interface이다. ApplicationContext의 구현체로는 GenericApplicationContext 또는 AnnotationConfigApplicationContext를 주로 사용한다.) 이들은 스프링의 컨테이너에 주요한 entry point를 제공한다. 예를 들면 이들을 통해서 설정 파일을 로드하거나 클래스 패스 스캔을 하거나 프로그래밍적으로 빈 정의와 어노테이션이 붙은 클래스를 정의하거나 함수적 빈 정의(spring 5.0부터 지원)를 등록하는 일을 할 수 있다. ApplicationContext가 BeanFactor..
1. WebApplicationContext를 찾아 DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE에 담는다. 2. locale resolving이 필요한 경우 locale resolver를 찾아 다른 elements들이 locale 정보를 이용하여 요청을 처리할 수 있도록 한다. locale resolving이 필요하지 않다면 locale resolver는 필요없다. 3. theme resolving이 필요한 경우 theme resolver를 찾아 뷰와 같은 elements가 어떤 theme을 사용할지 결정할 수 있도록 한다. theme를 사용하지 않는다면 무시할 수 있다. 4. If you specify a multipart file resolver, th..

서블릿 3.0부터 서블릿 컨테이너를 프로그래밍적으로 설정할지 web.xml를 이용하여 설정할지 선택할 수 있다. WebApplicationInitializer는 Spring MVC에서 제공하는 인터페이스로 이 인터페이스를 구현하면 서블릿 컨테이너를 초기화할 수 있다. 아래의 예시를 참고하자. AbstractDispatcherServletInitializer는 WebApplicationInitializer를 구현한 추상 클래스로, 서블릿 매핑과 DispatcherServlet 설정의 위치를 구체화하는 메소드를 제공하기 때문에 이를 이용한다면 DispatcherServlet을 더 쉽게 등록할 수 있다. 자바를 기반으로한 스프링 설정 애플리케이션에서는 아래의 코드를 추천한다. 만약 XML 기반 스프링 설정을 ..

여기서는 DispatcherServlet이 위임하는 특별한 빈들이 어떻게 설정되는지에 대해 알아본다. 먼저 DispatcherServlet은 WebApplicationContext에 가서 도움을 요청할 '특별한 빈'이 등록되어있는지 확인한다. 만약 등록되어 있으면 해당 빈을 특별한 빈으로 설정하고, 등록되어 있지 않으면 DispatcherServlet.properties에서 설정한 디폴트 타입의 빈을 이용한다. DispatcherServlet.properties에 설정된 default 빈들을 보면 아래와 같다. HandlerMapping BeanNameUrlHandlerMapping RequestMappingHandlerMapping RouterFunctionMapping HandlerAdapter Ht..