티스토리 뷰

반응형

Spring

context 설정

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

- web.xml 의 <error-page> 와 비슷하게 예외를 처리할 뷰를 지정할 수 있게 해준다.

<context:component-scan base-package="test.mate.*, kr.co.care.*">

<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>

<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>

</context:component-scan>

<aop:aspectj-autoproxy proxy-target-class="true"/>

- aop 이용하여 @AspectJ 어노테이션를 사용 ex) 로깅처리에 사용

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">

- @RequestMapping 어노테이션을 이용해 url과 controller를 매핑

<mvc:annotation-driven />

- 기본적으로 MVC에서 설정해야하는 값들을 자동적으로 추가 해줌

- MVC에서 사용되는 Annotation 사용을 설정 방식을 사용하겠다는 의미

- MVC 컴포넌트들을 디폴트 설정을 통해 활성화한다.

- 만약 위를 사용하지 않으면 HandlerMapping, HandlerAdapter를 Bean에 추가적으로 세팅이 필요하다

- 자동으로 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter이 구성됨

<context:component-scan>

- 특정 패키지 내의 클래스를 스캔하고 Annotation(@Component @Controller @Service @Repository)을 확인한 후 Bean 인스턴스로 생성

- 이를 이용하면 @Autowired와 @Qualifier Annotation을 인식

- Service 혹은 DAO에서 사용

<mvc:default-servlet-handler />

- DispatcherSerlvet이 처리하지 못한 요청을 DefaultSerlvet에게 넘겨주는 역할을 하는 핸들러

- *.css와 같은 컨트롤러에 매핑되어 있지 않은 URL 요청은 최종적으로 Default Servlet에 전달되어 처리하는 역할

- DispatcherServlet의 매핑이 "/"로 지정하면 JSP를 제외한 모든 요청이 DispatcherServlet으로 가기 때문에,

WAS가 제공하는 Default Servlet이 *.html, *.css같은 요청을 처리할 수 없게 됨.

Default ServletHandler는 이런 요청들을 Default Servlet에게 전달해주는 Handler이다.

<mvc:resources mapping= "/resources/**" location= "/resources/" />

- 정적 자원 매핑

- servlet-context.xml 에 위와 같은 설정을 해줌으로써 /resources/** 로 들어오는 모든 요청은

- location에 대한 요청이 들어오면 WAS의 DefaultServlet에 위임하는 설정

- 정적파일은 패스 자체로 MVC영향에 따라 접근이 불가능하지만 해당 세팅으로 WAS에 위임 DefaultServlet에 위임하여 접근가능하도록 함

${webapp}/resources/ 로 모두 매핑시켜버리겠다는 설정이다.

이로써 정적리소스는 문제 없이 사용이 가능하게 된다.

이 방법 말고도 아예 defaultServlet 자체를 선언하여 /resources/* 라는 url을 defaultServlet 이 처리하도록 명시할 수도 있다.

<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"/>

- Java Object를 JSON으로 변환하거나 JSON을 Java Object로 변환하는데 사용할 수 있는 Java 라이브러리

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" p:order="0"/>

- Controller와 url을 매핑시켜주는 HandlerMapping의 구현클래스

- @RequestMapping 어노테이션 매핑 하도록 함

- @Controller 애노테이션이 적용된 객체의 @RequestMapping값을 이용해서 웹 브라우저의 요청을 처리할 컨트롤러 빈을 찾음

- <mvc:annotation-driven /> 사용안하면 위를 세팅해야함

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">

- 컨트롤러의 메소드를 알맞게 실행하고, 그 결과를 ModelAndView 객체로 변환해서 DispatcherServlet에 리턴

- <mvc:annotation-driven /> 사용안하면 위를 세팅해야함

<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />

- Controller에서 함수가 @ResponseBody를 사용하여 byte[]를 리턴하면 Content-Type을 application/octet-stream으로 설정하여 Response에 byte[]를 보냄

- 파일 다운로드 File 객체 사용할때 사용

- 지원하는 오브젝트 타입은 byte[]이고, 미디어타입은 모든 것을 다 지원한다.

즉 파라미터에 @RequestBody byte[] param과 같이 작성하면 모든 요청을 다 byte배열로 받을 수 있다는 말이다.

그리고 리턴타입을 byte[]로 했을 경우 Content-Type이 applcation/octet-stream으로 설정되어 전달된다.

<bean class="org.springframework.http.converter.StringHttpMessageConverter" >

- 지원하는 오브젝트 타입은 String이고, 미디어타입은 모든 것을 다 지원한다.

파라미터에 사용할 경우 HTTP 본문을 그대로 String으로 가져올 수 있게되고,

리턴에 사용할 경우 단순 문자열을 그대로 전달해줄 수 있다.

Content-Type은 text/plain으로 전달된다.

<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">

- ObjectMapper 에 의해서 Javs 객체를 JSON 객체로 바꾸어 줍니다. 이 때 ObjectMapper 에는 SimpleModule을 등록해주어

어떤 식으로 JAVA객체를 JSON객체로 serialize 할지 또는 JSON객체를 JAVA 객체로 deserialize 할지를 등록 해 줄 수 있습니다.

<property name="cacheSeconds" value="0" />

- 캐쉬 방지 세팅

- AbstractController 상속 해당

<property name="synchronizeOnSession" value="true" />

- Http Session 을 동기화할 필요가 있을때 사용한다.

- 사용자가 같은 버튼을 여러번 클릭하는 경우와 같이, 여러 thread가 동시에 Session에 접근할 수도 있기 때문에

반드시 AnnotationMethodHandlerAdapter의 synchronizeOnSession 속성을 true로 설정

- AbstractController 상속 해당

<property name="customArgumentResolvers">

- 커스텀 ArgumentResolver 등록방법

- Method의 Argument를 자동으로 정의할 수 있도록 만들어 줄수있도록 하는 세팅

- 스프링 사용시 컨트롤러에 들어오는 파라미터나 리턴타입을 나한테 맞게 가공해서 사용하고 싶을 때 사용

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">

- View 를 찾기위해 요청 URL의 확장자와 AcceptHeader를 사용하는 ViewResolver

- 자체적으로 View 를 찾지는 않으며 viewResolvers 에 설정된 ViewResolver <property name="viewResolvers">를 사용하여 View 를 찾음

- 하나의 URI를 통해 다양한 contentType 으로 응답을 할 수 있도록 도와줌

- 하나의 RequestMapping 으로 JSP, JSON, JSONP 처리하기

- http://127.0.0.1:8080/test/test jsp 로 랜더링

http://127.0.0.1:8080/test/test.json json 형식으로 랜더링

<property name="contentNegotiationManager">

-

<bean class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">

-

<property name="mediaTypes">

mediaType 은 URL 의 확장자와 contentType 을 연결해주는 일종의 맵입니다.

http://localhost/user.html 이 들어왔을 경우에는 URL 의 확장자인 html 에 연결된 text/html (ContentType) 을 처리하는 View 를 찾게되고

http://localhost/user.json 이 요청되었을 경우에는 위와 마찬가지로 URL의 확장자인 json 과 연결된 application/json (ContentType) 을 처리하는 View 를 찾습니다.

<property name="viewResolvers">

- ContentNegotiatingViewResolver 가 View 를 찾기위해 사용하는 ViewResolver 들

<property name="defaultViews">

- viewResolvers 에 의해 view 를 찾지 못했을 경우에 사용되는 view 입니다.

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />

- 뷰 이름과 동일한 이름을 갖는 빈 책체를 View 객체로 사용

- 주로 커스텀 View 클래스를 뷰로 사용해야 하는 경우에 사용

- 파일다운로드 할때 사용?

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

- Jsp나 Html 파일과 같이 웹 어플리케이션의 내부 자원을 이용하여 뷰를 생성하는 AbstractUrlBasedView 타입의 뷰 객체를 리턴

- 기본적으로 사용하는 View 클래스임

- prefix, suffix 프로퍼티를 사용

<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">

- ViewResolver의 구현체로 특별한 맵핑 정보 없이 view 이름을 URL로 사용

- View 이름과 실제 view 자원과의 이름이 같을 때 사용할 수 있다.

<property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" />

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">

- Tiles 템플릿으로 정의된 뷰를 찾음

- <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 정의후 사용해야 함

<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">

- View Resolver 에서 View 이름을 전달하면서 데이터도 같이 전달하게 된다.

이때 ajax를 사용 중이라면 값을 전달할 때 마다 일일이 json으로 바꿔야 하는데 이를 자동적으로 바꿔줌

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

- 공통 메세지 처리 프로퍼티

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">

- request가 가지고 있는 session으로 부터 locale정보를 가져온다. session에 있는 값을 가져오되,

만약 값이 없다면 defaultLocale로 설정을 지정할 수 있다. 아마 맨처음 접근시에는 session값이 없으므로 defaultLocale를 읽게 된다.

위에서는 SessionLocaleResolver를 정의하고 defaultLocale를 ko로 했으므로 브라우저에 세팅된 언어보다 위에 설정된 언어로 표시하게 된다.

- SessionLocaleResolver나 CookieLocaleResolver에 defaultLocale이 없다면 브라우저의 언어설정을 따르게 된다.

<mvc:interceptors>

- Controller 실행 전이나 후에 공통적인 작업을 특정 Controller에만 처리를 적용할 수 있기는 하지만 설정이 조건식에 의한

코딩방식으로 해결해야 하는 단점이 있다. 이런 문제를 해결할 수 있는 방법이 MVC Interceptor 설정이다.

<!-- mvc 인터셉터 정의 -->

<mvc:interceptors>

 

<mvc:interceptor>

 

<!-- 모든 URL 요청 mvc 인터셉터를 거치게 하도록 정의 -->

<mvc:mapping path="/**/*"/>

 

<!--mvc 인터셉터를 거치지 않고 예외 시킬 URL 요청들 정의 -->

<mvc:exclude-mapping path="/list.do"/>

<mvc:exclude-mapping path="/loginForm.do"/>

<mvc:exclude-mapping path="/login.do"/>

<mvc:exclude-mapping path="/joinForm.do"/>

<mvc:exclude-mapping path="/join.do"/>

 

<!--mvc 인터셉터 컨트롤러 빈객체 정의 -->

<bean class="controller.LoginCheckInterceptor"></bean>

 

</mvc:interceptor>

 

</mvc:interceptors>

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

- Connection의 트랜잭션 API를 이용해서 트랜잭션을 관리해주는 트랜잭션 매니저다.

- 스프링 방식으로 트랜젝션 제어할수 있게 해줌

이 트랜잭션 매니저를 사용하려면 트랜잭션을 적용할 DataSource 가 스프링의 빈으로 등록돼야 한다.

JDBC API를 이용해서 트랜잭션을 관리하는 데이터 액세스 기술인 JDBC와 iBatis SqlMap 으로 만든 DAO에 적용할 수 있다.

- 빈으로 등록할 때는 다음과 같이 트랜잭션을 적용할 DAO가 사용하는 것과 동일한 DataSource를 빈으로 제공해줘야 한다.

<tx:annotation-driven transaction-manager="txManager"/>

- 명시적 어노테이션 지정 방법 선언적 트랜젝션

- 클래스와 메소드에 @Transactional 애노테이션을 사용할 수 있다.

<property name="dataSource" ref="dataSource"/>

- DataSource Bean을 참조한다.

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">

- JNDI 어플리케이션이 다른 어플리케이션을 탐색할때 유용하게 사용된다. 즉 분산된 자원이라고 불린다.

Tomcat와 같은 WAS를 보면 특정 폴더에 필요한 데이터 소스가 있는데 그것을 우리가 유용하게 사용하기 위해 JNDI를 이용해서 가져오는 것이다.

<property name="jndiName" value="java:comp/env/jdbc/test"/>

- Tomcat의 server.xml의 Context 태그안에 추가해준다.

- value="java:/comp/env/jdbc/test" 위의 예제 dataSource.xml에 설정한 이부분과

Tomcat 의 server.xml에 설정한 name="jdbc/test" 이 부분의 끝부분 리소스 이름이며, 사용자 마음대로 지정할 수 있다.

<property name="resourceRef" value="true" />

- true로 설정하면 문자열 Java:comp/env/ 존재하지 않는 경우.

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

- 데이터소스를 매핑하고 mapper 파일을 연결설 수 있도록 설정

- 스프링과 연동 될 수 있도록 함

- 데이터베이스와의 연결과 SQL의 실행에 대한 모든 것을 가진 가장 중요한 객체

- myBatis 는 JdbcTemplate 대신 Connection 객체를 통한 질의를 위해서 SqlSession을 사용한다.

내부적으로 SqlSessionTemplate가 SqlSession을 구현하게 되는데, Thread에서 안전하고 여러개의 Mapper에서 공유할수 있다.

- SQLSession을 통해서 Connection을 생성하거나 원하는 SQL을 전달하고, 결과를 리턴 받는 구조

<property name="configLocation" value="classpath:SqlMapConfig.xml" />

- myBatis의 설정파일의 경로를 지정한다.

<property name="configLocation" value="classpath:SqlMapConfig.xml" />

- Mapper를 스캔하기위한 XML파일경로를 지정한다.

<mybatis:scan base-package="test.mate.**.dao, kr.co.care.**.dao" />

- 대신 클래스패스를 지정해서 마이바티스 스프링 연동모듈의 자동스캔기능을 사용할 수 있다.

- dao에서 매퍼를 스캔할수 있는 기능

 

Spring context 설명 공부.txt
0.01MB

- 출처 -

http://clearpal7.blogspot.com/2016/07/mvc.html

https://joont92.github.io/spring/MessageConverter/

https://ismydream.tistory.com/30

https://jekalmin.tistory.com/entry/%EC%BB%A4%EC%8A%A4%ED%85%80-ArgumentResolver-%EB%93%B1%EB%A1%9D%ED%95%98%EA%B8%B0

https://ismydream.tistory.com/139

https://snoopy81.tistory.com/325

https://isstory83.tistory.com/117

https://www.holaxprogramming.com/2015/10/18/spring-boot-with-mybatis/

반응형