나는 스프링 4때부터 봣기때문에 이러한 것이 잇는지도 몰랐다.

요세 하는 프로젝트에 @Requestmapping부분이 아무런 옵션이 없길래

왜그런가 해서 찾아보니 그냥 폼으로 적어놓은거더라

그러면서 컨트롤러는 url맵핑이 된다? 왜그런지 이유를 찾아봤다.


<!--         URI handler mapping -->

<beans:bean id="urlMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">

<beans:property name="caseSensitive" value="false" />

<beans:property name="basePackage" value="com.plays.js" />

</beans:bean>

 

이것은 2.X시절에 사용하던 Mapping방식

빈을 등록시켜주면  해당 패키지에 Controller 잇으면 찾아서 Controoler url맵핑해줌.

예를 들어서 HomeController였으면 home이라는 글자로 맵핑됨

자세한 예를 들어서

서버 url js 시작한다고치면

Com.plays.js.home HomeController class 있고 test method 있으면

주소는

Host:port/js/home/home/test 매칭댐

여기서  첫번째 home 패키지 home 두번째 home HomeController에서 home

 

옵션이 몇가지있는데

basePackage 기본적으로 패키지를 말하는거야 만약에 com이라고 해놧으면

Url 바뀜

Com 기본이니깐 plays/js/home/home/test 바뀜

caseSensitive 대문자 사용여부

 

pathPrefix 는 접두어 형태로 특정 url 강제할수있다.

'오락기 > spring' 카테고리의 다른 글

component-scan 관해서  (0) 2017.11.16
Transactional 과 advice  (0) 2017.08.07
HandlerMethodArgumentResolver  (0) 2017.07.11

ontext:component-scan   어노테이션 대부분 검색하는듯

 

대표적으로

@Controller @Service @AutoWWired 등이 있다.

 

서블릿컨테이너꺼

<context:component-scan base-package="com.plays.js"

scoped-proxy="targetClass" resource-pattern="**/*.class" use-default-filters="false" >

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

</context:component-scan>

 

스프링컨테이너꺼

<context:component-scan base-package="com.plays.js"

scoped-proxy="targetClass" resource-pattern="**/*.class"> 

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

</context:component-scan>

 

 

옵션을 보면

base-package 말그대로 베이스 패키지

scoped-proxy 프록시 방식

resource-pattern 스캔 패턴

use-default 기본적인것들을 검사할껀지 여부

include-filter  예외적으로 등록시킬 필터

exclude-filter 예외적으로 제외할 필터

 

위의 2가지로 형태를 나누게 된것은

Controller부분은 실제로 서블릿 컨테이너에서 관리하도록 저기서만 스캔했고

나머지 것들은 스프링컨테이너가 관장하니 그쪽으로 선언한것이다.

그러니깐 실제로

 

서블릿 컨테이너에서는 컨트롤러 빈을 만들고

스프링 컨테이너에서는 서비스 오토와이어 리소스 등등의 빈을 만든다.

 

빈이 과다하게 등록시키지않기뒤해서 이러한 구성을 시도했다.

 

아직 이유는 잘모르지만 이렇게 구분지어놓으라고 하더라

'오락기 > spring' 카테고리의 다른 글

ControllerClassNameHandlerMapping  (0) 2017.11.16
Transactional 과 advice  (0) 2017.08.07
HandlerMethodArgumentResolver  (0) 2017.07.11


<tx:advice id="txAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="save*" propagation="REQUIRED" />

<tx:method name="regi*" propagation="REQUIRED" />

<tx:method name="delt*" propagation="REQUIRED" />

<tx:method name="updt*" propagation="REQUIRED" />

<tx:method name="*TxNew" propagation="REQUIRES_NEW" />

<tx:method name="*TxMandatory" propagation="MANDATORY" />

<tx:method name="*TxNotSupported" propagation="NOT_SUPPORTED" />

<tx:method name="*" propagation="SUPPORTS" read-only="true" />

</tx:attributes>

</tx:advice>


세부사항은 어노테이션과 같다.


name = 메서드명

timeout = 제한시간 -> 디폴트 -1 제한없음

propagation = 전파옵션 기본값 -> required


required - > 부모트랜잭션 내에서 실행하며 부모트랙잭션이 없으면 새로 만듬

requires_new -> 부모트랙션을 무시하고 무조건 새로운걸 만든다.

support -> 부모트랙잭션 내에서 실행하며 부모 가없을경우 nontransactionally로 실행

mandatory : 부모 트랙잭션내에서 실행되며 부모 트랙잭션이 없을경우 예외

not _support  : nontransactionally로 실행되고 부모트랜젝션내에서 실행될경우 일시정지

never : nontransactionally로 실행되며 부모가 존재하면 예외발생

nested : 해당 메서드가 부모트랙잭션에서 진행ㄷ죌경우 별개로 커밋되거나 롤백될수있다. 트랙재션이 둘러쌓여있지않으면 required와 같다.


isolation - 격리수준 기본값 - default


default - > 기본격리 수준

serialzable - >가장 높은 수준의 격리 

read_uncommitted : 커밋되지않은 데이터의  대한 읽기를 허용

read_committed : 커밋된 트랙잭션에 대해 읽기를 허용

repeatable_read : 동일한 필드에 대한 다중 접근시 동일한 결과를 얻을수있는것을 보장함.


read-only : 일기전용  기본 값 false


rollback- for - 예외처리  기본값 runtimeExcception

특정 에외 발생해슬때 롤백


no-rollback-for 예외가 발생해도 롤백 처리 안함





'오락기 > spring' 카테고리의 다른 글

ControllerClassNameHandlerMapping  (0) 2017.11.16
component-scan 관해서  (0) 2017.11.16
HandlerMethodArgumentResolver  (0) 2017.07.11

controller 메서드에 파라미터로 객체를 주입할수 잇는 기능

controller에 공통적으로 파라미터에 추가 되어야 하는 경우에 사용하면 되며, 


#

예를들어 로그인의 경우 로그인한 사용자정보나 권한정보 등을 controller에서 바로 사용가능하게 해주는 개념

#



 <mvc:annotation-driven/>를 선안하면 문제가 생긴다. 

파라미터가 꼭 Map형식이면 동작하지않는다. 

-> 구현한다 해도 ArgmentResolver를 거치게 되어있다.



우선 맵처리용 클래스



package com.plays.js.common.common;


import java.util.HashMap;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;


public class CommonMap {


/*

*  HandlerMethodArgumentResolver 용 공용 map.VO

*/

Map map  = new HashMap();


public Object getMap(Object key) {

return this.map.get(key);

}


public void putMap(Object key, Object value) {

this.map.put(key, value);

}

public Object remove(Object key){

return this.map.remove(key);

}

public boolean containsKey(Object key){

return this.map.containsKey(key);

}

public boolean containsValue(Object value){

return this.map.containsValue(value);

}

public Set<Entry> entrySet(){

 return this.map.entrySet();

}

public Set<Object> keySet(){

return this.map.keySet();

}

public boolean isEmpty(){

        return map.isEmpty();

    }

     

    public void putAll(Map<? extends String, ?extends Object> m){

        map.putAll(m);

    }

     

    public Map<String,Object> getMap(){

        return map;

    }



}



HandlerMethodArgumentResolver를 구현한 클래스도 생성



package com.plays.js.common.resolver;


import java.util.Enumeration;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import com.plays.js.common.common.CommonMap;

public class MapArgumentResolver implements HandlerMethodArgumentResolver{

@Override
public Object resolveArgument(MethodParameter parm, ModelAndViewContainer mvc, NativeWebRequest webReq,
WebDataBinderFactory webDataBind) throws Exception {
CommonMap commonMap = new CommonMap();
HttpServletRequest req = (HttpServletRequest) webReq.getNativeRequest();
Enumeration<?> enumeration = req.getParameterNames();
String key = null;
String[] val = null;
while(enumeration.hasMoreElements()){
key = (String)enumeration.nextElement();
val = req.getParameterValues(key);
if(val != null){
  commonMap.putMap(key, (val.length > 1) ? val:val[0] );

}
}
return commonMap;
}

@Override
public boolean supportsParameter(MethodParameter param) {
return CommonMap.class.isAssignableFrom(param.getParameterType());
}

}

빈에 등록

<annotation-driven>
<argument-resolvers>
<beans:bean class="com.plays.js.common.resolver.MapArgumentResolver"/>
</argument-resolvers>
</annotation-driven>



컨트롤러에 등록시키고 테스트



@RequestMapping(value="resolver.rest")
public ModelAndView ModelAndViewtestMapArgmentResolver(CommonMap commonMap ) throws Exception{
ModelAndView mv = new ModelAndView("");
if(commonMap.isEmpty()){
Iterator<Entry<String, Object>> iterator =commonMap.getMap().entrySet().iterator();
Entry<String,Object> entry = null;
while(iterator.hasNext()){
           entry = iterator.next();
           log.debug("key : "+entry.getKey()+", value : "+entry.getValue());
       }
}
return mv;
}


get방식으로 데이터를 던져보자



'오락기 > spring' 카테고리의 다른 글

ControllerClassNameHandlerMapping  (0) 2017.11.16
component-scan 관해서  (0) 2017.11.16
Transactional 과 advice  (0) 2017.08.07

+ Recent posts