Rest Service 구현[1]
스프링은 RestController라는 훌륭한(!?) 에노테이션을 제공해준다
http://dev-khm.tistory.com/16?category=287920
위와같은 개발환경에대한 설정이 끝났다면 본격적으로 Rest Service를 구현해보자
예전에 만들어두었던 ExamplePrj 프로젝트 이용해
Rest서비스의 간단한 구성이후 mysql를 이용한 데이터 리턴까지 한번구성을해보자
만들어 두었던 프로젝트의 controller라는 패키지를 추가해주자
컨트롤러 패키지는 알다시피 Request와 비즈니스 로직을 처리하는 MVC 패턴의 C인 컨트롤러가 맞다.
정상적으로 처리가 되었다면 이제 RestCotroller에 포함되는 스프링 라이브러리를 사용하기 위해 pom.xml에 추가할 내용들이 있다.
일단 스프링 버전을 올려주어야한다. 그리고Jackson이란 라이브러리도 다운받아줘야한다.또한 차후 Mysql를 사용하기 위해서도 추가할 내용들이 있다.
일일히 말해주기가 어려우니 통쨰로 올리자면 아래와같다.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.pratice</groupId> <artifactId>project</artifactId> <name>ExamplePrj</name> <packaging>war</packaging> <version>1.0.0-BUILD-SNAPSHOT</version> <properties> <java-version>1.7</java-version> <org.springframework-version>4.1.4.RELEASE</org.springframework-version> <org.aspectj-version>1.7.4</org.aspectj-version> <org.slf4j-version>1.7.5</org.slf4j-version> <com.fasterxml.jackson-version>2.5.1</com.fasterxml.jackson-version> <com.amazonaws-version>1.9.23</com.amazonaws-version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- JDBC + DBCP --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework-version}</version> <exclusions> <!-- Exclude Commons Logging in favor of SLF4j --> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>${org.springframework-version}</version> </dependency> <!-- Spring aop --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${org.springframework-version}</version> </dependency> <!-- Aspectj --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.5</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.5</version> </dependency> <!-- @Inject --> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> <!-- Mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <!-- Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> <!-- IOUtil --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <!-- ArrayUtil --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version> </dependency>
<!-- Jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${com.fasterxml.jackson-version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${com.fasterxml.jackson-version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${com.fasterxml.jackson-version}</version> </dependency> <!-- AspectJ --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>${org.aspectj-version}</version> </dependency> <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${org.slf4j-version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${org.slf4j-version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${org.slf4j-version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> <exclusions> <exclusion> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> </exclusion> <exclusion> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> </exclusion> <exclusion> <groupId>com.sun.jdmk</groupId> <artifactId>jmxtools</artifactId> </exclusion> <exclusion> <groupId>com.sun.jmx</groupId> <artifactId>jmxri</artifactId> </exclusion> </exclusions> <scope>runtime</scope> </dependency> <!-- @Inject --> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> <!-- Servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- Test --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-eclipse-plugin</artifactId> <version>2.9</version> <configuration> <additionalProjectnatures> <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature> </additionalProjectnatures> <additionalBuildcommands> <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand> </additionalBuildcommands> <downloadSources>true</downloadSources> <downloadJavadocs>true</downloadJavadocs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <configuration> <source>1.6</source> <target>1.6</target> <compilerArgument>-Xlint:all</compilerArgument> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <mainClass>org.test.int1.Main</mainClass> </configuration> </plugin> </plugins> </build> </project> |
설정을 하고 save를 누르면 시간이 좀걸린후에 정상적으로 라이브러리를 받았을것이다.
아여기서 개인 취향인지는 모르겠지만 나는 패키지를 볼때 Hierarchical를 좋아한다. 보기도편하고
Project Explorer탭 오른쪽 화살표에 설정할 수 있다.
정상적으로 바뀌었다면 위와 다르게 아래와 같이 바뀐다.
이제 좀보기 편해졌다. controller package에 이제 클래스를 추가해보자.
간단하게 TestController라고 만들어보자. 클래스가 만들어졌다면 아래와 같이 코드를 작성해보자
package com.pratice.project.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @RequestMapping (value = "/test/rest", method = RequestMethod.GET) public String getName(HttpServletRequest request, HttpServletResponse response) {
return null; } } |
이게 기본구성이다.
간단하게 설명하자면
@RestController는 스프링 4.x대에서 제공하는 스프링 라이브러리를 사용하여 컨트롤러를 구성해주고
@RequestMapping 을 이용하여 URL를 설정해주고 Method는 Get방식으로 설정했다는 소리다.
Method이름은 getName으로 지정해주었는데 자신의 컨트롤러 성격에 맞추어 네이밍을 해주면된다.
이제 리턴시켜줄 객체 즉 Model를 만들어보자.
아래와같이 말이다.
모델 패키지 안에 Name 클래스를 만들어주자.
이 클래스는 객체의 역할을한다. 객체는 Rest를 Return할때 해당 객체를 사용하게된다.
해당 Name의 클래스를 만들었다면
간단하게 String name를 선언해주고 Get Set 메서드를 만들어주자. Get Set은 이클립스에서 제공을 해준다.
코드로 보면 아래와같다.
package com.pratice.project.model; public class Name { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } |
알다시피 get은 객체안에 포함되어있는 이름 값을 가지고 오는것이고 set 객체의 이름을 설정하는 부분이다.
이제 다시 컨트롤러로 돌아와서 아래와 같이 코드를 변경한다.
package com.pratice.project.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.pratice.project.model.Name; @RestController public class TestController { @RequestMapping (value = "/test/rest", method = RequestMethod.GET) public Name getName(HttpServletRequest request, HttpServletResponse response) { Name Testreturn= new Name(); Testreturn.setName("jiwon"); return Testreturn; } } |
변경된 내용이 보이는가? Name 객체를 리턴하게끔 바뀌었고
객체를 생성하여 해당 url로 들어오는 결과를 객체로 리턴하게끔 변경하였다.
저장을하고 서버를 재시작한후에 해당 url로 호출해보면..
내가 만든 객체가 json형태로 리턴된것을 알 수 가 있다.
정말 단순하지않은가?
Rest를 좀더 잘보기위해서는 구글의 RESTCLIENT를 설치를 추천한다.
앞으로 예제에서도 마찬가지로 필요하게 된다.
크롬 메인화면으로 가보자. 새탭의 앱을 눌러보자
여기서 웹스토어를 들어가자. 스토어 검색에 Rest Client를 검색한후 Advanced Rest client를 다운받자.
정상적으로 받으면 아래와같은 화면으로 나타난다.
누른 후 들어가서 URL를 설정해주자. Get형태로 받는것또한 설정해주자 우리가 만든 API로!
우측상단에 세이브를 눌러서 api를 저장해주자
이제 Send를 눌러보자
위와같이 200 코드가 뜨는것을 확인할수있으며 로딩타임부터 헤더값도 전부 알수 있고 리스폰스도 알 수 있다.
다음 챕터는 서비스 패키지를 만들어보고 REST PUT를 구현해서 로그로 띄우는것까지 해보자.