이번에는 svn server 설치를 linux에 해보고자 한다
그냥 간단하게 yum으로 설치를 하겠다 ㅋㅋ
[root@localhost ~]# yum -y install subversion . . . Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : apr-1.4.8-3.el7.x86_64 1/4 Installing : apr-util-1.5.2-6.el7.x86_64 2/4 Installing : subversion-libs-1.7.14-6.el7.x86_64 3/4 Installing : subversion-1.7.14-6.el7.x86_64 4/4 Verifying : subversion-1.7.14-6.el7.x86_64 1/4 Verifying : apr-1.4.8-3.el7.x86_64 2/4 Verifying : subversion-libs-1.7.14-6.el7.x86_64 3/4 Verifying : apr-util-1.5.2-6.el7.x86_64 4/4 Installed: subversion.x86_64 0:1.7.14-6.el7 Dependency Installed: apr.x86_64 0:1.4.8-3.el7 apr-util.x86_64 0:1.5.2-6.el7 subversion-libs.x86_64 0:1.7.14-6.el7 Complete! [root@localhost ~]#
svn 설치가 서버에 완료되었으면 이어서 svn 디렉토리를 생성하도록 하자
본인은 /usr/local/svn이라고 디렉토리를 생성한후 test repository를 생성해주도록 하자
[root@localhost ~]# mkdir /usr/local/svn [root@localhost ~]# svnadmin create --fs-type fsfs /usr/local/svn/test
svn클라이언트 계정할당을 위한 svnserve.conf를 설정해보도록 하자
[root@localhost ~]# vi /usr/local/svn/test/conf/svnserve.conf
svnserve.conf의 내용중, 다음 값의 주석 해제후, 값을 변경해주도록 하자
[변경전]
# anon-access = read # auth-access = write # password-db = passwd
[변경후]
anon-access = none auth-access = write password-db = passwd
저장 후 passwd파일에 계정추가를 하도록 하자
[root@localhost ~]# vi /usr/local/svn/test/conf/passwd
[users]하단에 본인이 사용할 아이디 = 패스워드를 정의하고 저장을 하도록 하자
[users] test = 1234
설정이 끝났으므로 svn서버를 실행하도록 하자
[root@localhost ~]# svnserve -d -r /usr/local/svn
정상동작되는지 확인이 된다면 설치가 완료된 것이다.
[root@localhost ~]# ps -ef | grep svnserve root 3405 1 0 00:10 ? 00:00:00 svnserve -d -r /usr/local/svn root 3415 3196 0 00:20 pts/1 00:00:00 grep --color=auto svnserve [root@localhost ~]# netstat -an | grep 3690 tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN
잘 되었다면 우선 3690포트를 방화벽에서 해제해주도록 하자 -_-;;
CentOS 7 은 iptables를 안쓰고 firewalld라는게 생겨서 뭔가 번거로움..;;
해제해주었다면 이클립스에서 한번 접속해보도록 하자
URL은 svn://아이피/test 라고 접속시 하단과 같이 뜬다면 정상적으로 svn 접속이 완료 된것임
설치 완료!!
지난 포스팅에는 SPRING + MYBATIS 접속 및 트랜잭션 설정에 대한 포스팅을 하였음
2014/07/23 - [스프링연동하기/spring3 mybatis 설정] - 스프링3(Spring3) - mybatis 연동(1)
2014/07/25 - [스프링연동하기/spring3 mybatis 설정] - 스프링3(Spring3) - mybatis 연동(2) 트랜잭션설정
이번시간에는 다중 DB 접속 및 트랜잭션 처리를 설명하고자 한다.
( 설정이 정상 작동하지만 100% 옳은 방법이라고는.... )
해당 포스팅은 DBMS 종류가 틀리더라도 접속이 가능하며 트랜잭션 DBMS 종류와 무관하게 적용이 된다.
우선은 sqlsession에 대한 구분을 위한 어노테이션(@Resource)을 주어야 하므로 필요한
라이브러리 등록을 위해 pom.xml에 다음 dependency를 추가하도록 하자
<dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.2</version> </dependency>
여러 dbms를 사용하려면 oracle/mssql 등 라이브러리를 pom.xml에 등록하여야 하는데 본인은 mysql의 db명만 바꿔서 연동을 할것이므로
다른 라이브러리가 필요하신 분들은 dbms 종류에 따라 라이브러리를 등록하도록 하자.
mssql jdbc 라이브러리등록과 oracle jdbc의 pom.xml dependency등록은 다음 포스팅때 등록한후 링크 걸도록 하겠음.
다음으로 application-config.xml에 기존설정에 추가로 다음 태그를 추가하도록 하자
<bean id="dataSource2" 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> <bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource2" /> <property name="mapperLocations" value="classpath*:sql/**/*.xml" /> </bean> <bean id="sqlSession2" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory2" /> </bean> <bean id="transactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource2"/> </bean> <tx:advice id="txAdvice2" transaction-manager="transactionManager2"> <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>
그냥 기존 태그 Ctrl + C/V 해서 추가한다음 id값과 ref 값만 변경해주면 된다.
기존 값중에 뒤에 2만 추가로 붙여주고 datasource의 정보만 변경하였다.
마지막으로 aop:config 태그내의 aop:advisor태그를 추가해주도록 하자
그럼 aop:config태그의 값은 다음과 같이 될것임
<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:advisor id="transactionAdvisor2" pointcut-ref="serviceOperation" advice-ref="txAdvice2"/> </aop:config>
이걸로 다중 db접속 및 dbms 전체 트랜잭션이 완료되었다.
기존 같은 쿼리를 이용하여 다른 db에 접속이 되는지 먼저 확인하도록 하자
기존에는
@Autowired private SqlSession sql;
와같이 되었지만
data resource가 두가지로 추가되어서 서버 시작시, 오류가 발생할것이다
application-config.xml의 bean태그중, 클래스가 org.mybatis.spring.SqlSessionTemplate 의 아이디를 설정을 해주어야 한다 .
다음과 같이 두개의 sqlsession을 만든후 resources 어노테이션으로 명칭을 구분해주도록 하자
@Autowired @Resource(name="sqlSession") private SqlSession sql; @Autowired @Resource(name="sqlSession2") private SqlSession sql2;
다음으로는 같은 쿼리를 호출하는 메서드 2개를 만들도록 하자
(기존 show tables 쿼리를 실행하는 쿼리 xml 호출하는것임)
@SuppressWarnings("unchecked") public ArrayList<Map<String, Object>> queryTest() throws SQLException { return (ArrayList)sql.selectList("sql.showtable"); } @SuppressWarnings("unchecked") public ArrayList<Map<String, Object>> queryTest2() throws SQLException { return (ArrayList)sql2.selectList("sql.showtable"); }
그렇다면 기존 /queryTest 컨트롤러내의 다음과같이 변경을 해보도록 하자
@RequestMapping(value="/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); } } } System.out.println("==============================="); ArrayList<Map<String, Object>> list2 = dao.queryTest2(); if(list2 != null && list2.size() > 0){ for(Map<String, Object> map : list2) { 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 (Exception e) { e.printStackTrace(); } }
한번 코드를 실행해보도록 하자
※ 실행화면
설정 DB내의 테이블이 콘솔에 정상적으로 찍혀서 나왔다면 다중 DB 설정이 완료된것임.
이번엔 트랜잭션 처리도 확인해보도록 하자
설정 DB에 다음 테이블을 각각 생성해보도록 하자
(기존 /saveQuery 테이블과 동일)
CREATE TABLE `test` ( `test_column` varchar(5) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8
controller - service - dao - query xml까지 다음과 같이 만들어 보도록하자
controller
@RequestMapping(value="/saveQuery") public void saveQuery(){ try { service.saveQuery(); } catch (SQLException e) { e.printStackTrace(); } }
service
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", "123"); dao.saveQuery(map); map = new HashMap<String, String>(); map.put("test", "123"); dao.saveQuery(map); map = new HashMap<String, String>(); map.put("test", "123"); dao.saveQuery2(map); map = new HashMap<String, String>(); map.put("test", "998"); dao.saveQuery2(map); map = new HashMap<String, String>(); map.put("test", "123"); dao.saveQuery2(map); }
dao
public void saveQuery(Mapmap) throws SQLException { sql.insert("sql.saveQuery",map); } public void saveQuery2(Map map) throws SQLException { sql2.insert("sql.saveQuery",map); }
query xml
<insert id="saveQuery" parameterType="java.util.Map"> INSERT INTO test VALUES(#{test}) </insert>
위 예로는 정상적으로 2개의 테이블에 데이터가 정상적으로 들어갈것이고, service에서
map.put -> value값을 5자 이상주게되면 오류발생하여 테이블 두군대에 모두 데이터가 롤백되는것을 확인할 수 있을것이다.
도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!
스프링3(Spring3) - ibatis 연동하기 (0) | 2014.08.20 |
---|---|
스프링3(Spring3) - mybatis 연동(2) 트랜잭션설정 (2) | 2014.07.25 |
스프링3(Spring3) - mybatis 연동(1) (6) | 2014.07.23 |
이번 포스팅은 인터셉터에 대한 설정을 작성하려고 한다.
말그대로 spring 의 controller 호출전에 동작하는 방식으로써 보통은 로그인 체크유무가 필요한
곳에서 주로 사용함
예를 들어 게시판의 글쓰기 화면을 이동후, 한참동안 아무런 동작은 안하게 되면 세션이 제거되어 보통 기록해야 할 아이디 또는 이름같은 세션에 들어가있는 정보들이 증발하게된다.
이럴경우 글쓰기를 하게 되면 테이블에는 일반 데이터들은 들어가있거나 혹은 아이디/이름 컬럼을 not null로 생성하였다면 오류발생이 일어날것이다.
가끔 세션이 증발하여 null값이 아닌 공백이 들어갈경우도 있어서 문제가 발생한다.
이럴때는 세션체크를 한 후 세션이 제거된 상태일경우에는 게시물을 등록할 수 없게 해야 한다.
또는 마이페이지의 메뉴 혹은 브라우저에 남아있는 url로 접근을 할 경우에도 세션이 존재하지
않으면 페이지 접근을 막아야 한다.
예전에는 스크립트로 로그인 체크를 하거나 각페이지마다 if문을 주어 로그인 유무를 판단하였다.
반면에 인터셉터설정은 모든페이지에 적용을 해주지 않아도 되며 xml설정과 class 파일 하나 추가로 인하여 해결이 된다.
예를들어보자
가상의 시나리오를 작성해보도록 하자
게시판 글쓰기페이지(/board_write)는 로그인한 사용자만 접근이 가능하다
만약 로그인하지 않은 사용자가 글쓰기페이지 접근할 경우 로그인 페이지(/login)로 이동시킨다
위의 시나리오라 가정한다면
세가지 컨트롤러가 필요할 것이다.
1. 로그인화면 : /login controller
2. 로그인처리 : /findlogin controller
3. 글쓰기 페이지 : /board_write controller
그런다음 인터셉터 클래스 하나를 생성을 해야한다.
위 시나리오대로 진행을 해보도록 하자
1. 로그인화면을 출력할 컨트롤러 + jsp 페이지
실제로 로그인을 구현하거나 글쓰기 폼을 화면에 띄우는건 아님.
@RequestMapping(value="/login") public String login(){ return "login"; }
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 로그인 페이지입니다. </body> </html>
2. 글쓰기 페이지 컨트롤러 + jsp 페이지
@RequestMapping(value="/board_write ") public String board_write (){ return "board_write"; }
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 글쓰기 페이지 입니다. </body> </html>
3. 세션 생성할 임의의 컨트롤러 해당 컨트롤러는
단순 세션 생성을 위한 것이므로 별도의 jsp 페이지 불필요
@RequestMapping(value="/findlogin") public void findlogin(HttpServletRequest request){ request.getSession().setAttribute("logininfo", true); }
모두 작성 완료 하였으면 이제는 mvc-config.xml 설정부분에 다음과 같이 추가해주도록 하자 위치는 본인 마음대로..
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/board_write"/> <bean class="com.spring.interceptor.InterCeptor"/> </mvc:interceptor> <!-- 추가로 여러개의 인터셉터 설정 가능 <mvc:interceptor> <mvc:mapping path="/admin/board_write"/> <bean class="com.spring.interceptor.AdminInterCeptor"/> </mvc:interceptor> --> </mvc:interceptors>
위의 인터셉터 설정을 확인해보면 /board_write라는 mapping을 받았을경우, 컨트롤러 호출전, InterCeptor 클래스를 먼저 호출한다라고 생각하면 될것임
여러가지의 인터셉터 설정이 가능함
그럼 이제 InterCeptor 클래스를 해당 패키지에 맞추어 생성을 하도록 하자
package com.spring.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; public class InterCeptor extends HandlerInterceptorAdapter{ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){ try { //logininfo 세션값이 널일경우 if(request.getSession().getAttribute("logininfo") == null ){ //로그인페이지로 redirect response.sendRedirect("/login"); return false; } } catch (Exception e) { e.printStackTrace(); } //널이 아니면 정상적으로 컨트롤러 호출 return true; } }
이제 인터셉터 설정이 완료되었다
다음 동작을 실행해보도록 하자
1. 강제로 "/board_write" 컨트롤러 호출 -> "/login" 컨트롤러 페이지로 가는지확인
2. "/findlogin" 컨트롤러 호출 후 "/board_write " 컨트롤러 다시 호출하여 board_write.jsp의 문구가 제대로 보이는지 확인
그럼 실행을 해보도록 하자
1) 세션이 존재하지 않는 상태에서 /board_write 컨트롤러 호출
2) 로그인페이지로 강제 이동
3) 세션생성 컨트롤러 호출
4) 세션이 생성됨(jsp 페이지는 필요없어서 나는 404 오류임)
5) 세션이 생성되었으므로 다시 한번 /board_write 컨트롤러 호출
6) 이번에는 정상적으로 /board_write 컨트롤러 접근 가능
확인결과 인터셉터가 잘 동작하는 것을 확인하였다.
샘플을 토대로 관리자/사용자 세션체크 및 세션이 꼭 필요한 페이지 체크등에 대하여 응용을 하면 될것이다.
도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!
스프링3(Spring3) - RedirectAttributes를 이용하여 리다이렉트 POST 방식으로 데이터 전송하기 (0) | 2014.07.30 |
---|---|
스프링3(Spring3) - @ResponseBody + jackson을 이용하여 심플하게 JSON 구현하기 (0) | 2014.07.30 |
스프링3(Spring3) - SQL 쿼리 출력을 위한 로그레벨 설정 (0) | 2014.07.27 |
스프링3(Spring3) - @PathVariable를 이용하여 parameter를 url형식으로 받기 (0) | 2014.07.26 |
스프링3(Spring3) - 리소스(resource file) 및 favicon.ico 설정 (0) | 2014.07.25 |
이번 포스팅은 spring - mybatis 연동이 된상태로 콘솔창에 sql 쿼리의
parameter 및 result 데이터를 확인하고자 할때 로그레벨을 설정하는 것이다.
기존까지 해온 연동설정에서 추가로 변경만 해주면 된다.
resources 디렉토리내에 logback.xml 이란 파일이 있을텐데 맨 밑으로 내려보면
root 레벨이 info로 되있을텐데 레벨은 info -> debug로 변경해주도록 한 후
쿼리가 뽑히는지 확인하자
그럼 기존 쿼리 테스트를 위해 만들어놓은 컨트롤러 호출을 한후 콘솔에 쿼리 로그가 정상적으로 뽑히는지 확인해보자
위 화면처럼 쿼리로그가 정상적으로 찍히는지 확인하였다.
query = show tables
parameter = 입력값이 없으므로 패스
return data = total : 2
sql 쿼리출력관련은 개발모드에서만 사용하고 상용서버 적용시 로그레벨을 기존 info로 변경하도록 하자
log 설정에 대한 부분은 본인이 제대로 파악하는게 아니므로 시간이 날때 log 레벨 및 설정에 대한 포스팅을 하도록 하겠음.
도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!
스프링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) - @PathVariable를 이용하여 parameter를 url형식으로 받기 (0) | 2014.07.26 |
스프링3(Spring3) - 리소스(resource file) 및 favicon.ico 설정 (0) | 2014.07.25 |
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 |