Giter Site home page Giter Site logo

project-winter's Introduction

Project-Winter

SpringMVC의 작동 원리를 학습하며 체득시키기 위한 백엔드 프레임워크

블로그 정리

핵심

image 프론트 컨트롤러 패턴을 적용해 DispatcherServlet 이 모든 요청을 받아 적절한 핸들러를 찾고 View를 반환하도록 구현

리플렉션을 이용해 컴포넌트를 런타임시에 동적으로 생성하여 Bean 객체로 관리하도록 하였고, 적절한 Bean 을 찾아 DI 를 해주는 IoC 역할을 할 수 있게끔 구현.

이 외에 인터셉터, 예외처리 등의 기능을 구현함.

project-winter's People

Contributors

djawnstj avatar

Watchers

 avatar

project-winter's Issues

WebServer 기능 추가

테스트 등 여러가지 이유로 인해 ServerRunner class 의 WebServer 기능 추가

  • 서버 시작을 스레드를 생성해서 실행 하도록 변경
  • 서버 시작 함수 이름 변경
  • 테스트 코드에서 서버를 실행시키는 편의 애노테이션 개발
  • 서버 요청을 정상적으로 받는지 테스트 코드 작성

Controller 기능 구현

요청을 받는 EndPoint 역할과 view 의 이름을 반환하는 객체(Controller)를 위한 interface를 만들고, http 요청이 오면 url에 맞는 Controller를 매핑, 호출시켜주는 기능을 개발

  • Controller interface 생성
  • 컨트롤러가 요청에 따라 처리할 로직이 담긴 메서드 하나하나를 매핑하는 HandlerMethod 클래스 개발
  • HandlerExecutionChain 클래스를 개발해 handler 프로퍼티에 HandlerMethod 매핑
  • 등록된 Controller를 함수 단위로 HandlerExecutionChain 를 찾아주는 AbstractHandlerMapping 개발
  • 애노테이션 기반 컨트롤러 HandlerMappingRequestMappingHandlerMapping 개발
  • 인터페이스 기반 컨트롤러 HandlerMappingBeanNameUrlHandlerMapping 개발
  • HandlerMapping 을 통해 찾은 Controller 의 함수를 호출하는 HandlerAdapter 기능 개발

WebMvcConfigurer 기능 구현

애플리케이션 이용자가 애플리케이션 구성/설정 정보를 등록할 객체인 WebMvcConfigurer 을 개발한다.
Bean 생성 시점에서 설정정보를 로딩해 등록된 정보를 받아온다.

  • WebMvcConfigurer 인터페이스 생성
  • @Configuration 애노테이션 로딩 시 WebMvcConfigurer 구분

View 기능 구현

핸들러 응답으로 넘어온 view name 을 통해 실제 html 을 응답하는 기능 구현

  • WEB-INF 하위의 jsp 파일 응답 확인
  • view 에서 사용할 변수들을 담은 Map 과 view 를 가진 ModelAndView 클래스 개발
  • 핸들러 리턴값 ModelAndView 로 변경
  • 프레임워크에서 사용할 view 엔진 단위인 View 인터페이스 개발
  • 사용하는 view 엔진에 따라 처리하는 로직을 분리하기 위해 ViewResolver 인터페이스 개발
  • 당장 사용할 jsp 를 위한 ViewResolver 인 JspViewResolver 와 View 인 JspView 개발

DispatcherServlet 생성

스프링 MVC 의 핵심인 DispatcherServlet 을 생성해 Front-Controller 패턴 구현

  • Servlet 의존성 주입
  • DispatcherServlet 생성
  • 서버 실행 후 정상 요청 확인

ExceptionResolver 기능 구현

Http 요청에 따른 핸들러 로직에서 예외가 발생했을 때, 그 예외를 처리하는 역할을 하는 ExceptionResolver 기능을 구현.

  • HandlerExceptionResolver 인터페이스 개발
    • resolveException 메서드 선언
  • WebMvcConfigurer 클래스에 configureHandlerExceptionResolvers 메서드 추가
    • List<HandlerExceptionResolver> 타입의 resolvers 를 인자값으로 받아 HandlerExceptionResolver 를 추가할 수 있도록 개발
  • DispathcerServlet 에서 예외를 잡아 HandlerExceptionResolver 구현체에게 위임하기

DI 기능 구현

IoC 의 핵심 기능인 DI 기능을 구현한다.
스프링과 마찬가지로 생성자 주입, 세터 주입, 필드 주입 으로 구현할 계획이다.

  • @Autowired 애노테이션 개발
    • BeanFactory 에서 싱글톤 인스턴스를 생성할 때, 애노테이션 확인 후 주입
    • 생성자가 하나만 있을 경우엔 애노테이션이 없어도 주입

Bean 기능 수정

애노테이션 Bean 관련 기능 일부 수정
Bean 관리를 Bean 이름과 Class 를 가진 객체를 키로 하여 관리.

  • Bean 애노테이션의 name 프로퍼티 추가
  • Bean name 과 Class 를 프로퍼티로 가진 BeanInfo 객체 생성
    • Class로 동일성 비교하도록 오버라이딩
  • BeanFactory 의 beans key 로 BeanInfo 사용하도록 변경

Interceptor 기능 구현

Http 요청이 들어오면 Handler 호출 전, 호출 후, 응답 후 실행할 로직을 정의할 HandlerInterceptor class 개발

  • HandlerInterceptor interface 개발
    • preHandle, postHandle, afterCompletion 메서드를 default 메서드로 개발
  • Interceptor 등록 정보 역할을 하는 InterceptorRegistration 개발
    • HandlerInterceptor 인스턴스 포함
    • 포함 요청경로, 제외 요청경로 변수 포함
    • addPathPatterns 메서드 구현
    • excludePathPatterns 메서드 구현
  • Interceptor 등록 역할을 하는 InterceptorRegistry 개발
    • addInterceptor 메서드 구현
    • getInteceptors 메서드 구현
  • WebMvcConfigurer 기능 추가
    • addInterceptors 메서드 개발
    • getInterceptors 메서드 개발
  • 매핑 정보를 가지는 MappedInterceptor 개발
  • WebMvcConfigurer 로드 시점에 HandlerExecutionChainHandlerInterceptor 매핑 로직 구현
    • preHandle 메서드는 반환값이 true 인 경우 다음으로 넘어가기

WebServer 기능 구현하기

Tomcat 을 이용한 간단한 WebServer 기능 구현

  • Tomcat 의존성 주입하기
  • 톰캣 실행 함수 만들기

Annotation 기반 Bean 기능 구현

애플리케이션 런타임시에 싱글톤으로 유지시킬 Bean 객체를 애노테이션 기반으로 개발할 수 있도록 개발
리플렉션을 이용해 런타임시에 동적으로 애노테이션이 붙은 객체를 생성, 싱글톤 Bean 객체로 관리할 수 있도록 개발

  • Component 애노테이션 개발
  • Bean 애노테이션 개발
  • Controller 애노테이션 개발
  • RequestMapping 애노테이션 개발
  • Configuration애노테이션 개발
  • 리플렉션 의존성 주입
  • Component 애노테이션 정보를 이용해 동적으로 객체를 생성, 각 애노테이션에 맞게 관리하도록 개발
    • Configuration 애노테이션 분류
    • Configuration 의 Bean 애노테이션 객체를 Bean 등록

Tomcat 서버 수정

지금까지 작업한 코드를 main 에서 실행한 결과 bean 들이 정상적으로 load 되지 않는 것을 확인했다.

정확히는 Tomcat 초기화 시점에 BeanFacotry 에서 beans 를 초기화 해주었지만,
이후 HTTP 콜에 호출된 DispatcherServlet 에서 호출할 때 정상적으로 호출되지 않았다.

추가로 webapp 경로 설정을 따로 해주지 않아도 class 파일들과 resource 파일을 설정해 줄 수 있도록 수정하고자 한다.

  • BeanFacotry 문제 수정
  • Tomcat webappPath 수정

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.