전처리 후처리를 할 수 있는 인터셉터를 만들어줘보자.

스프링은 전처리 후처리를 담당 할 수 있는 인터셉터란 녀석이있다.

먼저 WEB-INF의 servlet-context를변경해주자

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

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

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

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

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

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

http://www.springframework.org/schema/beans 

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

http://www.springframework.org/schema/context 

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


<!-- DispatcherServlet Context: defines this servlet's request-processing 

infrastructure -->


<!-- Enables the Spring MVC @Controller programming model -->

<mvc:annotation-driven />


<context:component-scan base-package="com.pratice.project"

use-default-filters="false">

<context:include-filter type="annotation"

expression="org.springframework.stereotype.Controller" />

</context:component-scan>


<!-- Handles HTTP GET requests for /resources/** by efficiently serving 

up static resources in the ${webappRoot}/resources directory -->

<mvc:resources mapping="/resources/**" location="/resources/" />


<mvc:interceptors>

<mvc:interceptor>

<mvc:mapping path="/**" />

<bean class="com.pratice.project.interceptor.CommonInterceptor" />

</mvc:interceptor>

</mvc:interceptors>



<!-- Resolves views selected for rendering by @Controllers to .jsp resources 

in the /WEB-INF/views directory -->

<bean

class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/views/" />

<property name="suffix" value=".jsp" />

</bean>

<!-- <context:component-scan base-package="com.pratice.project"></context:component-scan> -->



</beans>



보면 알다시피 /**란 뜻은  prefix인 project를 포함한 모든 url매핑의 전처리를 뜻한다 이부분을 유저가 정의해서 따로 인터셉터를 만들수도있다. 다음은 인터셉터 클래스인 CommonInterceptor를 만들어주자.물론이전에 interceptor란 패키지를 만들어주자

 package com.pratice.project.interceptor;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;


public class CommonInterceptor implements HandlerInterceptor  {



@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object Obj) throws Exception {

// TODO Auto-generated method stub

System.out.println("prehandle");

return true;

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object Obj, ModelAndView mv)

throws Exception {

// TODO Auto-generated method stub

System.out.println("posthandle");

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object Obj, Exception ex)

throws Exception {

// TODO Auto-generated method stub

}



}


 


prehandle은 전처리를 의미한다. posthandle은 후처리를 의미하고 마지막 aftercomplete은 로직이 종료됬을때를의미한다.

그리고 파라미터를 보면 request와 response가 있는것을 확인 할 수 있다. 전처리 후처리에 출력문을 적어두었다.

여기서 주의할점은 전처리에 true를 리턴해야만 정상적으로 전처리가 실행된다.


정상적이라면 아래와같은 구조를 띄게된다.



그다음 할일은 서버를 돌려서 아무 API나 호출해보자 



그다음 출력창을 확인해보자.




정상적으로 전처리 후처리가 되는것을 확인할 수있다.



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

Rest Service 구현[10]  (0) 2018.05.11
Rest Service 구현[8]  (0) 2018.05.11
Rest Service 구현[7]  (0) 2018.05.11
Rest Service 구현[6]  (0) 2018.05.11
Rest Service 구현[5]  (0) 2018.05.11

전챕터에서 뭔가한가지 문제가있다.


@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;

}

}


@Override

public UserList getUserList() {

// TODO Auto-generated method stub

UserList userlist = new UserList();

try {

userlist.setStat("success");

List<User> list=mapper.getUserList();

userlist.setUserList(list);

return userlist;

} catch (Exception e) {

userlist.setStat("fail");

userlist.setCause(e.getMessage());

return userlist;

}

 

 

 

 }


바로 이부문이다 보시다시피 두개다 에러처리가 되어있는데 catch부분이 동일한것을 볼 수 있다 setstat은 어쩔 수 없다고 쳐도

cause는 똑같은 문이 두번이나 반복된다.


이것을 어떻게 처리 할 수 있을까? 스프링은 @ControllerAdvice라는 에러 공통처리하는 부분을 만들어 줄 수 있다.

AnnotationExceptionHandler하나만들어주자 위치는 com.pratice.project에 만들어주자


 package com.pratice.project;


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

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

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


import com.pratice.project.model.STAT;


@RestController

@ControllerAdvice

public class AnnotationExceptionHandler {

@ExceptionHandler(Exception.class)

public STAT handleException(Exception e) {

STAT stat=new STAT();

stat.setStat("fail");

stat.setCause(e.getMessage());

return stat;

}

}


 


내용만봐도 공통적인 사항들을 뺀부분이 보이지않는가?

그리고 자세히보면 맨위에 RestController 애노테이션이 추가되어있는것을 알 수 있다.

이말은 json으로 리턴해주겠다는것이다.


그다음 Impl를 바꾸어주자

 package com.pratice.project.service.impl;


import java.util.List;


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

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();

mapper.addUser(user);

stat.setStat("success");

return stat;

}


@Override

public UserList getUserList() {

// TODO Auto-generated method stub

UserList userlist = new UserList();

userlist.setStat("success");

List<User> list = mapper.getUserList();

userlist.setUserList(list);

return userlist;


}


}



보면 중복되던 try catch문이 사라진것을 알 수 가 있다.


이제 restclient를 실행해보자.



정상동작하는것을 알 수있다.

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

Rest Service 구현[10]  (0) 2018.05.11
Rest Service 구현[9]  (0) 2018.05.11
Rest Service 구현[7]  (0) 2018.05.11
Rest Service 구현[6]  (0) 2018.05.11
Rest Service 구현[5]  (0) 2018.05.11

리스트를 구현해보자.


알다시피 get method로 현재까지 구현한내용들을 보면 전부 단일 row를 구해서 json으로 리턴시켜준다 

이제 데이터베이스의 있는 모든 내용들을 리턴시켜주어보자


일단 모델객체를 만들어주자

 package com.pratice.project.model;


import java.util.List;


import com.fasterxml.jackson.annotation.JsonInclude;

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

import com.fasterxml.jackson.annotation.JsonProperty;

import com.fasterxml.jackson.annotation.JsonPropertyOrder;


@JsonPropertyOrder({"stat","cause","userList"})

public class UserList {

@JsonProperty("stat")

@JsonInclude(Include.NON_NULL)

private String stat;

@JsonProperty("cause")

@JsonInclude(Include.NON_NULL)

private String cause;

@JsonProperty("userList")

@JsonInclude(Include.ALWAYS)

private List<User> userList;


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;

}


public List<User> getUserList() {

return userList;

}


public void setUserList(List<User> userList) {

this.userList = userList;

}


}


잘보면 리스트는 유저들의 목록을 받아오는 필드고 나머지는 지난챕터에서 배운 에러처리를 위한 항목인걸 알 수 있다.



다음으로 dao인터페이스를 만들어주자

 package com.pratice.project.dao;


import java.util.List;


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);

public void addUser(User user);

public List<User> getUserList();

}



user로 나오는 리스트들을 받는 다는 의미의 getUserList 인터페이스를 선언해주었다. 이제

쿼리문을 짜주자


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

<select id="getUserList" resultType="user">

 <![CDATA[

 SELECT *

         FROM usertbl

   ]]>

</select>

</mapper>

 


쿼리를 보면 user클래스로 리턴해주는것을 알수 있는데 여기서좀 의문이 들텐데. 어떻게 저 쿼리가 리스트로 보내지는 의문이 들것이다. 이것은 마이바티스가 row수가 1이상을 넘어가면 그 객체를 리스트로 자동으로 리턴시켜주는것이다. 


이제 다음으로 서비스 인터페이스에 우리가 사용할 함수를 선언해주자.

 package com.pratice.project.service;


import com.pratice.project.model.Name;

import com.pratice.project.model.STAT;

import com.pratice.project.model.User;

import com.pratice.project.model.UserList;


public interface TestService {

public Name getName(String name);

public User getUser(String id);

public STAT addUser(User user);

public UserList getUserList();

}


 


그리고 구현부를 만들어주자

 package com.pratice.project.service.impl;


import java.util.List;


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

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;

}

}


@Override

public UserList getUserList() {

// TODO Auto-generated method stub

UserList userlist = new UserList();

try {

userlist.setStat("success");

List<User> list=mapper.getUserList();

userlist.setUserList(list);

return userlist;

} catch (Exception e) {

userlist.setStat("fail");

userlist.setCause(e.getMessage());

return userlist;

}

}


}


 


다른 구현부랑 차이가있다. 일단 지난 챕터에서 사용하던 try캐치문이 들어갔다. 그리고 mapper를 객체로 바로 주입하는게 아니라 일단 리스트형태로 가지고 온 후, 그 list를 set해서 선언한 모델객체인 userlist 주입한다. 나머지는 동일하다.


이제 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.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.model.UserList;

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;


}

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

public UserList getUserList(HttpServletRequest request, HttpServletResponse response) {

UserList userlist = testservice.getUserList();

return userlist;


}

}

 


Res tclient를 url에 맞추어 설정해주자 물론 메서드는 GET이다.



정상적으로 뜨는가? 그렇다면 리스트를 리턴시켜준것이다.



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

Rest Service 구현[9]  (0) 2018.05.11
Rest Service 구현[8]  (0) 2018.05.11
Rest Service 구현[6]  (0) 2018.05.11
Rest Service 구현[5]  (0) 2018.05.11
Rest Service 구현[4]  (0) 2018.05.11

+ Recent posts