해당포스트를 읽기전에 반드시

http://dev-khm.tistory.com/21



데이터베이스를 만들기를 바란다.해당 챕터는 데이터 베이스와 연관되서 데이터를 가지고오는 챕터기때문에 선행학습이 필요하다.

우리는 알다시피 스프링컨텍스트 파일을 따로 관리 할 수 있게끔 분리시켰다.


이제 그 스프링컨텍스트에 mysql에 접속하기 위한 설정파일 두개를 만들것이다.

context-datasource.xml

context-mapper.xml를 만들것이다

먼저 데이터소스는 데이터베이스의 접근하기 위한 정보들을 설정한다고보면되며

mapper는 마이바티스란 오픈소스를 이용해. slq쿼리문과 연결시켜주는 역할을 한다고보면된다.


세세한 설명은 차분히 설명을하며 진행하도록하겠다.

먼저 지난번에 만들어주었던 spring 폴더에 context-datasource.xml 만들어주자.


 <?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance

xmlns:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans 

http://www.springframework.org/schema/beans/spring-beans.xsd">


<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/app_data" />

<property name="username" value="root" />

<property name="password" value="1234" />

</bean>

</beans>


해당내용으로 작성을 해주자. 간단하게 설명하면 url은 로컬호스트로 돌리는 내 mysql에 로컬호스트로 돌리는 스프링 웹서버가 접근하겠다는 소리고 접근할때 3306으로 접근하고 app_data라는 스키마에 접근하겠다는소리다.


유저와 패스워드는 처음 mysql를 설치할때 설정한 값을 적용하면된다.

정상적으로 적었다면 아래와 같이 설정된다.



 

자이제 context-mapper.xml를 만들어주자.

 <?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance

xmlns:tx="http://www.springframework.org/schema/tx

xmlns:util="http://www.springframework.org/schema/util"

xmlns:aop="http://www.springframework.org/schema/aop"

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/tx http://www.springframework.org/schema/tx/spring-tx.xsd 

http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource" />

<property name="configLocation" value="classpath:/sqlmap/sql-mapper-config.xml" />

<property name="mapperLocations" value="classpath:/sqlmap/mappers/*.xml" />

</bean>

<bean id="mapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">

<property name="basePackage" value="

  com.pratice.project.dao

" />   

 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />

</bean>


</beans>

 


설정이 조금많지만 복잡하지않다. 전부다 마이바티스 라이브러리를 사용하여 내부기능설정을 지정한다.

먼저 sqlSessionFacetory같은경우 데이터베이스에 접근하기위한 정보는 context-datasource.xml에 선언한 내용을 그대로 가지고 사용한다 실제로 보면 ref="dataSource"로 되어있는것을 알 수 있다. configLocation은 sql문을 쓸때 클래스path가 긴것을 개발자가 보기 쉽게하기 위해 사용된다. 이부분은 챕터를 보다보면 이해가될것이다. 그다음 mapperLocation은 우리가 만든 sql문의 접근위치를 이야기해준다


간단히 이야기하면 datasource정보를 접근해서 데이터베이스에 접근하고 mapperlocations에 위치한 쿼리문을 통해서 쿼리한다라는 의미다. 편의를위해서 쿼리문에서 configLocation에 위치한 설정파일로 쿼리를 실행할 때 도움을주고..


자 여기까지했으면 조금 의문이 들수 있다. 그럼 코드상에선 어떻게 접근을하는가?

그방법은 바로 아래에 있다.

mapper라는 bean을 하나 선언해준다. 이 mapper빈을 자바 코드내에서 autowired해서 가지고온다. 물론 autowired할때 mapper아래 설정한 property name="basePackage"에서 설정한 패키지에 존재하는 인터페이스만 접근하겠다는소리다.




인터페이스는 챕터를 진행하면서 만들것이다. 마지막에 정리가될것이다.

이제 다음으로 configLocation에 위치하는 /sqlmap/sql-mapper-config.xml를 만들어주자

sqlmap은 spring 폴더와 동일한위치에 만들어주면된다.

 <?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration

  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-config.dtd">

  

<configuration>


<typeAliases>

<typeAlias alias="name" type="com.pratice.project.model.Name"/>

</typeAliases>

</configuration>



내용은 정말간단하다. 우리가 만든Name 클래스를 간단하게 name이라는 명칭으로 접근하겠다는의미다. 이해가 안될수도있는데 만약 컨피그를 안사용하면 저 path.클래스 길게 일일히 쳐주어야한다.

다음으로 sqlmap안에 mappers라는 폴더를 만들어주고 그안에 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="com.pratice.project.dao.IGetDao">



<select id="selectName" parameterType="String" resultType="name">

 <![CDATA[

  SELECT UserName

         FROM usertbl

         WHERE UserName = #{name}

        ]]>

</select>

  </mapper>


이query.xml이 여러분들이 사용하게될 sql문을 적을장소이다.

mappernamespce는 내가만든 dao를 인터페이스를 의미한다.(곧만들것이다)

그리고 그 인터페이스의 정의된 메서드의 selectName의 쿼리는 아래에 나와있다.


이것을 보면 뭔가 보이지않는가? service인터페이스랑 형태만 다른뿐이지

쿼리자체가 실행부가된다고보면된다 즉 impl class implements service interface 가 그냥 query.xml implements dao interface가 된다고보면된다.


그리고 아래부분을 보시면 인터페이스에서 정의한 함수들을 구현하기위해 작성된 쿼리를 볼수 있다. 파라미터를 받겠다는 의미고 파라미터는 String으로 받겠다는 의미다. 그리고 resultType는 아까 config에서 설정한 Name class타입으로 객체를 리턴시키겠다는 것이다.


즉 쿼리를 실행하면 Name이란 객체로 데이터를 set시키고 리턴시키겠다는의미이다. 

정상적으로 세팅했다면 아래와같이 세팅이된다.




이제 dao를 만들어보자.. 그전에 한가지 바꿀부분이있다 모델클래스의 String name과 get,set 함수 이름을 좀 바꾸어야한다.

왜냐하면 DB컬럼과 이름을 똑같이해줘야 데이터를 받아올때 매핑될수 있다.

아래와 같이 바꿔주자.

 package com.pratice.project.model;


public class Name {

private String UserName;


public String getUserName() {

return UserName;

}


public void setUserName(String name) {

this.UserName = name;

}


}


이제 dao 패키지를 만들어주자. 그리고 패키지 안에 인터페이스를 만들어주자. 인터페이스명은 <mapper namespace="com.pratice.project.dao.IGetDao">선언한대로 IGetDao로 선언해주자.


그후..

<select id="selectName" parameterType="String" resultType="name">

 <![CDATA[

  SELECT UserName

         FROM usertbl

         WHERE UserName = #{name}

        ]]>

</select>

위에 선언한대로 selectName이란 함수를 만들어주고 name를 파라미터로 받아주는 메서드를 선언하자

 package com.pratice.project.dao;


public interface IGetDao {

public Name selectName(String name);

}


 


어떤가? 이제 이해가되지않는가? 구현부는 즉 implement영역은 쿼리, 인터페이스 영역은 IGetDao로 되어있다.

정상적으로 됬다면 위와같이 보일것이다.



이제 Service영역을 바꾸어보자.

 package com.pratice.project.service.impl;


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;


import com.pratice.project.dao.IGetDao;

import com.pratice.project.model.Name;

import com.pratice.project.service.TestService;


@Service

public class TestServiceImpl implements TestService{


@Autowired

private IGetDao mapper;

@Override

public Name getName(String name) {

// TODO Auto-generated method stub

Name Testreturn = mapper.selectName(name);

return Testreturn;

}

}


어떤가? 아까  context-mapper.xml 설정했던 mapper를 기억하는가?

그 mapper를 bean 객체를 불어오는것이다. IGetDao란 형태의 인터페이스로 불러오라는것이다.

아까내용은 다음과같다

<bean id="mapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">

<property name="basePackage" value="

  com.pratice.project.dao

" />   

 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />

</bean>


위의내용에서 선언된 mapper를 가지고오되 dao안에 있는 패키지안에 인터페이스를 사용해서 가지고온것이다.

그리고 이런부부은 우리가만든 sql문이랑 연결되는것이다.


이제 디비 컬럼값을 조회하기위해서 TestController를 바꾸어주자

 package com.pratice.project.controller;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;


import com.pratice.project.model.Name;

import com.pratice.project.service.TestService;


@RestController

public class TestController {


@Autowired

TestService testservice;

@RequestMapping(value = "/test/rest", method = RequestMethod.GET)

public Name getName(HttpServletRequest request, HttpServletResponse response) {

Name rt=testservice.getName("yoonjiwon");

return rt;

}

}



보면 바뀐부부은 이름을 조회하기 위해서 컬럼에 있는값들을 집어넣어주었다.

즉 로직을 설명하면

컨트롤러 url 매핑 -> 서비스 객체 오토와이어로 가지고오고 -> 서비스 impl 실행 -> mapper 객체 오토와이어로 가지고오고 mapper는 설정된 패키지 내에있는 인터페이스 형태로 가지고오게되고 -> mapper는 설정된 database로 연결되며 sqlmap에 선언된 쿼리문으로 연결된다. 


이런식이고 인터페이스와 sqlmap에 쿼리가 연결된다만 특별히 기억하면된다.

이제 이결과를 Rest client에서 실행하게되면.



위와같이 데이터베이스를 조회한 결과물이 나오게된다.


다음챕터는 json 포맷변화 컨트롤러의 파라미터를 받아서 조회하는 방법 까지 할예정이다. 조금더 여유가 있다면 트랜잭션처리까지 할예정이다.



'DEV > SPRING' 카테고리의 다른 글

Rest Service 구현[5]  (0) 2018.05.11
Rest Service 구현[4]  (0) 2018.05.11
Rest Service 구현[2]  (0) 2018.05.11
Rest Service 구현[1]  (0) 2018.05.11
Spring restful service 참고사이트  (0) 2018.05.11

+ Recent posts