ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC01 - 스프링 동작 절차
    Web/Spring 2023. 6. 28. 17:06

     

    - 스프링이 동작하는 절차를 쭉 따라가보자 

    - 기본적인 설정만 해주면 대부분은 미리 다운받아진 api가 처리해준다.

     

    1. Web.xml실행 

    - 스프링이 구동되면 Web.xml파일을 읽기 시작한다. web.xml파일을 순서대로 읽으면서

    리스너 클래스가 실행되며, 다음으로 root-context.xml을 읽기 시작한다.

    - 설명을 읽어보면, 스프링 컨테이너를 만든다고 하는데, 

      스프링 컨테이너란 스프링이 모든 객체를 관리 할 때 사용하는 장소로 객체를 관리하는 메모리 공간이다.

     

    1.2 스프링 컨테이너 

     

    출처: https://gowoonsori.com/spring/architecture/

    - Servlet 컨테이너가 요청을 받고 서블릿 생명주기를 관리한다면, Spring컨테이너는 웹프로그래밍을 하며 사용할 객체들을 미리 생성해두고 관리하는 메모리 공간이다.

     

    - 왜 Spring Container가 존재할까?

     -A 클래스에서 B클래스를 사용하고자 한다면, A클래스 내에서 B를 new를 통해 생성할 것이다.

       이때 두 클래스의 관계를  의존관계라고 한다.

     - 위와 같은 상황에서 B클래스가 수정된다면, A클래스에 영향을 줄 것이고, 이는 유지보수에 문제가 될 수 있다.

     - 따라서 스프링은 이러한 의존관계를 느슨하게 운영하고 싶어하여 DI(의존성주입)이라는 기법을 사용한다.

     - 위 DI기법을 통해 의존관계를 다시 만들어보자면,  A클래스에서 new없이 B를 사용하면된다.

     - 이것이 가능하기 위해서는 B클래스는 메모리 공간 어딘가에 미리 생성되어 있어야하고, A는 그저 이를 불러다가 쓰면된다. 이때 B가 미리 생성되는 공간이 Spring Container이다.! 

     

     

    2. root-context.xml 

     

    - root-context.xml에는 DB연결을 위한 클래스들과 DAO를  bean으로 등록해두었다.

    - root-context.xml을 읽기 시작하면서 스프링 컨테이너에 sqlSessionFactory 클래스, MemberDAO클래스들이 생성된다.

    - 이렇게 생성된 객체들을 추후 어노테이션을 이용해서 컨테이너에서 꺼내 쓸 것이다.

    - bean에 등록된 id로 변수명이 설정된다.

     

     

    3. Dispatcher Servlet과 servlet-context.xml 

       

       Dispatcher Servlet이 스프링 컨테이너에 생성되고, servlet-context.xml을 읽기 시작한다.

       

       annotation-driven : 어노테이션 쓸 수 있게 해주는 설정

       resources : css나 이미지 파일 위치 /resources입력시 webroot(webapp)에 resorces 폴더를 뒤적거리는 설정 

       viewResolver: return된 view에 prefix와 suffix 붙여줌

       context:component-scan : pojo가 있는 패키지 지정 패키지를 스캔하면서 안에 클래스들을 읽으면서 컨트롤러를 찾음, 맵핑 정보 읽음  

       

     *기존 frontController와 다른점은 Mapping을 위한 클래스가 없다는 것이다. -> 1개의 pojo랑만 연결되기 때문에 필요없다.

     *  (@Controller)등 어노테이션이 붙어있으면 전처리되고, 스프링 컨테이너가 관리해준다( 스프링 컨테이너에 만들어준다)

     *  servlet-context 읽는 과정에서 매핑어노테이션을 관리하기 위해 스프링 컨테이너에 핸들러 맵핑도 만들어진다. 

     

    스프링 실행

    위에서 아래로 실행되면서 위에 적어둔 과정을 수행한다.

     

    간단히 정리하면, web.xml -> root.xml (DB,DAO 설정) -> Dispatcher생성-> servlet.xml (뷰리졸버,맵핑,컨트롤러(pojo) 등)

     

     

     

    + 간단 의존성 주입

     

     memberController에서 DAO객체가 필요하다.

     new 를 통해 memberDAO를 만드는 것이아니라, DI를 통해 생성해보자

     

    @Controller
    public class MemberController {
    	@Autowired
    	private MemberDAO dao;
    	
    	@RequestMapping("/memberList.do")
    	public String memberList(Model model) { //HttpServletRequest == model
    		//MemberDAO dao = new MemberDAO(); 쓰지말자
    		List<MemberVO> list =dao.memberList();
    		model.addAttribute("list",list);
    		return "memberList"; 
    	}

    다음과 같이 멤버를 준비하고 @Autowired나 @Inject 어노테이션을 통해 할 수 있다.

     

    MemberDAO에서도 

    sqlSessionFactory를 간단하게 주입받을 수 있다.

     

    @Repository
    public class MemberDAO {
    	
      @Autowired
       private SqlSessionFactory sqlSessionFactory; //[O O O O O ]

    root.xml에 미리 생성된 sqlSessoin을 주입받아서 사용하면된다.

     

     

    +filter설정 (한글필터 - 사용자요청(request)에 대한 인코딩 필터)

     

    web.xml에 사용자 요청에 대한 인코딩 필터를 설정해두면 된다. 

    아래를 추가해서 사용하자

    <!--Encoding filter -->
    <filter>
    		<filter-name>encodingFilter</filter-name>
    		<filter-class>org.springframework.web.filter.CharacterEncodingFilter
    		</filter-class>
    		<init-param>
    			<param-name>encoding</param-name>
    			<param-value>UTF-8</param-value>
    		</init-param>
    		<init-param>
    			<param-name>forceEncoding</param-name>
    			<param-value>true</param-value>
    		</init-param>
    	</filter>
    	<filter-mapping>
    		<filter-name>encodingFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>

     

     

     

    참고자료: 나프2탄 (인프런) - 박매일

     

    https://www.inflearn.com/course/%EB%82%98%ED%94%84-mvc-2

     

    [NarP Series] MVC 프레임워크는 내 손에 [나프2탄] - 인프런 | 강의

    본 과정은 WEB MVC 프레임워크가 무엇이고 WEB MVC 프레임워크가 어떻게 변형이 되면서 Spring WEB MVC 프레임워크로 넘어가는지 TPC(생각하고-표현하고-코딩하고) 기법을 통해 단계적으로 학습하고 이

    www.inflearn.com

     

Designed by Tistory.