SpringMVC의 작동 원리를 학습하며 체득시키기 위한 백엔드 프레임워크
프론트 컨트롤러 패턴을 적용해
DispatcherServlet
이 모든 요청을 받아 적절한 핸들러를 찾고 View를 반환하도록 구현
리플렉션을 이용해 컴포넌트를 런타임시에 동적으로 생성하여 Bean 객체로 관리하도록 하였고, 적절한 Bean 을 찾아 DI 를 해주는 IoC 역할을 할 수 있게끔 구현.
Spring Framework의 기능을 따라 개발하며 Spring 에 대해 학습
테스트 등 여러가지 이유로 인해 ServerRunner class 의 WebServer 기능 추가
요청을 받는 EndPoint 역할과 view 의 이름을 반환하는 객체(Controller)를 위한 interface를 만들고, http 요청이 오면 url에 맞는 Controller를 매핑, 호출시켜주는 기능을 개발
Controller
interface 생성HandlerMethod
클래스 개발HandlerExecutionChain
클래스를 개발해 handler
프로퍼티에 HandlerMethod
매핑Controller
를 함수 단위로 HandlerExecutionChain
를 찾아주는 AbstractHandlerMapping
개발HandlerMapping
인 RequestMappingHandlerMapping
개발HandlerMapping
인 BeanNameUrlHandlerMapping
개발HandlerMapping
을 통해 찾은 Controller
의 함수를 호출하는 HandlerAdapter
기능 개발애플리케이션 이용자가 애플리케이션 구성/설정 정보를 등록할 객체인 WebMvcConfigurer
을 개발한다.
Bean
생성 시점에서 설정정보를 로딩해 등록된 정보를 받아온다.
WebMvcConfigurer
인터페이스 생성@Configuration
애노테이션 로딩 시 WebMvcConfigurer
구분핸들러 응답으로 넘어온 view name 을 통해 실제 html 을 응답하는 기능 구현
스프링 MVC 의 핵심인 DispatcherServlet 을 생성해 Front-Controller 패턴 구현
Http 요청에 따른 핸들러 로직에서 예외가 발생했을 때, 그 예외를 처리하는 역할을 하는 ExceptionResolver 기능을 구현.
HandlerExceptionResolver
인터페이스 개발
resolveException
메서드 선언WebMvcConfigurer
클래스에 configureHandlerExceptionResolvers
메서드 추가
List<HandlerExceptionResolver>
타입의 resolvers
를 인자값으로 받아 HandlerExceptionResolver
를 추가할 수 있도록 개발DispathcerServlet
에서 예외를 잡아 HandlerExceptionResolver
구현체에게 위임하기IoC 의 핵심 기능인 DI 기능을 구현한다.
스프링과 마찬가지로 생성자 주입, 세터 주입, 필드 주입 으로 구현할 계획이다.
@Autowired
애노테이션 개발
BeanFactory
에서 싱글톤 인스턴스를 생성할 때, 애노테이션 확인 후 주입애노테이션 Bean 관련 기능 일부 수정
Bean 관리를 Bean 이름과 Class 를 가진 객체를 키로 하여 관리.
Http 요청이 들어오면 Handler
호출 전, 호출 후, 응답 후 실행할 로직을 정의할 HandlerInterceptor
class 개발
HandlerInterceptor
interface 개발
preHandle
, postHandle
, afterCompletion
메서드를 default 메서드로 개발Interceptor
등록 정보 역할을 하는 InterceptorRegistration
개발
HandlerInterceptor
인스턴스 포함addPathPatterns
메서드 구현excludePathPatterns
메서드 구현Interceptor
등록 역할을 하는 InterceptorRegistry
개발
addInterceptor
메서드 구현getInteceptors
메서드 구현WebMvcConfigurer
기능 추가
addInterceptors
메서드 개발getInterceptors
메서드 개발MappedInterceptor
개발WebMvcConfigurer
로드 시점에 HandlerExecutionChain
에 HandlerInterceptor
매핑 로직 구현
preHandle
메서드는 반환값이 true 인 경우 다음으로 넘어가기Tomcat 을 이용한 간단한 WebServer 기능 구현
애플리케이션 런타임시에 싱글톤으로 유지시킬 Bean 객체를 애노테이션 기반으로 개발할 수 있도록 개발
리플렉션을 이용해 런타임시에 동적으로 애노테이션이 붙은 객체를 생성, 싱글톤 Bean 객체로 관리할 수 있도록 개발
지금까지 작업한 코드를 main 에서 실행한 결과 bean 들이 정상적으로 load 되지 않는 것을 확인했다.
정확히는 Tomcat
초기화 시점에 BeanFacotry
에서 beans 를 초기화 해주었지만,
이후 HTTP 콜에 호출된 DispatcherServlet
에서 호출할 때 정상적으로 호출되지 않았다.
추가로 webapp 경로 설정을 따로 해주지 않아도 class 파일들과 resource 파일을 설정해 줄 수 있도록 수정하고자 한다.
BeanFacotry
문제 수정A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.