-
Spring MVC01 - 스프링 동작 절차Web/Spring 2023. 6. 28. 17:06
- 스프링이 동작하는 절차를 쭉 따라가보자
- 기본적인 설정만 해주면 대부분은 미리 다운받아진 api가 처리해준다.
1. Web.xml실행
- 스프링이 구동되면 Web.xml파일을 읽기 시작한다. web.xml파일을 순서대로 읽으면서
리스너 클래스가 실행되며, 다음으로 root-context.xml을 읽기 시작한다.
- 설명을 읽어보면, 스프링 컨테이너를 만든다고 하는데,
스프링 컨테이너란 스프링이 모든 객체를 관리 할 때 사용하는 장소로 객체를 관리하는 메모리 공간이다.
1.2 스프링 컨테이너
- 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
'Web > Spring' 카테고리의 다른 글
Spring MVC02 - 어노테이션을 이용한 Mapper 인터페이스 사용 (0) 2023.06.29 Spring MVC02 - Mapper Interface와 XML이용한 CRUD (0) 2023.06.29 Spring MVC01 - DB연결하기 (0) 2023.06.28 Spring (1) - 기존 servlet-jsp와 차이점 (0) 2023.06.28 스프링 - 간단 용어들 정리 (0) 2023.03.05