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