adduser이란 api를 똑같은 설정으로 다시 호출해보라.



아마도  아래 리스폰스에 어마어마한 긴 에러가 뜨게 될것이다. 왜 에러가뜨는걸까?

이유는 userID라는 컬럼이 기본키로 설정되있기때문에 중복허용을 하지 않기때문이다.


근데 리스폰스에 에러문을 보니 뭔가 답답하지않은가? 원인도파악하기힘들고 정말 서비스를 사용하는 유저가 API를 호출했을때

저런 화면이나 텍스트를 보면 어떤반응을할까?

[이 서비스는 개판이네...]

이런생각을 가지게될것이다.


또한 추가적으로 생각했을때. insert가 성공했을때 , 뭔가 성공했다고 혹시 response를 날려주었나? 그렇지않다. 이렇게 api를 짜게 되면

클라이언트[안드로이드나 웹페이지]는 이게 성공했는지 실패했는지 알기가 힘들다. 그리고 성공후에 클라이언트에서 특정이벤트를 한다면 더더욱 오리무중에 빠지게된다. 즉

클라이언트 -> 서버로 통신할때 서버는 클라이언트가 호출한 결과를 알려주어야한다.


이렇게 하는 처리를 에러처리라고한다. 

에러를 컨트롤하는 기능을 스프링에서 제공해주긴하는데 그것은 나중에 심화학습 챕터에서 알아보고 현재는 간단하게

에러를 처리하는 방식을 배워보자. 즉 try catch문으로 말이다.


일단 에러가 발생하든 안하든 리턴을 시켜주는 객체가필요하다 즉 모델이 필요하다

모델패키지에 STAT란 자바클래스를 하나 만들어주자

 package com.pratice.project.model;


import com.fasterxml.jackson.annotation.JsonInclude;

import com.fasterxml.jackson.annotation.JsonProperty;

import com.fasterxml.jackson.annotation.JsonInclude.Include;


public class STAT {

@JsonProperty("stat")

@JsonInclude(Include.NON_NULL)

private String stat;

@JsonProperty("cause")

@JsonInclude(Include.NON_NULL)

private String cause;


public String getStat() {

return stat;

}


public void setStat(String stat) {

this.stat = stat;

}


public String getCause() {

return cause;

}


public void setCause(String cause) {

this.cause = cause;

}


}


 


간단하다. stat은 이 api가 성공했을지 실패했을지를 담을 필드고 나머지 cause는 에러가 발생했을때만 나타나게할것이다.

알다시피 @JsonInclude(Include.NON_NULL) 걸려있기때문에 데이터가없으면 json 객체에 보여지지않는다.


자 이제 기존 서비스 인터페이스를 조금 바꿔보자.

 package com.pratice.project.service;


import com.pratice.project.model.Name;

import com.pratice.project.model.STAT;

import com.pratice.project.model.User;


public interface TestService {

public Name getName(String name);

public User getUser(String id);

public STAT addUser(User user);

}


 

서비스의 리턴형태를 STAT로 바꾸었다.

이제 addUser의 구현부를 바꾸어보자

 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.model.STAT;

import com.pratice.project.model.User;

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;

}

@Override

public User getUser(String id) {

// TODO Auto-generated method stub

User user=mapper.selectUser(id);

return user;

}


@Override

public STAT addUser(User user) {

// TODO Auto-generated method stub

STAT stat =new STAT();

try{

mapper.addUser(user);

stat.setStat("success");

return stat;

}catch(Exception e){

stat.setStat("fail");

stat.setCause(e.getMessage());

return stat;

}

}


}


 

내용이 좀 길어졌긴했지만 반드시 필요한내용이다. 

stat를 new로써주고 객체를 만들어주고 try catch문으로 감싸주었다

에러가 발생하지않으면 setStat으로 성공이라는 텍스트를 객체에 주입시켜주고 stat자체를 리턴시켜준다

하지만 만약 중복에러 또는 다른 에러가 발생하면 fail이라는 텍스트를 객체에 주입시키고 cause에 에러메시지를 주입하고 stat를 리턴시켜준다.


이제 컨트롤러를 바꿀 차례다.

 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.RequestBody;

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

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

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

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


import com.pratice.project.model.Name;

import com.pratice.project.model.STAT;

import com.pratice.project.model.User;

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,

@RequestParam(value = "name") String name) {

Name rt = testservice.getName(name);

return rt;

}


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

public User getUser(HttpServletRequest request, HttpServletResponse response,

@RequestParam(value = "userID") String userID) {

User rt = testservice.getUser(userID);

return rt;

}


@RequestMapping(value = "/adduser", method = RequestMethod.POST)

public STAT addUser(HttpServletRequest request, HttpServletResponse response, @RequestBody User user) {

STAT stat = testservice.addUser(user);

return stat;


}

}

 

간단하다 STAT stat으로 addUser에서 나오는 객체를 받아서 리턴한다.

컨트롤러에서 리턴하니 json형태로 리턴되게된다.


실제 RESTCLIENT를 실행해보자

아래와같이 새로운값을 Send 해보자


send를 눌러보자


성공했다는 리스폰스가 뜨게된다. 

여기서 다시한번 똑같은 값을 Send하게되면...



실패가 뜨고 중복됬다고 친절하게 설명글까지 뜨게된다.


만약 클라이언트가 이 api를 호출하게되면 성공이되면 특정 이벤트가 발생되게 바꿀수있고

실패한다면 이벤트가발생안되고 특정에러가 발생했다고 알람창을 띄어주게 해줄수 있을것이다.


다음챕터는 리스트에 좀더 알아보도록하겠다.






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

Rest Service 구현[8]  (0) 2018.05.11
Rest Service 구현[7]  (0) 2018.05.11
Rest Service 구현[5]  (0) 2018.05.11
Rest Service 구현[4]  (0) 2018.05.11
Rest Service 구현[3]  (0) 2018.05.11

트랜잭션을 처리하는 aop를 context로 선언해서 auto로 관리해보고

insert api를 만들어줘보자.


알다시피 트랜잭션은 데이터베이스의 처리하는 단위이다. 즉 데이터베이스의 내용을 커밋해주는 역할도하며,

이 트랜잭션은 뭔가 데이터가 정상적이지못하거나 웹서버가 문제가 있어 중간에 죽으면

insert되던것을 롤백을 해야하는 임무도 더러있다.


현재 우리의 코드에서는 트랜잭션을 처리하는 부분이 존재하지않다.

이때문에 insert 과정중에 크리티컬 에러가 생겨도 롤백을 하지않는다. 이문제는 서비스단에서

엄청 큰문제를 초래 할 수 있다. 데이터는 정말 중요하다. 


그래서 트랜잭션을 여러가지방법으로 처리할수 있게 스프링에서 제공해주지만 내가써본바로는 aop만큼

편한방법을 찾지 못하였다. aop에 대해서 모른다면 스프링에대해서 좀더 공부해보길 추천드린다.


aop로 전체 서비스 객체에 트랜잭션을 걸 수가 있다. 그리고 따로 트랜잭션처리를 안해도 문제가 생기면 알아서 rollback까지

해준다.


자 이제 시작해보자. 일단 처음 해야할작업은 context-transaction.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:aop="http://www.springframework.org/schema/aop"

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

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/aop 

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


<tx:annotation-driven />

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

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

</bean>

<tx:advice id="txAdvice" transaction-manager="txManager">

<tx:attributes>

<tx:method name="get*" read-only="true" />

   <tx:method name="add*" propagation="REQUIRED" />

<tx:method name="modify*" propagation="REQUIRED" />

<tx:method name="remove*" propagation="REQUIRED" />

</tx:attributes>

</tx:advice>

<aop:config>

<aop:pointcut id="requiredTx" expression="execution(* com.pratice.project.service.impl.*Impl.*(..))"/>

<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />

</aop:config>

</beans>


 


txManager는 dataSource를 트랜잭션 메니저가 트랜잭션을 처리하겠다는 의미고 txAdvice는 txManager에서 설정된 데이터소스에 접근하는 트랜잭션 중에 메서드 명중에 앞글자를 따서 select ,add,modify,remove등이 앞으로오는 메서드가있으면 select 같은경우 read only만 해주고 나머지는 propagation="REQUIRED" 로 트랜잭션 처리를 하겠다는 뜻이다. 즉 값이 변화가생기면 commit을 해주거나 에러가생기면 롤백도 해준다는것이다.


마지막으로 aop에 특정 service 패키지내에 Impl로 끝나는 클래스들을 포인트컷을 걸어두고 advice에 txAdvice를 걸어주면 끝난다.


정상적으로됐다면 이제 트랜잭션처리는 끝난것이다.


간단하지않은가? 

이제 저 메서드의 해당하는 api를 추가만 해주면된다. insert에 해당하는 내용을 한번 만들어보자.

지금까지 전부 get로 했지만 이번에는 POST로 한번 짜보도록해보자.


먼저 IGetDao의 내용을 추가해주자.

 package com.pratice.project.dao;


import com.pratice.project.model.Name;

import com.pratice.project.model.User;


public interface IGetDao {

public Name selectName(String name);

public User selectUser(String id);

public void addUser(User user);

}


 보다시피 addUser이라는 메서드가 트랜잭션 관리하는 txAdvice랑 일치한다. add가 붙어있다. 파라미터는 user그자체를 받고 그 user객체를 insert하겠다는 의미이다. 


이제 쿼리를 작성해주자.

 <?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>


<select id="selectUser" parameterType="String" resultType="user">

 <![CDATA[

 SELECT *

         FROM usertbl

         WHERE UserID = #{userID}

        ]]>

</select>


<insert id="addUser" parameterType="user">

 <![CDATA[

insert into userTbl(UserID,UserName,UserAge,Phone,Comment) values 

(#{userID},#{userName},#{userAge},#{phone},#{comment});

   ]]>

</insert>

</mapper>

 

insert문이 추가된것이보인다. 여기서 몇가지 주의할점이있다. parametertype를 클래스 형태로 받으면 굳이 따로 변화할 필요없이 #{필드명}을 쓰면 알아서 클래스 객체의 있는 정보를 가지고와서 쓸수 있다. 단! 여기서 필드명의 첫글자는 소문자로 해주어야한다. 이것은 마이바티스 규약 사항처럼 보이는데 대문자로 하면 인식을 못하니 꼭 주의해야한다. 


그리고 보시다시피 클래스 User 객체의 필드들의 이름과 database의 컬럼이름이 똑같은것[단! 클래스 User객체의 필드들의 앞글자는 소문자이다.]을 알 수 있다. 이점을 항상 유의하면서 코드와 쿼리를 작성하기를 바란다.


이제 쿼리가 작성됐다면 Service interface를 정의해주자.

 package com.pratice.project.service;


import com.pratice.project.model.Name;

import com.pratice.project.model.User;


public interface TestService {

public Name getName(String name);

public User getUser(String id);

public void addUser(User user);

}


 

이제 Impl 실행부에 구현을 적어주자

 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.model.User;

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;

}

@Override

public User getUser(String id) {

// TODO Auto-generated method stub

User user=mapper.selectUser(id);

return user;

}


@Override

public void addUser(User user) {

// TODO Auto-generated method stub

mapper.addUser(user);

}


}


 


보시다시피 별내용이 없다 단순히 mapper.addUser한 내용이고 파라미터로는 user를 받겠다는 소리다.


여기까지 됐다면 아까처럼 controller를 추가할차례다.

 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.RequestBody;

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

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

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

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

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


import com.pratice.project.model.Name;

import com.pratice.project.model.User;

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,

@RequestParam(value="name")String name) {

Name rt=testservice.getName(name);

return rt;

}

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

public User getUser(HttpServletRequest request, HttpServletResponse response,

@RequestParam(value="userID")String userID) {

User rt=testservice.getUser(userID);

return rt;

}

@RequestMapping(value = "/adduser", method = RequestMethod.POST)

public void addUser(HttpServletRequest request, HttpServletResponse response,@RequestBody User user) {

testservice.addUser(user);

}

}


기존 컨트롤러 메서드랑 좀 틀린 부분이 보이지않는가? 바로 @RequestBody User user가 아래붙어있는데 이부분은 리퀘스트로 오는부분을 json형태로 받을 수 있도록한것이며 json으로 받은데이터를 user객체에 대입해준것이다. 그리고 선언한 서비스 객체의 addUser를 해준것이다.


이제 정상적으로 동작하는지 RestClient로 확인해보자


위와같이 insert api란 것을 새로 save하고 url를 적어주고 Post를 선택해주자.

Post를 선택하면 아래와같이 json을 작성하는 부분이 출력된다. 그부분에 해당과 같이 작성해주자.



 { "userID":"goo92",

  "userName":"goomankim",

  "userAge":"27",

  "phone":"010...",

  "comment":"gogo"

}

 

보다시피 클래스 user객체의 필드명과 대소문자가 정확하게 일치한다! 정확히 일치해야 값을 얻어올 수 있으니 반드시 주의하기바란다.


이제 send를 눌러보자. 아마 아래 아무런 데이터 반응이 없다고 뜨면 성공적이다(이부분은 다음 챕터에서 보완을 하는 내용을 기재하겠다)


이제 데이터베이스의 내용을 확인해보자(select * fromusertbl)




위와같이 데이터베이스에 정확하게 들어간것을 확인 할 수 있다.


다음챕터에서는 에러처리를 하는 리턴문과 여러 데이터들을 한꺼번에 리스트형태로 리턴하는것을 기재할예정이다.



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

Rest Service 구현[7]  (0) 2018.05.11
Rest Service 구현[6]  (0) 2018.05.11
Rest Service 구현[4]  (0) 2018.05.11
Rest Service 구현[3]  (0) 2018.05.11
Rest Service 구현[2]  (0) 2018.05.11

처음 할 내용은 json 포맷을 변경하는 방법부터 알아보자

일단 모델객체인 Name.java를 변경 해주어야한다.


package com.pratice.project.model;


import com.fasterxml.jackson.annotation.JsonInclude;

import com.fasterxml.jackson.annotation.JsonProperty;

import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import com.fasterxml.jackson.annotation.JsonInclude.Include;


@JsonPropertyOrder({"name"})

public class Name {

@JsonProperty("name")

@JsonInclude(Include.NON_NULL)

private String userName;


public String getUserName() {

return userName;

}


public void setUserName(String name) {

this.userName = name;

}


}



(여기서 전챕터에서 말하지않은 내용이있는데 UserName이 userName으로 바뀐것을 알 수가 있다. 알다시피 데이터 컬럼과 필드값이 일치해야하는데 일치하는조건이 첫글자는 소문자로 써주어야한다[컬럼이 대문자여도!!] 그래야 정상적으로 다른 설정 부분을 쓸 수 있다.) 


일단 클래스위에 있는 @JsonPropertyOrder 는 json의 필드 출력순서를 정해준다. 지금은 필드가 username뿐이지만 실제 서비스에서는 많은 필드를 가지고 있기때문에 어떤것이 먼저 출력될지 정해주어야할때가 많다. 그때 사용되게된다.


두번째 @JsonProperty 는 출력되는 포맷을 결정해준다. 

원래 출력형태를 기억하는가?


필드:밸류가 userName:"yoonjiwon" 이지만

이와같이 JsonProperty 선언하면 name:"yoonjiwon"으로 출력되게된다.


또한 추가적으로 @JsonInclude(Include.NON_NULL)은 null로 데이터가 없을때는 필드를 노출안하겠다는뜻이다.

지금은 필드가 하나지만 필드가 2개일때 만약 1개의 필드는데이터가 있고 1개의 필드가 데이터가없다면

저 설정을 안하면 2개의 필드가 동시에 노출된다.

이런식으로 말이다.

name:"heemin",

  age:null        }


null나오는 방법은 매우 안좋고 클라이언트가 인식하는데도 문제가 있기떄문에 노출이 한개만되게끔 설정해주는것이다.


이상태에서 이제 다시 호출해보면


우리가 변경한 필드가 정상적으로 노출되는것을 알수 있다.


자 다음으로 테스트 컨트롤러를 변경해서 url파라미터로 받아서 함수를 실행시켜보자.

그전에 mysql workbench에 테스트 케이스를 더만들기 위해 insert를 좀더 해놓자.

 insert into userTbl(UserID,UserName,UserAge,Phone,Comment) values 

('heemin87','heeminkim','29','010-7194-0000','hello my name is Heemin');


insert into userTbl(UserID,UserName,UserAge,Phone,Comment) values 

('heejin92','heejinkim','27','010-0000-0000','hello my name is Heejin');


기존 테스트 컨트롤러는 문제가 있다.

바로 개발자가 테스트를 하기위해서 파라미터를 강제로 import시키고있다.

실제로 보게되면은

public Name getName(HttpServletRequest request, HttpServletResponse response) {

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

return rt;

}

아래와 같이 testservice.getName의 개발자가 알고있는 이름을 대입해서 강제로 테스트 한것을 알 수 있다.

이부분을 이제 url 파라미터로 받아서 변경하는 부분을 실행해보자.


코드는 이런식으로 변경해준다.

 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.RequestParam;

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,

@RequestParam(value="name")String name) {

Name rt=testservice.getName(name);

return rt;

}

}


보다시피 @RequestParam 이 추가 된것을 알수가 있다.

url뒤에 name 파라미터를 붙여서 보내줘서 그 파라미터를 문자형 변수 name으로 받아서 값을 넘겨주는 방식으로 바뀌었다.


이제 RestClient를 바꾸어서 호출해보자.


보다시피 뒤에 파라미터를 보내기위해 ? 가 붙었고 name이란 파라미터에 값을 heeminkim으로 해준것이다.

이제 send를 보내게 되면.



정상적으로 이름이 뜨는것을 알 수가 있다.


이 전체적인것을 응용하면 좀더 잘 알 수 있게 변경할수 있다.


일단 model 클래스를 추가해주자.

User.java를 모델패키지에 추가시켜주자.

 package com.pratice.project.model;


import com.fasterxml.jackson.annotation.JsonInclude;

import com.fasterxml.jackson.annotation.JsonProperty;

import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import com.fasterxml.jackson.annotation.JsonInclude.Include;


@JsonPropertyOrder({"userID","userName","userAge","phone","comment"})

public class User {

@JsonProperty("userID")

@JsonInclude(Include.NON_NULL)

private String userID;

@JsonProperty("userName")

@JsonInclude(Include.NON_NULL)

private String userName;

@JsonProperty("userAge")

@JsonInclude(Include.NON_NULL)

private String userAge;

@JsonProperty("phone")

@JsonInclude(Include.NON_NULL)

private String phone;

@JsonProperty("comment")

@JsonInclude(Include.NON_NULL)

private String comment;


public String getUserID() {

return userID;

}


public void setUserID(String userID) {

this.userID = userID;

}


public String getUserName() {

return userName;

}


public void setUserName(String userName) {

this.userName = userName;

}


public String getUserAge() {

return userAge;

}


public void setUserAge(String userAge) {

this.userAge = userAge;

}


public String getPhone() {

return phone;

}


public void setPhone(String phone) {

this.phone = phone;

}


public String getComment() {

return comment;

}


public void setComment(String comment) {

this.comment = comment;

}


}



다음으로 IGetDao에 데이터를 가지고올 인터페이스를 정의하자. 파라미터는 이미 name으로 받아봤으니 이제 id로 받아보자.

 package com.pratice.project.dao;


import com.pratice.project.model.Name;

import com.pratice.project.model.User;


public interface IGetDao {

public Name selectName(String name);

public User selectUser(String userID);

}



다음으로 sql config에 객체를 좀 쓰기 편하게 하기위하여 정의시켜주자.[sqlmap/sql-mapper-config.xml]

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

<typeAlias alias="user" type="com.pratice.project.model.User"/>

</typeAliases>

</configuration>



다음으로 인터페이스를 구현하기위한 쿼리문을 작성하자.

 <?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>

<select id="selectUser" parameterType="String" resultType="user">

 <![CDATA[

 SELECT *

         FROM usertbl

         WHERE UserID = #{userID}

        ]]>

</select>

  </mapper>



이제 이로직을 처리할 서비스 로직을 추가해주기위해 TestService에 인터페이스를 추가 시켜주자.

 package com.pratice.project.service;


import com.pratice.project.model.Name;

import com.pratice.project.model.User;


public interface TestService {

public Name getName(String name);

public User getUser(String id);

}



이제 실행부인 TestServiceImpl에 해당 메서드를 구현해주자

 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.model.User;

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;

}

@Override

public User getUser(String id) {

// TODO Auto-generated method stub

User user=mapper.selectUser(id);

return user;

}


}


이제 컨트롤러를 추가해서 api를 만들어서 최종적으로 마무리한다.

 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.RequestParam;

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


import com.pratice.project.model.Name;

import com.pratice.project.model.User;

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,

@RequestParam(value="name")String name) {

Name rt=testservice.getName(name);

return rt;

}

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

public User getUser(HttpServletRequest request, HttpServletResponse response,

@RequestParam(value="userID")String userID) {

User rt=testservice.getUser(userID);

return rt;

}

}


이제 RestClient 에서 우리가만든 api가 정상적으로 호출되는지 확인해보자.

먼저 save as new로 새로운 api를 등록해주고


이와같이 등록해주고 다시 save버튼을 누르고 overwrite를 해주자.

등록이되었다면 send를 눌러줘보자.




정상적으로 나오는가?

이 일련의 과정들이 API추가하는 모든것들을 의미한다.

즉 자신이 원하는 API는 이런식으로 추가하면된다.



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

Rest Service 구현[6]  (0) 2018.05.11
Rest Service 구현[5]  (0) 2018.05.11
Rest Service 구현[3]  (0) 2018.05.11
Rest Service 구현[2]  (0) 2018.05.11
Rest Service 구현[1]  (0) 2018.05.11

+ Recent posts