spring 3 이후부터 지원이 되는 기능이다.
본인이 주로 쓰는 경우에는 특정 parameter값을 페이지 전환하면서 유지를 해야 할 경우이다.
예를들어
상단 메뉴를 누르고 메뉴의 focus를 유지하고자 할경우 보통
http://URL?gnb=board
형식으로 주면서 특정 메뉴의 모든 페이지에 gnb=board라는 값이 따라붙게 된다.
위와같은 url을 PathVariable 어노테이션을 사용하게 된다면
http://URL/board
와 같은 식으로 변경이 가능하다
물론 URL 뒤에만 붙이는건 아니고 URL 중간에 접목도 가능하다.
예를 들도록 해보자
1) 일반 GET방식으로 서버에서 값 확인하기
* JAVA 샘플코드
@RequestMapping("/test") public void test(HttpServletRequest request){ System.out.println("================"); System.out.println("get방식 parameter 값:"+request.getParameter("menu")); System.out.println("================"); }
* 호출화면 + 콘솔값
2) @PathVariable 이용하여 서버에서 값 확인하기
* JAVA 샘플코드
@RequestMapping("/test/{menu}") public void test(@PathVariable String menu){ System.out.println("================"); System.out.println("get방식 parameter 값:"+menu); System.out.println("================"); }
* 호출화면 + 콘솔값
결과는 동일...
어떤가 PathVariable 어노테이션을 적용한게 좀 더 깔끔해 보이지 않는가~~
결과값은 똑같고 PathVariable 는 하나 그이상도 가능하다.
다만 주의할점은 null이나 공백값이 들어가는 parameter라면 적용하지 말도록 하자
인식을 못하니... ㅎㅎㅎ
도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!
스프링3(Spring3) - RedirectAttributes를 이용하여 리다이렉트 POST 방식으로 데이터 전송하기 (0) | 2014.07.30 |
---|---|
스프링3(Spring3) - @ResponseBody + jackson을 이용하여 심플하게 JSON 구현하기 (0) | 2014.07.30 |
스프링3(Spring3) - 인터셉터(interceptor) 설정 (4) | 2014.07.28 |
스프링3(Spring3) - SQL 쿼리 출력을 위한 로그레벨 설정 (0) | 2014.07.27 |
스프링3(Spring3) - 리소스(resource file) 및 favicon.ico 설정 (0) | 2014.07.25 |
여태까지 작업을 해왔다면 아마 js/html/css 또는 이미지 파일등의 확장자가 존재하는
리소스 파일들은 웹페이지에 뿌려지지 않을것이다.
임의로 controller호출을 통하여 웹페이지를 하나 띄워보도록 하겠음.
@RequestMapping(value="/resourceTest") public String resourceTest(){ return "resourceTest"; }
다음으로 return 문자열과 동일한 resourceTest.jsp를 WEB-INF -> view 디렉토리내에 생성하고 다음과 같이 body태그내에 img태그를 추가해보자
<img src="/test.png" width="100" height="100" />
이미지는 아무이미지 파일로 해서 webapp디렉토리 내에 넣고 확인해보면 다음과 같이 이미지 화면이 깨질것이고 콘솔에 No mapping found~~~~ 라는 경고문구가 뜰것임
이부분을 해결하기위하여 다음과같이 코드를 mvc-config.xml 에 추가해주도록 하자
<mvc:resources mapping="/resources/**" location="/resources/" />
저렇게 코드를 추가해주었다면 webapp밑에 resources라는 디렉토리를 하나생성후, 아까 깨진 이미지를 해당 폴더로 옮겨주도록 하자
추가해주고 물론, jsp페이지의 이미지 태그 경로를 변경하는거 잊지 말기로 하자.
실행 화면을 보도록 하자
출력이 잘되었다.
쉽게 생각해서 확장자가 존재하는 놈들은 resources 디렉토리내에 모두 넣어주면 사용이 가능하다!!
물론 꼭 resources디렉토리가 아니여도된다 xml명칭에 맞춰서 경로명을 변경해주면 될듯...
★ 추가로 favicon.ico 를 등록을 할때역시 mvc:resources로 설정을 잡아주면 될것이다.
webapp 디렉토리 바로밑에 favicon.ico 라는 아이콘을 넣어주고 다음과 같이 잡아주면 된다.
<mvc:resources mapping="/favicon.ico" location="/favicon.ico" />
도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!
스프링3(Spring3) - RedirectAttributes를 이용하여 리다이렉트 POST 방식으로 데이터 전송하기 (0) | 2014.07.30 |
---|---|
스프링3(Spring3) - @ResponseBody + jackson을 이용하여 심플하게 JSON 구현하기 (0) | 2014.07.30 |
스프링3(Spring3) - 인터셉터(interceptor) 설정 (4) | 2014.07.28 |
스프링3(Spring3) - SQL 쿼리 출력을 위한 로그레벨 설정 (0) | 2014.07.27 |
스프링3(Spring3) - @PathVariable를 이용하여 parameter를 url형식으로 받기 (0) | 2014.07.26 |
지난 포스팅에 이어서 service 영역에 트랜잭션 처리를 하고자 한다.
2014/07/23 - [스프링연동하기/spring3 mybatis 설정] - 스프링(Spring)3 - mybatis 연동(1)
@transactional인가 어노테이션으로 트랜잭션을 주는 방식도 있긴하지만, xml 설정을 함으로
service영역에서의 트랜잭션 처리를 하고자한다.
현재 방식으로 insert 쿼리 여러개를 선언하고 중간에 오류를 발생시키면 오류나기 전에 있던
데이터들은 insert가 되어진다.
이부분을 막고자 트랜잭션설정을 주려고 한다.
뭐 트랜잭션 신경 안쓰시려고는 분들은 이번 포스팅을 넘기셔도 무관함..
트랜잭션 처리를위한 추가 dependency를 pom.xml에 등록해주도록 하자
<dependency> <groupId>aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.5.3</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>2.1_3</version> </dependency>
기존 mvc-config.xml에 정의해주었던 component-scan을 다음과 같이 변경해주도록 하자
수정전
<context:component-scan base-package="com.spring.web"/>
수정 후
<context:component-scan base-package="com.spring.web" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan>
이어서 application-config.xml에 내용 추가 및 수정을 해주도록 하자
<bean> 태그가 아닌 전체 xml을 감싸고 있는 <beans>태그가 있을 텐데 다음과 같이
변경 해주도록 하자
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
aop 부분과 tx 부분만 추가 되었다.
이제 트랜잭션 설정을 해주도록 하자
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <aop:config proxy-target-class="true"> <aop:pointcut id="serviceOperation" expression="execution(public * com.spring.web..service.*Service.*(..))" /> <aop:advisor id="transactionAdvisor" pointcut-ref="serviceOperation" advice-ref="txAdvice"/> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" rollback-for="Exception"/> <tx:method name="update*" rollback-for="Exception"/> <tx:method name="remove*" rollback-for="Exception"/> </tx:attributes> </tx:advice>
위와같이 해주었다면 트랜잭션 설정이 모두 마무리가 되었다.
임의의 테이블을 만들고 트랜잭션 테스트를 해보도록 하자
※ mysql 경우 table type이 innodb여야 트랜잭션처리가 적용이된다.
create table 샘플코드
CREATE TABLE `test` ( `test_column` varchar(5) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
테이블 생성이 완료 되었다면 이제는 클래스에 controller/service/dao를 추가해주도록 하자
지난 포스팅에는 그냥 web내부에 controller/dao 패키지를 생성하였는데
web 패키지에 추가로 새로운 패키지를 생성하여 내부에 controller/service/dao를 작성하도록 하겠음.
패키지 구성은 다음과 같음.
다음구조와 같이 만들었다면 controller/service/dao 부분에 대하여 샘플 코드를 작성하도록 하자
TestController.java 코드
@Controller public class TestController { @Autowired private TestService service; @RequestMapping(value="/saveQuery") public void saveQuery(){ try { service.saveQuery(); } catch (SQLException e) { e.printStackTrace(); } } }
TestService.java 코드
@Service public class TestService { @Autowired private TestDao dao; public void saveQuery() throws SQLException { Map<String, String> map = null; map = new HashMap<String, String>(); map.put("test", "123"); dao.saveQuery(map); map = new HashMap<String, String>(); map.put("test", "1231111111111111"); dao.saveQuery(map); map = new HashMap<String, String>(); map.put("test", "123"); dao.saveQuery(map); } }
TestDao.java코드
@Repository public class TestDao { @Autowired private SqlSession sql; public void saveQuery(Map<String, String> map) throws SQLException { sql.insert("sql.saveQuery",map); } }
마지막으로 sql.xml에 insert 쿼리 하나를 작성해주도록 하자
<insert id="saveQuery" parameterType="java.util.Map"> INSERT INTO test VALUES(#{test}) </insert>
위의 로직상 설명을 한다면 return 타입은 없어서 우선적으로 웹페이지는 뜨지 않을것이다.
그리고 service 부분에 총 3번의 dao를 호출하는데 test 테이블의 test_column 컬럼의 제한수가
총 5글자가 들어갈수 있다.
즉, 첫번째 insert는 정상적으로 테이블에 등록되고 두번째 insert에는 exception이 발생하여
에러를 웹이랑 콘솔에 뿜을것이다.
그리고는 테이블에 데이터가 등록되지 않은것을 확인 하였다면 정상적으로 트랜잭션 처리가 된것임.
※ 주의할점
application-config.xml 에 tx:advice태그내에 tx:method 가 몇가지 있는데
tx:method의 name을 보면 save* << 이런식으로 주었다.
service의 메서드 시작문구가 save로 시작된다면 트랜잭션 적용을 한다는 의미이다.
만약 본인이 abcTest() << 라는 메서드로 트랜잭션 처리를 하고 싶다면
다음과 같이 태그 추가를 해주면 될것이다.
<tx:method name="abc*" rollback-for="Exception"/>
그리고 service / dao 클래스에 try/catch를 주지말고 throws SQLException 형식으로 처리를
해준다음 controller에서 try{}catch{}로 잡아주어야 할것이다.
★ 추가된 내용 ★
간혹가다가 트랜잭션 처리가 안될경우 mvc-config.xml 에 다음처럼 aop 추가를 해주도록 하자
<aop:config proxy-target-class="true"> <aop:pointcut id="controllerOperation" expression="execution(public * com.spring.web..controller.*Controller.*(..))" /> </aop:config>
도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!
스프링3(Spring3) - ibatis 연동하기 (0) | 2014.08.20 |
---|---|
스프링3(Spring3) - mybatis 연동(3) 다중DB 접속 + 트랜잭션 설정 (6) | 2014.07.28 |
스프링3(Spring3) - mybatis 연동(1) (6) | 2014.07.23 |
이번 포스팅은 spring과 mybatis db 연동을 해볼 예정임
maven에 익숙치 않아서인지 삽질좀 한듯 -0-ㅋㅋㅋ
우선은 pom.xml 에 다음과 같이 dependency들을 추가해주도록 하자
<!-- add maven --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.7</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.31</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring-framework.version}</version> </dependency>
이어서 resources -> spring -> application-config.xml 에 다음과 같이 소스 추가를 하자
<context:component-scan base-package="com.spring.web"/> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/db명" /> <property name="username" value="아이디" /> <property name="password" value="패스워드" /> </bean> <!-- SESSIONFACTORY 설정 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- ibatis와 다르게 sql디렉토리에 xml 추가만 해주면 별도추가없이 알아서 xml내의 쿼리 인식 --> <property name="mapperLocations" value="classpath*:sql/**/*.xml" /> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory" /> </bean>
그리고 resources내에 sql 폴더를 생성 후 다음 파일을 추가해주자
HelloWorldController클래스에 코드 추가
@Autowired private SpringDao dao; @RequestMapping("/queryTest") public void queryTest(){ try { ArrayList<Map<String, Object>> list = dao.queryTest(); if(list != null && list.size() > 0){ for(Map<String, Object> map : list) { Set key = map.keySet(); for (Iterator iterator = key.iterator(); iterator.hasNext();) { String keyName = (String) iterator.next(); String valueName = (String) map.get(keyName); System.out.println(keyName +" = " +valueName); } } } } catch (SQLException e) { System.out.println(e.toString()); } }
com.spring.web.dao 패키지 생성 후 내부에 SpringDao.java 클래스를 생성하도록 하자
package com.spring.web.dao; import java.sql.SQLException; import java.util.ArrayList; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @Repository public class SpringDao { @Autowired private SqlSession sql; @SuppressWarnings("unchecked") public ArrayList<Map<String, Object>> queryTest() throws SQLException { return (ArrayList)sql.selectList("sql.queryTest"); } }
이걸로 jdbc 연동이 끝났다.
완전 심플하지 않은가~~!!
물론 transaction 처리는 제외한 예제이다
위 소스를 실행후 웹페이지에 화면은 나오지 않을것이다.
Console에서 다음 하단 그림과 같이 값이 찍혀 나온다면 정상적으로 출력된다면 db연동은 끝~~
원래는 interface 만들고 implements 받고 해야하는데 귀찮음..
그냥 심플하게 연동만 해보는것임
다음 포스팅은 transaction 관한 설정을 해보도록 하겠음!!
스프링3(Spring3) - ibatis 연동하기 (0) | 2014.08.20 |
---|---|
스프링3(Spring3) - mybatis 연동(3) 다중DB 접속 + 트랜잭션 설정 (6) | 2014.07.28 |
스프링3(Spring3) - mybatis 연동(2) 트랜잭션설정 (2) | 2014.07.25 |
이번 포스팅에서는 웹소스에서 서버로 파일 전송을 위한 작업을 진행하기로 하겠음.
우선 파일업로드에 필요한 jar라이브러리를 추가하도록 하자
일반 웹프로젝트의경우 lib 폴더에 라이브러리를 추가하면 되지만 메이븐을 이용할 경우 pom.xml 파일에 dependency태그를 추가해주면 된다.
pom.xm의 dependencies 태그내에 다음 태그를 추가해주도록 하자
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
이어서 WEB-INF -> mvc-config.xml 파일내에 다음과 같은 빈을 등록해주도록 하자
파일처리에 필요한 xml 설정이다.
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
이제 파일처리에 대한 준비과정은 끝이 났다.
이제 HelloWorld 클래스에 컨트롤러 맵핑을 해주도록 하자
@RequestMapping("/formFile") public String formFile(){ return "formFile"; }
이어서 return 페이지인 formFile.jsp 파일을 view 디렉토리내에 생성을 한후 다음코드를 body
태그내에 추가하도록 하자. 파일처리를 위해 form 태그내에 enctype을 추가해준다.
<form action="/requestFile" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="서버전달"/> </form>
기존에 작성되어있는 RequestModel 모델클래스에 MultipartFile 타입의 변수와
getter/setter을 정의해주자
private MultipartFile file; public MultipartFile getFile() { return file; } public void setFile(MultipartFile file) { this.file = file; }
마지막으로 HelloWorld 컨트롤러에 파일정보를 받기위한 컨트롤러 맵핑을 추가해주자
@RequestMapping("/requestFile") public void requestFile(RequestModel model){ System.out.println("파일명:"+model.getFile().getOriginalFilename()); System.out.println("파일사이즈:"+model.getFile().getSize()); }
만약 console에 오류가 발생한다면 pom.xml -> Run As -> Maven Install 실행한번 해주도록
합시다.
자, 이제 url 호출 후, 파일첨부 후 콘솔로 파일정보를 확인해보도록 하겠다.
파일태그 폼화면
파일정보
도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!
스프링3(Spring3)MVC 연동 (3) - 서버값 웹페이지로 전송하기 (0) | 2014.07.22 |
---|---|
스프링3(Spring3) MVC 연동 (2) - 폼값 전송 + 인코딩 설정 (7) | 2014.07.22 |
스프링3(Spring3) MVC 연동 (1) - STS 다운로드 및 헬로월드 출력하기 (6) | 2014.07.22 |