1. 스프링기초 01. 스프링프레임워크란? 중량급인 J2EE 컨테이너를대신할경량컨테이너로서스프링을고안. 경량컨테이너란 POJO(Plain Old Java Object) 로불리는, 컨테이너와프레임워크등에의존하지않는일반오브젝트의생애주기관리나오브젝트간의의존관계를해결하는아키텍처를구현한컨테이너. 02. 스프링프레임워크특징 1) 경량컨테이너. 스프링컨테이너는자바객체의생성, 소멸과같은라이프사이클을관리하며, 스프링 컨테이너로부터필요한객체를가져와사용. 2) DI(Dependency Injection) 를지원. 설정파일이나어노테이션을통해서객체간의의존관계를설정 3) AOP(Aspect Oriented Programming) 지원. 트랜잭션이나로깅, 보안과같이여러모듈에서공통으로필요로하지만실제모듈의 핵심은아닌기능들을분리해서각모듈에서적용 4) POJO(Pain Old Java) 지원. 5) 트랙잭션처리를위한일관된방법제공. 6) JDBC, MyBatis(iBatis), 하이버네트, JPA 등데이터베이스처리를위한라이브러리
연동 7) JMS, 메일, 스케줄링등엔터프라이즈어플리케이션을개발하는데필요한다양한 API 연동 03. 스프링프레임워크설치 스프링사이트 : http://spring.io/ STS 다운로드 : http://spring.io/tools/sts
04. Dependency Injection 객체간의존관계를형성할때의존 (dependency) 하는객체를조립기가삽입 (inject) 해 주는방식. 스프링은설정파일과어노테이션을이용하여손쉽게객체간의의존 관계를설정하는기능제공. 05. AOP AOP(Aspect Oriented Programming) 는공통의관심사항을적용해서발생하는의존 관계의복잡성과코드중복을해소해주는프로그래밍기법. 보안이나트랜잭션과같은 공통기능을별도의모듈로구현한뒤, 각기능을필요로하는곳에적용. 2. 스프링 DI 와객체관리 01. ID 란 DI(Dependency Injection) 은의존관계주입이다. 오브젝트사이의의존관계를만드는
것이다. 오브젝트사이의의존관계를만든다는말은어떤오브젝트의프로퍼티 ( 인스턴스변수를가리킴 ) 에그오브젝트가이용할오브젝트를설정하는것이다. 이것을학술적으로말하면, 어떤오브젝트가의존 ( 이용 ) 할오브젝트를주입혹은인젝션 ( 프로퍼티에설정 ) 한다는것이다. 02. 스프링컨테이너 스프링은객체를관리하는컨테이너를제공. 스프링은컨테이너에객체를담아두고, 필요할때에컨테이너로부터객체를가져와사용할수있도록하고있다. 1) BeanFactory 인터페이스 org.springframework.beans.factory.beanfactory 인터페이스는빈객체를관리하고각 빈객체간의의존관계를설정해주는기능을제공하는가장단순한컨테이너. 구현클래스는 org.springframework.beans.factory.xml.xmlbeanfactory Resource resource = new FileSystemResource( beans.xml ); XmlBeanFactory factory = new XmlBeanFactory(reource); AgentService agent = (AgentService)factory.getBean( agent ); Resource 구현클래스 클래스 org.springframework.core.io.fil esystemresource 설명 파일시스템의특정파일로부터정보를읽어온다. org.springframework.core.io.in InputStream 으로부터정보를읽어온다.
putstreamresource org.springframework.core.io.cla sspathresource org.springframework.core.io.url Resource org.springframework.web.conte xt.support.servletcontextresou rce 클래스패스에있는자원으로부터정보를읽어온다. 특정 URL 로부터정보를읽어온다. 웹어플리케이션의루트디렉터리를기준으로지정한경로에위치한자원으로부터정보를읽어온다. 2) ApplicationContext 인터페이스와 WebApplicationContext 인터페이스 org.springframework.context.applicationcontext 인터페이스 빈관리기능, 빈객체라이프사이클, 파일과같은자원처리추상화, 메시지지원및 국제화지원, 이벤트지원, XML 스키마확장을통한편리한설정등추가적인기능을 제공. String configlocation = config/applicationcontext.xml ; ApplicationContext context = new ClassPathXmlApplicationContext(configLocation); ParserFactory factory = (ParserFactory)context.getBean( parserfactory ); 여러 XML 파일사용시 String[] configlocation = new String[]{ config/applicationcontext.xml, config/aop.xml ; ApplicationContext context = new ClassPathXmlApplicationContext(configLocation); ParserFactory factory = (ParserFactory)context.getBean( parserfactory );
org.springframework.web.context.webapplicationcontext 인터페이스 웹어플리케이션을위한 ApplicationContext 로서하나의웹어플리케이션 ( 즉, 하나의 ServletContext) 마다한개이상의 WebApplicationContext 를가질수있다. 웹어플리케이션에서 web.xml 파일에설정을통해 XmlWebApplicationContext 객체를생성하고사용. <context-param> <param-name>contextconfiglocation</param-name> <param-value>web-inf/applicationcontext.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.contextloaderlistener</listenerclass> </listener> 03. 빈 (Bean) 생성과의존관계설정 1) 빈객체설정및컨테이너를통한빈객체사용 <bean id= articledao class= com.spring.chap02.mysqlarticledao ></bean> or <bean name= articledao class= com.spring.chap02.mysqlarticledao ></bean> XmlBeanFactory 클래스를이용해서빈객체를가져와사용하는코드
Resource resource = new ClassPathResource("applicationContext.xml"); // 스프링컨테이너생성 BeanFactory beanfactory = new XmlBeanFactory(resource); // 스프링컨테이너로부터빈객체를가져와사용 WriteArticleService articleservice = (WriteArticleService) beanfactory.getbean("writearticleservice"); 스프링 3 버전부터타입변환대신제네릭 (Generic) 을이용해서원하는타입으로빈을 구할수있는 getbean() 메서드제공 ArticleDao articledao = beanfactory.getbean("articledao",articledao.class); 2) 의존관계설정 2-1) 생성자방식 <bean name="writearticleservice" class="madvirus.spring.chap01.writearticleserviceimpl"> <constructor-arg> <ref bean="articledao" /> </constructor-arg> </bean> <bean name="articledao" class="madvirus.spring.chap01.mysqlarticledao"></bean>
2-2) 프로퍼티설정방식 <bean name="writearticleservice" class="madvirus.spring.chap02.writearticleserviceimpl"> <property name="articledao"> <ref bean="mysqlarticledao" /> </property> </bean> <bean name="mysqlarticledao" class="madvirus.spring.chap02.mysqlarticledao" /> 2-3) XML 네임스페이스를이용한프로퍼티설정 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="monitor" class="madvirus.spring.chap02.systemmonitor" p:periodtime="10" p:sender-ref="smssender" /> 주요스키마명세 명칭스키마파일 URI 설명 bean spring-beans-3.1.xsd http://www.springframework.o rg/schema/beans Bean( 컴포넌트 ) 설정 context spring-context- 3.1.xsd http://www.springframework.o rg/schema/context Bean( 컴포넌트 ) 검색 과애노테이션설정 util spring-util-3.1.xsd http://www.springframework.o rg/schema/util jee spring-jee-3.1.xsd http://www.springframework.o rg/schema/jee lang spring-lang-3.1.xsd http://www.springframework.o rg/schema/lang aop spring-aop-3.1.xsd http://www.springframework.o rg/schema/aop tx spring-tx-3.1.xsd http://www.springframework.o rg/schema/tx mvc spring-mvc-3.1.xsd http://www.springframework.o rg/schema/mvc 정의와프로퍼티파일을불러오는등의유틸리티기능설정 JNDI 의 lookup 및 EJB 의 lookup 설정스크립트언어를이용할경우의설정 AOP 설정트랜잭션설정 Spring MVC 설정
2-4) 룩업메서드인젝션방식 package madvirus.spring.chap02; public abstract class Processor { public void process(string commandname) { CommandFactory factory = getcommandfactory(); Command command = factory.createcommand(commandname); command.execute(); // 룩업메서드를이용해서의존객체를구함 protected abstract CommandFactory getcommandfactory(); - 접근수식어가 public 이나 protected 여야한다. - 리턴타입이 void 가아니다. - 인자를갖지않는다. - 추상메서드여도된다. - final 이아니다. 2-5) 임의빈객체전달 <bean id="processor" class="madvirus.spring.chap02.systemmonitor" p:periodtime= 10 >
<property name= sender > <!-- 임의빈객체 <bean class= madvirus.spring.chap02.smssender > <constructor-arg value= true /> </bean> </property> </bean> 2-6) 콜렉션타입프로퍼티설정 태그컬렉션타입설명 <list> java.util.list 자바배열 List 타입이나배열에값목록을전달할때사용 <map> java.util.map Map 타입에 < 키, 값 > 목록을전달할때사용 <set> java.util.set Set 타입에값목록을전달할때사용 <properties> java.util.properties Properties 타입에 < 프로퍼티이름, 프로퍼티값 > 목록을전달할때사용 - List 타입과배열 <bean name="performancemonitor" class="madvirus.spring.chap02.performancemonitor"> <property name="deviations">
<list> <value type="java.lang.double">0.2</value> <value type="java.lang.double">0.3</value> </list> </property> </bean> - Map 타입 <!-- Map 타입프로퍼티설정 --> <bean name="protocolhandlerfactory" class="kr.spring.ch10.protocolhandlerfactory"> <!-- setmap 메서드를찾아서객체전달 --> <property name="map"> <!-- <map> --> <map key-type="java.lang.string" valuetype="java.lang.object"> <entry> <key><value>soap</value></key> <ref bean="soaphandler"/> </entry> <entry> <key><value>rest</value></key> <ref bean="resthandler"/> </entry> </map> </property> </bean>
- Properties 타입 <!-- Properties 타입프로퍼티설정 --> <bean name="bookclient" class="kr.spring.ch11.bookclient"> <property name="prop"> <props> <prop key="server">192.168.0.1</prop> <prop key="connectiontimeout">5000</prop> </props> </property> </bean> - Set 타입 <!-- Set 타입프로퍼티설정 --> <bean name="bookclient2" class="kr.spring.ch12.bookclient"> <property name="subset"> <set> <value>10</value> <value>20</value> </set> </property> </bean> 3) 의존관계자동설정 byname 프로퍼티의이름과같은이름을갖는빈객체를설정
bytype constructor autodetect 프로퍼티의타입과같은타입을갖는빈객체를설정생성자파라미터타입과같은타입을갖는빈객체를생성자에전달 constructor 방식을먼저적용하고, bytype 방식을적용하여의존객체를설정 04. 빈범위설정 스프링빈의범위를설정 범위 설명 singleton 스프링컨테이너에한개의빈객체만존재한다.( 기본값 ) prototype 빈을사용할때마다객체를생성 request HTTP 요청마다빈객체를생성. WebApplicationContext 에서만적용가능 session HTTP 세션마다빈객체를생성. WebApplicaitionContext 에서만적용가능 globalsession 글로벌 HTTP 세션에대해빈객체를생성. 포틀릿을지원하는컨텍스트에대해서만적용가능하다. 05. 어노테이션기반설정 1) @Required 어노테이션을이용한필수프로퍼티검사 org.springframework.beans.factory.annotation 패키지에위치한 @Required
어노테이션은필수프로퍼티를명시할때사용. 2) @Autowired 어노테이션을이용한자동설정 org.springframework.beans.factory.annotation 패키지에위치한 @Autowired 어노테이션은의존관계를자동으로설정할때사용 2-1) @Autowired 어노테이션적용프로퍼티의필수여부지정 @Autowired(required=false) (2) @Qualifier 어노테이션을이용한자동설정제한 @Autowired @Qualifier( main ) private Recorder recorder; <bean id= recorder class= com.spring.ch04.homecontrol.recorder > <qualifier value= main /> </bean> 1.3 @Resource 어노테이션을이용한프로퍼티설정 @Resource(name = camera1 ) private Camera camera1; @Resource(name = camera2 ) private Camera camera2;
1.4 @PostConstruct 어노테이션및 @PreDestory 어노테이션과라이프사이클 @PostConstruct 어노테이션과 @PreDestory 어노테이션은 javax.annotation 패키지에위치하며, @Resource 어노테이션과마찬가지로자바 6 및 JEE 5 에추가된어노테이션으로서라이프사이클의초기화및제거과정을제공한다. @PostConstruct public void init(){ // 초기화처리 @PreDestory public void close(){ // 자원반환등종료처리 06. 어노테이션을이용한자동스캔 <context:component-scan> 태그를추가하면스프링은지정한패키지에서 @Component 어노테이션이 ( 또느하위어노테이션이 ) 적용된클래스를검색하여 빈으로등록하게된다. <context:component-scan base-package="com.spring.ch06" /> 1) 자동검색된빈의이름과범위 @Component public class HomeController{
특정한이름을명시해주고싶다면다음과같이어노테이션의속성에빈의이름을입력 @Component( homecontrol ) public class HomeController{ 2) @Component 의확장 어노테이션 @Controller 설명 프레젠테이션층스프링 MVC 용애노테이션 @Service 비즈니스로직층 Service 용애노테이션. @Repository 데이터액세스층의 DAO 용애놑이션. 예외를모두 DataAccessException 으로변환한다.(PersistenceExceptionTranslationPostProcessor 를 Bean 정의파일에등록함으로써유효해진다.) 3) 빈의범위설정 스프링은기본적으로빈의범위를 singleton 으로설정하지만빈의범위를변경할 때는 @Scope 를이용 @Component @Scope( prototype )
public class HomeController{ 4) @Scope 의주요 Value 속성 Value 속성 설명 singleton 인스턴스를싱글톤으로한다. prototype 이용할때마다인스턴스화한다. request Servlet API 의 Request 스코프인동안만인스턴스가생존 * session Servlet API 의 Session 스코프인동안만인스턴스가생존 * * Servlet2.3 에서는 RequestContextFilter, Servlet2.4 에서는 RequestContextLinstener 설정이 web.xml 에필요 07. 자바코드기반설정 Spring JavaConfig 프로젝트는 XML 이아닌자바코드를이용해서컨테이너를설정할 수있는기능을제공하는프로젝트 @Configuration public class SpringConfig{ @Bean public AlarmDevice alarmdevice(){ return new SmsAlarmDevice();
3. 스프링 AOP 로깅과같은기본적인기능에서부터트랜잭션이나보안과같은기능에이르기까지어플리케이션전반에걸쳐적용되는공통기능이존재하고이런공통기능들은어플리케이션의핵심비즈니스로직과는구분되는기능이다. 핵심비즈니스기능과구분하기위해공통기능을공통관심사항 (cross-cutting concern) 이라고표현하며, 핵심로직을핵심관심사항 (core concern) 이라고표현. 01 AOP 소개 AOP(Aspect Oriented Programming) 는문제를바라보는관점을기준으로 프로그래밍하는기법. 공통관심사항을구현한코드를핵심로직을구현한코드안에 삽입하는것을의미. 1) AOP 용어 Advice 언제공통관심기능을핵심로직에적용할지를정의. Joinpoint Advice 를적용가능한지점을의미. 메서드호출, 필드값변경등이 Joinpoint 에해당 Pointcut Joinpoint 의부분집합으로서실제로 Advice 가적용되는 Joinpoint 를나 타냄. Weaving Advice 를핵심로직코드에적용하는것을 weaving 이라고함. Aspect 여러객체에공통으로적용되는공통관심사항
2) 세가지 Weaving 방식 - 컴파일시에 Weaving 하기 - 클래스로딩시에 Weaving 하기 - 런타임시에 Weaving 하기 3) 스프링에서의 AOP - XML 스키마기반의 POJO 클래스를이용한 AOP 구현 - @Aspect 어노테이션기반의 AOP 구현 4) 구현가능한 Advice 종류 종류 Before Advice After Returning Advice After Throwing Advice After Advice 설명대상객체의메서드호출전에공통기능을실행대상객체의메서드가예외없이실행한이후에공통기능을실행대상객체의메서드를실행하는도중예외가발생한경우에공통기능을실행대상객체의메서드를실행하는도중에예외가발생했는지의여부와상관없이메서드실행후공통기능을실행. Around Advice 대상객체의메서드실행전, 후또는예외발생시점에공통기능을실행하는데사용
02. XML 스키마를이용한 AOP 설정 <!-- Aspect 설정 : Advice 를어떤 Pointcut 에적용할지설정 --> <aop:config> <aop:aspect id="traceaspect1" ref="performancetraceadvice"> <aop:pointcut expression="execution(public * com.spring.board..*(..))" id="publicmethod"/> <aop:around method="trace" pointcut-ref="publicmethod"/> </aop:aspect> </aop:config> <bean id="writearticleservice" class="com.spring.board.service.writearticleserviceimpl"> <constructor-arg> <ref bean="articledao"/> </constructor-arg> </bean> <bean id="articledao" class="com.spring.board.dao.writearticledao"/> <aop:config> : AOP 설정정보임을나타냄 <aop:aspect> : Aspect 를설정함 <aop:pointcut> : Pointcut 을설정함 <aop:around> : Around Advice 를설정함 Advice 정의관련태그 종류 설명 <aop:before> 메서드실행전에적용되는 Advice 를정의한다.
<aop:afterreturning> <aop:afterthrowing> <aop:after> <aop:around> 메서드정상적으로실행된후에적용되는 Advice 를정의한다. 메서드가예외를발생시킬때적용되는 Advice 를정의한다. try-catch 블록에서 catch 블록과비슷하다. 메서드가적상적으로실행되느니지또는예외를발생시키는지여부에상관없이적용되는 Advice 를정의한다. try-catchfinally 에서 finally 블록과비슷하다. 메서드호출이전, 이후, 예외발생등모든시점에적용가능한 Advice 를정의한다. AspectJ 의 Pointcut 표현식 <aop:aspect id="traceaspect1" ref="performancetraceadvice"> <aop:pointcut expression="execution(public * com.spring.board..*(..))" id="publicmethod"/> <aop:around method="trace" pointcut-ref="publicmethod"/> </aop:aspect> execution 명시자는 Advice 를적용할메서드를명시할때사용됨 execution( 식어패턴리턴타입패턴클래스이름패턴이름패턴 ( 파라미터패턴 ) 예 ) execution(public void set*(..))
리턴타입이 void 이고메서드이름이 set 으로시작하고, 파라미터가 0 개이상인메서드호출 execution(* com.spring.ch01.*.*()) com.spring.ch01 패키지의파라미터가없는모든메서드호출 execution(* com.spring.ch01..*.*(..)) com.spring.ch01 패키지및하위패키지에있는파라미터가 0 개이상인메서드호출 execution(integer com.spring.ch01..writearticleservice.write(..)) 리턴타입이 Integer 인 WriteArticleService 인터페이스의 write() 메서드호출 execution(* get*(*)) 이름이 get 으로시작하고 1 개의파라미터를갖는메서드호출 execution(* get*(*,*)) 이름이 get 으로시작하고 2 개의파라미터를갖는메서드호출 execution(* read*(integer,*)) 메서드이름이 read 로시작하고, 첫번째파라미터타입이 Integer 이며, 1 개이상의파라미터를갖는메서드호출 03) @Aspect 어노테이션을이용한 AOP @Aspect public class ProfilingAspect { @Pointcut("execution(public * com.spring.board..*(..))") private void profiletarget(){ @Around("profileTarget()") public Object trace(proceedingjoinpoint joinpoint)
throws Throwable{ String signaturestring = joinpoint.getsignature().toshortstring(); System.out.println(signatureString + " 시작 "); long start = System.currentTimeMillis(); Object result = null; try{ // 핵심비지니스로직을수행 result = joinpoint.proceed(); catch(exception e){ e.printstacktrace(); finally{ // 메서드실행직후의시간을저장 long finish = System.currentTimeMillis(); System.out.println(signatureString + " 종료 "); System.out.println(signatureString + " 실행시간 : " + (finish- return result; start)+"ms"); 4. 스프링 MVC 스프링 MC 의주요구성요소 구성요소 설명
DispatcherServlet HandlerMapping 클라이언트의요청을전달받는다. 컨트롤러에게클라이언트의요청을전달하고, 컨트롤러가리턴한결과값을 View 에전달하여알맞은응답을생성하도록한다. 클라이언트의요청 URL 을어떤컨트롤러가처리할지를결정한다. 컨트롤러 (Controller) 클라이언트의요청을처리한뒤, 그결과를 DispatcherServlet 에알려준다. 스트럿츠의 Action 과동일한 역할을수행한다. ModelAndView 컨트롤러가처리한결과정보및뷰선택에필요한정보를 담는다. ViewResolver 컨트롤러의처리결과를생성할뷰를결정한다. 뷰 (View) 컨트롤러의처리결과화면을생성한다. JSP 나 Velocity 템플릿 파일등을뷰로사용한다. 01. 스프링 MVC 설정
1) DispatcherServlet 설정및스프링컨텍스트설정 DispatcherServlet 의설정은웹어플리케이션의 /WEB-INF/web.xml 파일에추가 <servlet> <servlet-name>appservlet</servlet-name> <servlet-class>org.springframework.web.servlet.dispatcherservlet </servlet-class> <init-param> <param-name>contextconfiglocation</param-name> <param-value>/web-inf/spring/appservlet/servletcontext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appservlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> 2) 컨트롤러구현및설정추가 @Controller public class HelloController { @RequestMapping("/hello.do") public ModelAndView hello() { ModelAndView mav = new ModelAndView(); // 뷰이름지정
mav.setviewname("hello"); // 뷰에서사용할데이터셋팅 mav.addobject("greeting", "Hello World!!"); return mav; 3) servlet-context.xml 설정 bean 설정및 viewresolver 설정 <?xml version="1.0" encoding="utf-8"?> <beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xsi:schemalocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean 설정 --> <beans:bean id="hellocontroller" class="kr.spring.ch01.controller.hellocontroller" /> <!-- viewresolver 설정 -->
<beans:bean id="viewresolver" class="org.springframework.web.servlet.view.internalresourceviewresolver"> <beans:property name="prefix" value="/web-inf/views/" /> <beans:property name="suffix" value=".jsp" /> </beans:bean> </beans:beans> 4) 뷰코드구현 <%@ page language="java" contenttype="text/html; charset=utf-8"%> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title> 인사 </title> </head> <body> 인사말 : <strong>${greeting</strong> </body> </html> 02. Validator 인터페이스를이용한폼값검증 package kr.spring.ch08.validator; import kr.spring.ch08.model.address; import kr.spring.ch08.model.memberinfo;
import org.springframework.validation.errors; import org.springframework.validation.validator; public class MemberInfoValidator implements Validator { @Override //Validator 가해당클래스에대한값검증을지원하는지의여부를리턴 public boolean supports(class<?> clazz) { return MemberInfo.class.isAssignableFrom(clazz); @Override //target 객체에대한검증을실행한다. 검증결과문제가있을경우 errors 객체에 // 어떤문제인지에대한정보를저장한다. public void validate(object target, Errors errors) { MemberInfo memberinfo = (MemberInfo) target; if (memberinfo.getid() == null memberinfo.getid().trim().isempty()) { errors.rejectvalue("id", "required"); if (memberinfo.getname() == null memberinfo.getname().trim().isempty()) { errors.rejectvalue("name", "required"); Address address = memberinfo.getaddress(); if (address == null) { errors.rejectvalue("address", "required");
03. 메시지처리 1). MessageSource 를이용한메시지국제화처리 국제화지언을위해 org.springframework.context.messagesource 인터페이스를제공 <bean id="messagesource" class="org.springframework.context.support.resourcebundlemessagesource"> <property name="basenames"> <value>message.greeting</value> </property> </bean> - ResourceBundle 은프로퍼티파일의이름을이용해언어및지역에따른메시지로딩 message.properties : 기본메시지 message_ko.properties : 한글메시지 message_en_us.properties : 미국을위한영어메시지 2) 에러코드호출시메서드사용 reject() 메서드를이용하여커맨드객체자체에대한에러코드를입력한경우, 다음의 순서로메시지코드를생성 1) 에러코드 +. + 커맨드객체이름
2) 에러코드 reject() 메서드를이용하여특정필드에대한에러코드를입력했다면, 다음의순서로 메시지코드를생성 1) 에러코드 +. + 커맨드객체이름 +. + 필드명 2) 에러코드 +. + 필드명 3) 에러코드 +. + 필드타입 4) 에러코드 예 ) 1) required.logincommand.userid 2) required.userid 3) required.java.lang.string 4) required 04. 파일업로드처리 1) MulipartResolver 설정 <beans:bean id="multipartresolver" class="org.springframework.web.multipart.commons.commonsmultipartresol ver"> <beans:property name="maxuploadsize" value="52428800" /><!-- 50M --> <beans:property name="defaultencoding" value="utf-8" /> </beans:bean>
CommonsMultipartResolver 클래스의프로퍼티 프로퍼티 타입 설명 maxuploadsize long 최대업로드가능한바이트크기, -1 은제한이없음을의미한다. 기본값은 -1 이다. maxinmemorysize int 디스크에임시파일을생성하기전에메모리에보관할수있는최대바이트크기. 기본값은 10240 바이트이다. defaultencoding String 요청을파싱할때사용할캐릭터인코딩. 지정하지않을경우, HttpServletRequest.setCharacterEncoding() 메서드로지정한캐릭터셋이사용된다. 아무값도없을경우 ISO-8859-1 을사용한다. 2) 구현예 try { File file = new File(path + "/" + command.getreportfile().getoriginalfilename()); command.getreportfile().transferto(file); catch (IllegalStateException e) { e.printstacktrace(); catch (IOException e) { e.printstacktrace();
5. JDBC 01. 커넥션풀을이용한 DataSource 설정 <bean id="datasource" class="org.apache.commons.dbcp.basicdatasource"> <property name="driverclassname" value="${jdbc.driverclassname"/> <property name="url" value="${jdbc.url"/> <property name="username" value="${jdbc.username"/> <property name="password" value="${jdbc.password"/> <!-- 최대커넥션개수 --> <property name="maxactive" value="50"/> <!-- 접속이없을경우최대유지커넥션개수 --> <property name="maxidle" value="30"/> <!-- 접속이없을경우최소유지커넥션개수 --> <property name="minidle" value="20"/> <!-- 최대대기시간 ( 초 ) : 초과시연결실패오류발생 --> <property name="maxwait" value="5"/> </bean> BasciDataSoute 클래스의주요프로퍼티 프로퍼티 initialsize maxactive maxidle 설명초기에풀에생성되는커넥션의개수커넥션풀이제공할최대커넥션의개수사용되지않고풀에저장될수있는최대커넥션개수. 음수일경우제한이없다.
minidle maxwait minevictableidl etimemillis timebetweenev ictionrunsmilli s numtestsperev ictionrun testonborrow testonreturn testwhileidle 사용되지않고풀에저장될수있는최소커넥션개수풀에커넥션이존재하지않을때, 커넥션이다시풀에리턴될때까지대기하는시간. 단위는 1/1000 초이며, -1 일경우무한히대기한다. 사용되지않는커넥션을추출할때이속성에서지정한시간이상비활성화상태인커넥션만추출한다. 양수가아닌경우비활성화된시간으로풀에서제거되지않는다. 시간단위는 1/1000 초이다. 사용되지않은커넥션을추출하는쓰레드의실행주기를지정한다. 양수가아닐경우실행되지않는다. 단위는 1/1000 초이다. 사용되지않는커넥션을몇개검사할지지정한다. true 일경우커넥션풀에서커넥션을가져올때커넥션이유효한지의여부를검사한다. true 일경우커넥션풀에커넥션을반환할때커넥션이유효한지의여부를검사한다. true 일경우비활성화커넥션을추출할때커넥션이유효한지의여부를검사해서유효하지않은커넥션은풀에서제거한다. 02. JdbcTemplate 클래스를이용한 JDBC 프로그래밍 1) JdbcTemplate 빈설정 <!-- JdbcTemplate 객체생성 --> <bean name="jdbctemplate"
class="org.springframework.jdbc.core.jdbctemplate"> </bean> <property name="datasource" ref="datasource"/> 2) Dao 클래스에서의 JdbTemplate 객체사용 @Autowired private JdbcTemplate jdbctemplate; // 등록 public void insertmember(membercommand member){ jdbctemplate.update(insert_sql, new Object[]{member.getId(),member.getPasswd(),member.getName()); // 총데이터수 public int getmembercount(){ return jdbctemplate.queryforobject(select_count_sql, Integer.class); // 목록 public List<MemberCommand> getmemberlist(int startrow,int endrow){ List<MemberCommand> list = jdbctemplate.query(select_list_sql, new Object[]{startRow,endRow, new RowMapper<MemberCommand>(){ public MemberCommand maprow(resultset rs, int rownum) throws SQLException{
MemberCommand(); MemberCommand member = new member.setid(rs.getstring("id")); member.setpasswd(rs.getstring("passwd")); member.setname(rs.getstring("name")); member.setreg_date(rs.getdate("reg_date")); ); return list; return member; 03. NamedParameterJdbcTemplate 클래스를이용한 JDBC 프로그래밍 1) NamedParameterJdbcTemplate 빈설정 <!-- NamedParameterJdbcTemplate 객체생성 --> <bean name="namedparameterjdbctemplate" class="org.springframework.jdbc.core.namedparam.namedparameterjdbctemplate" > <constructor-arg ref="datasource"/> </bean> 2) Dao 클래스에서의 NamedParameterJdbcTemplate 객체사용
@Autowired private NamedParameterJdbcTemplate namedparameterjdbctemplate; // 등록 public void insertmember(membercommand member){ BeanPropertySqlParameterSource beanprops = new BeanPropertySqlParameterSource(member); namedparameterjdbctemplate.update(insert_sql,beanprops); // 총데이터수 public int getmembercount(){ return namedparameterjdbctemplate.queryforobject(select_count_sql, new MapSqlParameterSource(),Integer.class); // 목록 public List<MemberCommand> getmemberlist(int startrow,int endrow){ List<MemberCommand> list = namedparameterjdbctemplate.query(select_list_sql, new MapSqlParameterSource().addValue("start",startRow).addValue("end",endRow), new RowMapper<MemberCommand>(){ public MemberCommand maprow(resultset rs, int rownum) throws SQLException{ MemberCommand member = new MemberCommand();
member.setid(rs.getstring("id")); member.setpasswd(rs.getstring("passwd")); member.setname(rs.getstring("name")); member.setreg_date(rs.getdate("reg_date")); ); return list; return member; 6. 트랜잭션 01. 트랜잭션에는지켜야할 ACID 특성 ACID 의미 설명 Atomicity 트랜잭션의원자성 트랜색션내의모든처리는전부실행했거나혹은아무것도실행되지않았거나둘중하나뿐이다. Consistency 테이터의일관성데이터에일관성이있어야한다. 일관성을 지키지않은예 : 상위테이블이없는데하위 테이블이있는경우 Isolation 트랜잭션의독립성변행해서달리는트랜잭션이서로독립된것 Durability 데이터의영속성데이터가영속화된것
02. JDBC 기반트랜잭션관리자설정 1) 빈설정 <!-- JDBC 기반트랜잭션관리자설정 --> <bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager" p:datasource-ref="datasource"/> 2) TransactionTemplate 을이용한트랜잭션처리 public void updatemember(final MemberCommand member){ transactiontemplate.execute(new TransactionCallback<Object>(){ @Override public Object dointransaction(transactionstatus status) { ); memberdao.updatemember(member); // 트랜잭션테스트를위해서호출 memberdao.insertmember(member); return new Object(); 03. 선언적트랜잭션처리
1) 빈설정 <tx:advice id="txadvice" transaction-manager="transactionmanager"> <tx:attributes> <tx:method name="update*" propagation="required"/> </tx:attributes> </tx:advice> 2) <tx:method> 태그의속성 속성이름 name 설명트랜잭션이적용될메서드이름을명시한다. * 을사용한설정이가능하다. 예를들어. get* 으로설정할경우이름이 get 으로시작하는메서드를의미한다. propagation 트랜잭션전파규칙을설정한다. isolation read-only no-rollback-for rollback-for timeout 트랜잭션격리레벨을설정한다읽기전용여부를설정트랜잭션을롤백하지않을예외타입을설정트랜잭션을롤백할예외타입을설정트랜잭션을타임아웃시간을초단위로설정 3) <tx:method> 태그의 propagation 속성에설정가능한값 속성값 설명
REQUIRED ( 기본값 ) 메서드를수행하는데트랜잭션이필요하다는것을의미한다. 현재진행중인트랜잭션이존재하면, 해당트랜잭션을 사용한다. 존재하지않는다면새로운트랜잭션을생성한다. MANDATORY 메서드를수행하는데트랜잭션이필요하다는것을의미한다. 하지만, REQUIRED 와달리, 진행중인트랜잭션이존재하지 않을경우예외를발생시킨다. REQUIRES_NEW SUPPORS 항상새로운트랜잭션을시작한다. 기존트랜잭션이존재하면기존트랜잭션을일시중지하고새로운트랜잭션을시작한다. 새로시작된트랜잭션이종료된뒤에기존트랜잭션이계속된다. 메서드가트랜잭션을필요로하지는않지만, 기존트랜잭션이존재할경우트랜잭션을사용한다는것을의미한다. 진행중인트랜잭션이존재하지않더라도메서드는정상적으로동작한다. NOT_SUPPORTED 메서드가트랜잭션을필요로하지않음을의미한다. SUPPORTS 와달리진행중인트랜잭션이존재할경우메서드가실행되는동안트랜잭션은일시중지되며, 메서드실행이종료된후에트랜잭션을계속진행한다. NEVER NESTED 메서드가트랜잭션을필요로하지않으며, 만약진행중인트랜잭션이존재하면예외를발생시킨다. 기존트랜잭션이존재하면, 기존트랜잭션에중첩된트랜잭션에서메서드를실행한다. 기존트랜잭션이존재하지않으면 REQUIRED 와동일하게동작한다. 이기능은 JDBC3.0 드라이버를사용할때에만적용된다. (JTA Provider 가이기능을지원할경우에도사용가능하다.) 4) <tx:method> 태그의 isolation 속성에설정가능한값
속성값 설명 DEFAULT 기본설정을사용한다. READ_UNCOMMITTED 다른트랜잭션에서커밋하지않은데이터를읽을수있다. READ_COMMITTED 다른트랜잭션에의해커밋된데이터를읽을수있다. REPEATABLE_READ SERIALIZABLE 처음에읽어온데이터와두번째읽어온데이터가동일한값을갖는다. 동일한데이터에대해서동시에두개이상의트랜잭션이수행될수없다. 04. 어노테이션기반트랜잭션설정 1) 메서드에직접명시 @Transactional public void updatemember(membercommand member){ memberdao.updatemember(member); memberdao.insertmember(member); 2) @Transactional 어노테이션의주요속성 속성 propagation 설명 트랜잭션전파규칙을설정한다. Propagation 열거형타입에값이 정의되어있다. 기본값은 Propagation.REQUIRED 이다.
isolation readonly 트랜잭션격리레벨을설정한다. Isolation 열거형타입에값이정의되어있다. 읽기전용여부를설정한다. boolean 값을설정하며, 기본값은 false 이다. rollbackfor 트랜잭션을롤백할예외타입을설정한다. 예, rollbackfor={exception.class norollbackfor 트랜잭션을롤백하지않을예외타입을설정한다. 예, norollbackfor={itemnotfoundexception.class timeout 트랜잭션의타임아웃시간을초단위로설정한다. @Transactional 어노테이션이적용된스프링빈에실제로트랜잭션을적용하려면 다음과같이 <tx:annotation-driven> 태그를설정하면된다. <tx:annotation-driven transaction-manager="transactionmanager"/> 3) <tx:annotation-driven> 태그의속성 속성설명기본값 transactionmanager proxy-target-class 사용할 PlatformTransactionManager 빈의이름클래스에대해서프록시를생성할지의여부. true 일경우 CGLIB 를이용해서프록시를생성하며, false 인경우자바다이나믹프록시를이용해서프록시를생성한다. transactionmanager false
order Advice 적용순서 int 의최대값 ( 가장낮은순위 )