처음 할 내용은 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