Spring day04

유요한·2022년 11월 17일
0

Spring

목록 보기
7/7

root-context, servlet-context, web

web.xml

web.xml은 설정을 위한 설정 파일이다.
WAS가 처음 구동될 때 web.xml을 읽어 웹 애플리케이션 설정을 구성한다.

servlet-context.xml & root-context.xml

  1. servlet-context.xml
    이름에서 보듯이 서블릿 요청과 관련된 객체를 정의해야한다.
    주로 View 관련된, Controller 같은 bean을 설정한다고 한다.
    해당 컨텍스트 내에 있는 빈만 사용이 가능한다.

  2. root-context.xml
    root-context 또는 application-context는 view와 관련되지 않은 객체를 정의하고 공유가 가능하다. 그러니까 결국은 Service, Repository(DAO) 등 비지니스 로직 관련 bean을 설정하면 될것 같다.


Spring - Mybatis

SQL이 짧고 간결한 경우에는 어노테이션을 이용해서 쿼리문을 작성해 준다.
SQL이 복잡하거나 길어지는 경우에는 어노테이션보다 XML을 이용하는 것이 좋다. MyBatis-Spring의 경우 Mapper 인터페이스와 XML을 연동해서 동시에 이용할 수 있다. 인터페이스객체.메소드()를 호출하는 순간 해당하는 인터페이스의 경로를 namespace로 가지고 있는 XML 파일로 찾아가서 메소드명과 동일한 id를 가지고 있는 쿼리문을 수행하여 결과로 돌려준다.

먼저, root-context.xmlbean을 만들어야 한다. 왜 root-context에 선언을 할까? 그것은 spring에서 관리하는 객체들은 root-context에 만들어줘야기 때문이다.

그러면 의문이 생긴다...

이거는 왜 root-context에 적어주는 것일까?

이렇게 사용할 때마다 연결해주는 것을 적어야 한다면 불편하다. 그렇기 때문에 위에 처럼 root-context에 따로 빼놔서 사용할 때 불러오는 것이다.

그런 다음

mybatis는 mapper을 해줘야 하는데 mapper은 src/main/java에 만들어 준다.

이제 src/test/java에서 persistence페키지에 MapperTest 클래스를 만들어서 테스트 해준다.

여기까지만 해준다면 이상한점이 있다. 그것은 여태까지 spring에서 주입해주라고 한다면 spring에게 위치를 알려줘야 하는데 예를들어서 객체에 알아서 주입해줘라고 한다면 root-context에서 scan으로 위치를 알려주고 @Component로 주입해줄 것을 표시해준다. 하지만 여기서는 mapper1이 주입을 받게 해놨는데 spring에게 위치를 알려주고 있지 않다.

그렇기 때문에 spring에게 위치를 알려줄 필요가 있다.

이 scan은 mybatis에서 mapper에서 사용할 때 사용하는 것이고 보통 scan은 다르다.

MyBatis는 내부적으로 JDBC의 PreparedStatement를 이용해서 SQL을 처리한다. 따라서 SQL에 전달되는 파라미터는 JDBC에서와 같이 ?로 치환되어서 처리된다. 복잡한 SQL의 경우 ?로 나오는 값이 제대로 전달되었는지 확인하기가 쉽지 않고 실행한 SQL의 내용을 정확히 확인하기 어렵다. 따라서 log4jdbc-log4j2라이브러리를 사용하여 어떤 값들이 전달되었고, 어떤 퀴리문이 수행되었는지를 확인 할 수 있다.


이것이 아래와 같이 바뀌는 것이 log.info를 했을때 자세히 볼 수 있는
DriverSpy다.


그리고 한 단계를 더해줘야 한다.

src/main/resourceslog4jdbc.log4j2.properties파일을 하나 만들어줘야 한다.

log4jdbc.spylogdelegator.name = net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

스프링 MVC 기본 구조

스프링 프레임워크는 하나의 기능을 위해서만 만들어진 프레임 워크가 아닌 코어라고 할 수 있는 여러 서브 프로젝트들을 결합해서 다양한 상황에 대처할 수 있도록 개발되었다. 그 중 하나가 스프링 MVC 구조이다.

-스프링 MVC-
[Spring MVC] : WEB 관련 영역
[Spring Core] : 일반 JAVA 영역(POJO)
[Spring-MyBatis][MyBatis]
[DB]

스프링 구동 순서, 과정

프로젝트 구동은 web.xml에서 시작한다. web.xml 상단에는 가장 먼저 구동되는 Context Listener가 등록되어 있다.

1) ContextLoaderListenr는 해당 웹 어플리케이션을 구동하게 되면 같이 작동이 시작되므로 해당 프로젝트를 실행하면 가장 먼저 로그를 출력하면서 실행된다.

2) root-context.xml이 처리되면 파일에 있는(설정해 놓은) Bean들이 작동한다.

3) root-context.xml이 처리된 후에는 DispatcherServlet이라는 서블릿과 관련된 설정이 작동한다. MVC구조에서 가장 핵심적인 역할을 하는 클래스이며 내부적으로 앱 관련 처리의 준비 작업을 진행한다. 내부적으로 웹 관련 처리의 준비 작업을 진행하기 위해 사용하는 파일이 있고 servler-context.xml이다.

4) DispatcherServlet에서 XmlWebApplicationContext를 이용해서 servlet-context.xml을 로딩하고 해석한다. 이 과정에서 등록된 객체(Bean)들은 기존에 만들어진 객체(Bean)들과 같이 연동하게 된다.

Front-controller 패턴

  1. 사용자의 Request는 Front-Controller인 DispatcherServlet을 통해 처리한다.

  2. HandlerMapping은 Request의 처리를 담당할 컨트롤러를 찾기 위해 존재한다.

  3. HandlerMapping 인터페이스를 구현한 여러 객체중 @RequestMapping이라는 어노테이션이 적용된 것을 기준으로 판단하며, 적절한 컨트롤러를 찾았다면 HandlerAdapter를 이용해서 해당 컨트롤러를 동작시킨다.

  4. Controller의 처리가 완료되었다면 어디로, 어떻게 갈 것인지 라는 결과가 나오고 그 결과를 ViewResolver가 리턴을 통해 받아서 어떤 View에서 처리하는 것이 좋을지 해석을 해준다.

  5. 해석된 결과를 가지고 실제 응답을 보내야 하는 데이터를 JSP등을 이용해서 생성해준다.

  6. 만들어진 응답(페이지)을 DispatcherServlet을 통해서 응답해준다.

profile
최선을 다하자!!

0개의 댓글