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 |