4 주차 - SPRING 환경설정및구현 Spring 기반의웹프로젝트를구성하고싶어요 T^T Spring 기반의웹환경구축 1. web.xml 수정으로 Spring 을설정하는방법 2. eclipse Spring Plug-In 을활용한템플릿프로젝트자동구성필수는아니지만해놓으면편리한것들 1. slf4j 를활용한 Logger 생성을편리하게해보자 2. AOP 설정 JDBC 를활용한 DB 연결정보및트랜잭션설정 1. DB 접속정보설정 2. 트랜잭션설정개발 GoGo 1. 간단한형태의 CRUD 기능이구현된기능시연 2. 웹에서기능테스트 Spring 기반의웹프로젝트를구성하고싶어요 T^T 우리의목표는 DB 와연결하여 CRUD 기능을수행할수있는간단한형태의웹프로젝트를구성해보는것! 그렇다면 Spring 기반의웹프로젝트를구성하는단계는어떻게진행하면좋을까?? 1. 2. 3. 4. Spring 기반의웹환경구축 (Test 페이지가정상적으로표시되는지확인 ) 개발하기편리한것들미리설정!! JDBC 를활용한 DB 연결정보설정개발 GoGo Spring 기반의웹환경구축 1. web.xml 수정으로 Spring 을설정하는방법 요즘과연이렇게프로젝트를수행하는곳이있을까?? 예전에야이렇게하는곳이간혹있었지만, Maven 이대세가되버린지금에서야의미가없긴함ㅡㅡ Maven 이나 Ant, Gradle 을사용하지못하는상황이있을수도있으니한번살펴보기나하자!! ( 기존프로젝트구성내역참조 ) 2. eclipse Spring Plug-In을활용한템플릿프로젝트자동구성 Eclipse에서 Spring Project를생성하려면당연한이야기겠지만플러그인을설치해야된다능...!! 필요한플러그인은두가지 Maven과 STS - Maven 플러그인설치 2.1 먼저이클립스마켓플레이스에접속! - 어려울것없음. 그냥메뉴를선택하면마켓플레이스가오픈됨 (Help -> Eclipse Marketplace)
- 누르면마켓플레이스창이오픈 ~ 거기서검색을위한단어입력 (find 항목에 maven 입력후엔터 ) -> 모를땐사람들이많으쓰는놈으로!! -> "Install " 버튼을클릭하면알아서설치 ~
- STS (Spring Tool Suite) 도같은방식으로설치
- 자이제템플릿프로젝트를수행하기위한모든준비가완료!!! - " 뭐가이리어려워!! " 라고할수있겠지만한번해놓으면다음부터는않해도되니까... 2.2 Spring 프로젝트를생성하기위해 "New Project" 에서 Spring 으로필터!! 2.3 우리는 Spring 기반의프로젝트를생성할예정이니 "Spring Templet Project" 를선택
2.4 웹프로젝트를생성할예정이니 Spring MVC Project 항목선택!! ( 첨엔필요한파일들을다운받으니인터넷이가능해야함ㅡㅡ ;;) 2.5 지정하고싶은프로젝트이름과패키지형태를입력한후 "Finish" 버튼을클릭하자!!
2.6 자 ~~ 이제돌려볼수있는스프링프로젝트가생성되었다. 참고사항 Spring Templet Project 생성후톰캣 7 버전으로구동시 jsp-api 가 2.1 로지정되어있어 JSP 호출시에러가발생합니다. 해결방안은 pom.xml 에설정된 jsp-api 관련항목을삭제하던가 2.2 버전으로올려줘야에러가발생하지않습니다. tomcat version - jsp spect - java version : http://tomcat.apache.org/whichversion.html 2.7 이제바라는대로프로젝트의구조를변경하면된다. 필수는아니지만해놓으면편리한것들
1. slf4j 를활용한 Logger 생성을편리하게해보자 - 매 Class 마다변경해야되는 Class 명칭 - LoggerHelper Class 를만들어손이많이가는부분을조금이라도줄여보자. As-Is : private static final Logger logger = LoggerFactory.getLogger( HomeController.class ); To-Be : private static final Logger logger = LoggerHelper.getLogger(); 2. AOP 설정 AOP 란? ->Aspect-Oriented Programming 의약자로관점지향프로그래밍 항목 Before advice After returning advice After throwing advice 설명 joinpoint 전수행예외처리없이종료되는시점수행예외처리가발생하는시점 After (finally) advice joinpoint 를빠져나갈때수행 ( 예외든아니든상관 X) Around advice 시작부터종료까지의상태를관장 - AOP 를설정하기위해 XML 에직접선언하는방식과 Annotation 을활용하는방식이있는데... 우리는간단하게 Annotation 을활용해봅시다. - Annotation 기반의 AOP 를설정하기위해서우리가해야할일?? -> 이한줄만입력해주시면됩니다. < aop:aspectj-autoproxy /> - 그러면 AOP 를사용하기위한모든준비는완료!!! AOP 를동작시키기위한 Class 를작성해봅시다. - 설정참조 Pointcut execution(public * *(..)) execution(* set*(..)) execution(* set*(..)) execution(* com.xyz.service.accountservice.*(..)) execution(* com.xyz.service.*.*(..)) execution(* com.xyz.service..*.*(..)) within(com.xyz.service.*) within(com.xyz.service..*) this(com.xyz.service.accountservice) target(com.xyz.service.accountservice) args(java.io.serializable) @target(org.springframework.transaction.annotation.transacti onal) 선택된 Joinpoints public 메소드실행이름이 set으로시작하는모든메소드명실행이름이 set으로시작하는모든메소드명실행 AccountService 인터페이스의모든메소드실행 service 패키지의모든메소드실행 service 패키지와하위패키지의모든메소드실행 service 패키지내의모든결합점 service 패키지및하위패키지의모든결합점 AccountService 인터페이스를구현하는프록시개체의모든결합점 AccountService 인터페이스를구현하는대상객체의모든결합점하나의파라미터를갖고전달된인자가 Serializable인모든결합점대상객체가 @Transactional 어노테이션을갖는모든결합점
@within(org.springframework.transaction.annotation.transacti onal) @annotation(org.springframework.transaction.annotation.tran sactional) @args(com.xyz.security.classified) bean(accountrepository)!bean(accountrepository) bean(*) bean(account*) bean(*repository) bean(accounting/*) bean(*datasource) bean(*datasource) 대상객체의선언타입이 @Transactional 어노테이션을갖는모든결합점 실행메소드가 @Transactional 어노테이션을갖는모든결합점 단일파라미터를받고, 전달된인자타입이 @Classified 어노테이션을갖는모든결합점 accountrepository 빈 accountrepository 빈을제외한모든빈 모든빈 이름이 'account' 로시작되는모든빈 이름이 Repository 로끝나는모든빈 이름이 accounting/ 로시작하는모든빈 이름이 datasource 나 DataSource 으로끝나는모든빈 JDBC 를활용한 DB 연결정보및트랜잭션설정 1. DB 접속정보설정 - DB 접속정보를설정하기위해서는 context-datasouce.xml 에 DB 접속정보를설정해주면됩니다. ( DBMS 종류에따라드라이버는다르게설정해야함 -> 저는오라클을사용할예정이어서 oracle.jdbc.driver.oracledriver 드라이버를사용합니다.) DataSource 를활용한선언 ( 간단하게접속정보를지정할수있지만설정파일에접속정보가모두나온다는점을주의해주세요 ) <bean id="datasource" class="org.apache.commons.dbcp.basicdatasource" destroy-method="close"> <property name="driverclassname" value="oracle.jdbc.driver.oracledriver"/> <property name="url" value=" jdbc:oracle:thin:@localhost:1521:orcl"/ > <property name="username" value="id"/> <property name="password" value="password"/> </bean> JNDI 방식의 Lookup 방식 (WAS 에설정된 DB 접속정보를그대로활용... WAS 벤더에따른설정방식이달라서불편한점도있습니다ㅡ _ ㅡ ) <bean id="datasource" class="org.springframework.jndi.jndiobjectfactorybean"> <property name="jndiname" value=" java:comp/env/jdbc/slipp" /> </bean> 2. 트랜잭션설정 - 트랜잭션을설정하기위해서 xml 기반의설정과 annotation 기반의설정모두가능합니다. - 여기서는 xml 기반의간단한설정을해보겠습니다.
- 트랜잭션선언과적용할 AOP 형태의결합으로간단한트랜잭션의적용이가능합니다. - 참고사항 속성설명사용예 isolation norollbackfor norollbackforclassname propagation readonly rollbackfor rollbackforclassname timeout Transaction 의 isolation Level 정의하는요소. 별도로정의하지않으면 DB 의 Isolation Level 을따름. 정의된 Exception 목록에대해서는 rollback 을수행하지않음. Class 객체가아닌문자열을이용하여 rollback 을수행하지않아야할 Exception 목록정의 Transaction 의 propagation 유형을정의하기위한요소 해당 Transaction 을읽기전용모드로처리 (Default = false) 정의된 Exception 목록에대해서는 rollback 수행 Class 객체가아닌문자열을이용하여 rollback 을수행해야할 Exception 목록정의 지정한시간내에해당메소드수행이완료되지않은경우 rollback 수행. -1 일경우 no timeout (Default = -1) @Transactional(isolation=Isolation.DEFA ULT) @Transactional(noRollbackFor=NoRoleBa cktx.class) @Transactional(noRollbackForClassName = NoRoleBackTx ) @Transactional(propagation=Propagatio n.required) @Transactional(readOnly = true) @Transactional(rollbackFor=RoleBackTx.c lass) @Transactional(rollbackForClassName= R olebacktx ) @Transactional(timeout=10) 3. SqlMapper (mybatis) 연동설정 - mybatis 는스프링과쉽게연동하여 sql 처리를수월하게해줄수있는 sql mapper 입니다. - DB 에접속하여처리를하기위해서는 host, id, password 등이필요하겠지만, 우리는이미 datasource 를활용해서해당정보를가져왔기때문에간단한선언만해주시면됩니다. - 그리고 mybatis 설정을위한설정파일과 SQL 을작성한 xml 파일경로를지정하시면되구요. - 전자정부표준프레임워크로인증받기위해서는전자정부에서제공하는 @Mapper 어노테이션을사용하셔야합니다.
- 그러기위해서다음과같은전자정부제공라이브러리를활용해서 Mapper 어노테이션을스캔하셔야합니다. (controller, service 를스캔한것처럼요 ) - 실제동작이되는내용은예제를보시면서동작해보도록하겠습니다. 개발 GoGo - 시간을산정해보고, 시간여유가있다면직접구현해보겠지만... 시간이안된다면구현된소스를한번리뷰하는정보도로마무리 1. 간단한형태의 CRUD 기능이구현된기능시연 2. 웹에서기능테스트 가능하다면요새많이사용되는 RIA 형태의화면을시연하는것도고민해봅시다. (Grid, Tree 구성같은?)