이번장은 Spring3 + MyBatis 연동하여 DB에서 데이터 조회하는 테스트를 해보도록 하겠습니다.
MySQL JDBC를 이용하여 연동법을 설명하겠습니다.
Spring + Mybatis 연동을위한 pom.xml의 dependency를 등록해주세요
<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>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring-framework.version}</version> </dependency>
DBMS 별로 라이브러리 연동법은 하단을 참고해주세요.
2014/11/14 - [개발에필요한연동법/스프링연동] - Spring3 Maven을 이용하여 pom.xml에 oracle,mysql,mssql jdbc 라이브러리 등록하기
/resources/spring/application-config.xml 파일
beans태그사이에 다음과 같이 코드추가 해주세요
<context:component-scan base-package="com.spring"/> <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://아이피:포트/DB명" /> <property name="username" value="DB계정" /> <property name="password" value="DB패스워드" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath*:query/**" /> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory" /> </bean>
mapperLocations 속성값에 따라 다음과 같이 디렉토리를 생성해줍니다.
"/resources/query/"
디렉토리 생성이 완료되었으면
해당디렉토리에 "파일명.xml"을 생성하도록 합니다.
저는 임의로 "query.xml" 이라고 생성하였습니다.
다음코드를 붙여넣기 해주세요
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="query"> <select id="test" resultType="String"> SELECT 'test' </select> </mapper>
이제는 DAO에대한 interface/class 파일을 생성해야하는데
저같은 경우는 패키지 + 파일을 하단처럼 생성하였습니다.
인터페이스는 생성하지 않고도 db연동은 가능하지만
대부분 생성하는 관계로 연결지어서 진행하겠습니다.
public interface StudyDao { public void test() throws SQLException; }
@Repository public class StudyDaoImpl implements StudyDao { @Autowired private SqlSession query; @Override public void test() throws SQLException { query.selectOne("query.test"); } }
위와 같이 선언해주시면 Spring + mybatis 연동은 끝난겁니다.
※ DAO 클래스에 @Repository 어노테이션을 필수로 작성해주셔야 합니다.
테스트를 위한 컨트롤러 코드를 작성해보도록 하겠습니다.
@Autowired private StudyDao studyDao;
StudyDao 인터페이스에 autowired 어노테이션을 선언합니다.
@RequestMapping("/test") public void test(){ try { studyDao.test(); } catch (Exception e) { e.printStackTrace(); } }
샘플 코드 작성이 완료 되었다면 한번 실행해보도록 하겠습니다.
상단 붉은색 네모친 부분이 이클립스의 콘솔부분입니다.
오류도 안나오고 어떠한 진행도 되지않아 동작이 되는지 확인이 되지 않습니다.
간단하게 DB로그를 출력해보고자 로그레벨을 변경해주도록 하겠습니다.
/resources/logback.xml 파일을 열어봅니다.
<root level="info"> <appender-ref ref="console"/> </root>
위와같은 태그가 존재할텐데 level값을 보시면 "info" 라고 되어있습니다
"info" -> "debug"로 레벨 변경을 해주도록 합니다
저장 후 재실행을 컨트롤러를 재호출 해보도록 하겠습니다.
정상적으로 query.xml에 정의한 쿼리문이 호출되고
결과값까지 출력되는것을 확인하였습니다.
다음 포스팅은 트랜잭션 설정에 대하여 포스팅 해보도록 하겠습니다.
by 개발로짜
Spring3 + Mybatis 여러개 Datasource 연동법(다중 트랜잭션 포함) (0) | 2014.11.16 |
---|---|
Spring3 + Mybatis연동에 추가로 트랜잭션 설정 하여 실패시 Rollback 처리하기 (2) | 2014.11.14 |
Spring3 Maven을 이용하여 pom.xml에 oracle,mysql,mssql jdbc 라이브러리 등록하기 (0) | 2014.11.14 |
Spring3 인터셉터와 세션을이용하여 로그인 처리해보기 (2) | 2014.11.12 |
Spring3 RedirectAttributes 사용한 redirect POST 전송법 (0) | 2014.11.11 |
Spring + ibatis/mybatis 연동에 필요한 JDBC 라이브러리 파일들을
각 DBMS별로 pom.xml에 등록을 위한 포스팅 해보도록 하겠습니다.
연동하고자 하는 JDBC 라이브러리는
MySQL, Oracle, MSSQL JDBC를 메이븐을 통해서 받도록 하겠습니다.
먼저 Maven에서 기본적으로 제공해주는 MySQL JDBC 라이브러리를 등록해보도록 하겠습니다.
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.31</version> </dependency>
상단 코드를 작성하고 저장을 해주셨다면
Properties -> Java Build Path -> Libraries탭에서 Maven Dependencies를 확인 해보시면
MySQL JDBC가 등록된 것을 확인하실 수 있을겁니다.
ojdbc jar 파일을 Maven Repository 사이트에서 검색하여 나오는 dependency로는 라이브러리 다운로드를 받을 수 없습니다.
<dependency> <groupId>ojdbc</groupId> <artifactId>ojdbc</artifactId> <version>14</version> </dependency>
"Missing artifact ojdbc:ojdbc:jar:14" 에러가 날 것이므로
상단 코드 대신 다른 dependency를 등록 해주도록 합니다.
<dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc14</artifactId> <version>10.2.0.4.0</version> </dependency>
위코드를 작성하셔도 아직은 dependency 코드부분에 여전히
"Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0" 오류가 나타날 것입니다.
<properties> 바로 위에 다음코드를 추가해주세요
<repositories> <repository> <id>mesir-repo</id> <url>http://mesir.googlecode.com/svn/trunk/mavenrepo</url> </repository> </repositories>
그럼 오라클의 dependency 오류는 사라질 것이며
다음처럼 ojdbc14.jar 라이브러리가 등록될 것입니다.
MSSQL JDBC 연동을 위한 라이브러리인 sqljdbc는 메이븐에서 제공을 하지 않아
별도로 로컬상의 Maven repository로 연동이 되어야 합니다.
제일먼저 SQL Server용 JDBC 를 다운로드 받도록 합니다.
http://www.microsoft.com/ko-kr/download/details.aspx?id=11774
상단 URL 접속 후 다운로드 버튼을 클릭합니다.
윈도우 기준으로 설명하기에 exe 파일 체크 후 Next버튼을 클릭하여 파일다운로드를 받았습니다.
다운로드 받은 exe파일을 실행을 합니다.
Unzip해준 경로를 보면 sqljdbc_4.0 디렉토리가 생성되어있습니다.
kor 디렉토리를 들어가시면 sqljdbc.jar 파일과 sqljdbc4.jar 파일이 존재하는데 아마 요즘 프로젝트들은
JRE 6.0 이상의 환경에서 작업하므로 sqljdbc4.jar 파일을 등록시켜주면 될겁니다.
아파치 메이븐으로 install 해주기위하여
하단 사이트에 접속하여 메이븐 파일을 다운로드 받도록 합니다.
http://maven.apache.org/download.cgi
압축을 해제 후 CMD 창을 띄워줍니다.
다운받아서 해제한 apache-maven의 bin디렉토리까지 이동을 합니다.
다음 명령어를 실행합니다.
mvn install:install-file -Dfile=D:\sqljdbc_4.0\kor\sqljdbc4.jar -Dpackaging=jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc4 -Dversion=4.0
[INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Maven Stub Project (No POM) 1 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-install-plugin:2.4:install-file (default-cli) @ standalone-pom --- [INFO] Installing D:\sqljdbc_4.0\kor\sqljdbc4.jar to C:\Users\jgh\.m2\repository \com\microsoft\sqlserver\sqljdbc4\4.0\sqljdbc4-4.0.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.960 s [INFO] Finished at: 2014-11-14T01:23:05+09:00 [INFO] Final Memory: 5M/15M [INFO] ------------------------------------------------------------------------
로그가 출력되면 정상 설치 된것입니다.
그럼 MSSQL JDBC 라이브러리 Dependency를 등록해보도록 하겠습니다.
<dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>sqljdbc4</artifactId> <version>4.0</version> </dependency>
위와같이 pom.xml에 등록해주면 오류없이 정상적으로 라이브러리 추가가 된 것을 확인 할 수 있습니다.
MySQL, Oracle, MSSQL JDBC 라이브러리 파일을 pom.xml에 등록하는 방법에 대하여 포스팅해보았습니다.
다음장은 spring3 + mybatis 연동설정에 대하여 포스팅하도록 하겠습니다.
by 개발로짜
Spring3 + Mybatis연동에 추가로 트랜잭션 설정 하여 실패시 Rollback 처리하기 (2) | 2014.11.14 |
---|---|
Spring3 + MyBatis 기본설정 + 연동테스트 후 쿼리로그 확인해보기 (8) | 2014.11.14 |
Spring3 인터셉터와 세션을이용하여 로그인 처리해보기 (2) | 2014.11.12 |
Spring3 RedirectAttributes 사용한 redirect POST 전송법 (0) | 2014.11.11 |
Spring3 Pathvariable 어노테이션을 이용하여 PARAMETER를 URL처럼 받아보기 (0) | 2014.11.11 |
이번장은 interceptor를 이용하여 로그인 처리를 해보도록 하겠습니다.
인터셉터는 주로 컨트롤러 이벤트 호출전에 가로채서 어떠한 처리를 해주기 위해 사용되는 기능입니다.
만약 인터셉터를 사용하지 않고 일반적 로그인 체크를 코드마다 모두 작성한다고 가정해보도록 하겠습니다
위처럼 로그인이 필수인 컨트롤러를 작성할때 마다 로그인 체크 로직을 CTRL + C/V 해주어야 합니다.
코드도 길어지고 로그인 체크 일부가 변경되면 모두 변경해주어야 하는 번거로움이 있습니다.
이부분을 해결하기위해 별도로 로그인 체크유틸을 만들어서 사용하는 분들도 계시긴하지만
만약 유틸클래스명이나 사용하려는 메서드 일부가 변경이된다면?
일일이 모두 변경해주어야 하는 번거로움이 있습니다.
인터셉터를 만약에 정의하게 된다면?
위처럼 인터셉터를 거쳐서 통과시 컨트롤러 호출이 진행됩니다.
세션체크가 필요한 페이지는 XML 설정에 의해 정의해줌으로써
각 페이지마다 로그인 체크 해주는 코드를 작성해줄 필요가 없습니다.
그럼 로그인체크를 예를 들어서 인터셉터 설정을 잡아보도록 하겠습니다.
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/admin_main"/> <!-- 여러개 컨트롤러 추가 가능 --> <!-- <mvc:mapping path="/admin_write"/> <mvc:mapping path="/admin_update"/> <mvc:mapping path="/admin_delete"/> . . . --> <!-- 로그인체크 인터셉터 클래스 --> <bean class="com.spring.interceptor.Interceptor"/> </mvc:interceptor> </mvc:interceptors>
mvc-config.xml에 정의한 인터셉터 코드를 말씀드리자면
여러개의 인터셉터를 정의할수 있습니다.
mvc:interceptor 태그들을 mvc:interceptors내에 여러개 정의하여
컨트롤러 성향별로 인터셉터 여러개를 정의할 수 있습니다.
ex) 관리자 로그인, 사용자 로그인 등...
그리고 mvc:mapping 태그들을 mvc:interceptor 태그내에 여러개 정의하여
하나의 인터셉터로 여러개의 컨트롤러를 제어 할 수 있습니다.
ex) 관리자 로그인 후 글쓰기페이지,글수정페이지,삭제기능 등....
interceptors 태그 추가를 하였으면
"com.spring.interceptor" 패키지 생성 후에 "Interceptor" 클래스를 생성합니다.
그런 다음 코드를 작성해봅니다.
public class Interceptor extends HandlerInterceptorAdapter{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { try { //admin이라는 세션key를 가진 정보가 널일경우 로그인페이지로 이동 if(request.getSession().getAttribute("admin") == null ){ response.sendRedirect("/"); return false; } } catch (Exception e) { e.printStackTrace(); } //admin 세션key 존재시 main 페이지 이동 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { super.afterCompletion(request, response, handler, ex); } @Override public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { super.afterConcurrentHandlingStarted(request, response, handler); } }
위에 보시면 4가지의 인터셉터에 대한 오버라이드 속성이 존재합니다.
1. preHandle - controller 이벤트 호출전
2. postHandle - controller 호출 후 view 페이지 출력전
3. afterCompletion - controller + view 페이지 모두 출력 후
4. afterConcurrentHandlingStarted - 뭐 동시에 핸들링 해주는 메서드인대 정확히는 모르겠습니다.
위 4가지 방식 중 preHandle만 사용하였습니다.
/** * 가상의 로그인체크 컨트롤러 * @param request * @return */ @RequestMapping("/login") public String login(HttpServletRequest request){ String returnURL = ""; //웹페이지에서받은 아이디,패스워드 일치시 admin 세션key 생성 if(request.getParameter("id").equals("admin") && request.getParameter("password").equals("1234")) { Map<String, Object> map = new HashMap<String,Object>(); map.put("admin_id", "admin"); map.put("admin_name", "관리자"); request.getSession().setAttribute("admin", map); returnURL = "redirect:/admin_main"; //일치하지 않으면 로그인페이지 재이동 }else { returnURL = "redirect:/"; } return returnURL; } /** * 관리자메인 컨트롤러 * @return */ @RequestMapping("/admin_main") public String admin_main(){ return "admin_main"; }
2가지 컨트롤러를 생성하였는데
"/login" 컨트롤러는 임의로 로그인 체크를 위하여 생성한 컨트롤러이고
"/admin_main" 컨트롤러는 로그인 이후 세션이 생성된 시점에 접근이 가능한 관리자 메인 컨트롤러입니다.
각 컨트롤러에 return 페이지에 다음 코드를 작성해보겠습니다.
"/" 는 webapp/index.jsp를 의미하므로 index.jsp 파일의 body태그내에 다음과 같이 코드를 작성합니다.
<form action="/login" method="post"> <input type="text" name="id"/> <input type="password" name="password"/> <input type="submit" value="전송" /> </form>
마지막으로 "/admin_main" 컨트롤러 호출로부터
return 되는 jsp페이지를 "WEB-INF/view/" 경로에 추가 생성 한 다음
BDOY태그에 다음과 같이 코드작성을 합니다.
<h3>관리자메인페이지</h3> 관리자 아이디 : ${sessionScope.admin.admin_id }<br/> 관리자 이름: ${sessionScope.admin.admin_name }
위처럼 코드 작성을 해보았다면 실행을 해보도록 합니다.
세션유무로 인하여 페이지 접근권한 테스트를 해보기 위해서
최초로 URL에 바로 "/admin_main" 페이지를 접속해보도록 합니다.
실행결과 메인URL로 이동되어 로그인 페이지가 출력되었습니다.
세션이 존재 하지 않기때문에 로직에 따라서 자동으로 인터셉터에서 튕겨준 것입니다.
로그인테스트를 해보도록 하겠습니다.
admin/1234를 입력하여 전송버튼을 클릭해주도록 합니다.
그럼 위처럼 관리자 아이디와 이름을 확인할 수 있는
"/admin_main" 페이지로 성공적으로 이동이 되었습니다.
새로고침해도 역시 세션이 존재하고 있어서 페이지가 유지되고있습니다.
위처럼 인터셉터를 이용하여 로그인 세션체크를 해주시면 되겠습니다.
by 개발로짜
Spring3 + MyBatis 기본설정 + 연동테스트 후 쿼리로그 확인해보기 (8) | 2014.11.14 |
---|---|
Spring3 Maven을 이용하여 pom.xml에 oracle,mysql,mssql jdbc 라이브러리 등록하기 (0) | 2014.11.14 |
Spring3 RedirectAttributes 사용한 redirect POST 전송법 (0) | 2014.11.11 |
Spring3 Pathvariable 어노테이션을 이용하여 PARAMETER를 URL처럼 받아보기 (0) | 2014.11.11 |
Spring3 jackson JSON 라이브러리 + ResponseBody 이용하여 JSON 파싱하기 (0) | 2014.11.10 |