[B -2-27] REST 방식으로 전환

2019. 10. 4. 12:04Project B (SPMS)/Project B 파트5

반응형

@RestController

 

REST 방식에서 가장 먼저 기억해야하는 점은 서버에서 전송하는 것순수한 데이터라는 점이다.

기존의 컨트롤러에서 모델에 데이터를 담아서 뷰로 전달하는 방식이 아니므로 기존의 컨트롤러와는 조금 다르게 동작한다.

리턴타입으로 사용자가 정의한 클래스 타입을 사용할 수 있고, 이를 JSON이나 XML로 자동으로 처리할 수 있다.

 


라이브러리 구성 추가

 

pom.xml

 

더보기
<?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 https://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.spms</groupId>
	<artifactId>controller</artifactId>
	<name>SPMS_B</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<!-- <java-version>1.6</java-version> : 1.8 갱신 -->
		<java-version>1.8</java-version>
		<!-- <org.springframework-version>3.1.1.RELEASE</org.springframework-version> : 5.0.7 갱신-->
		<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	<dependencies>
		<!-- 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>
		
		<!-- Spring-test 추가 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		
		<!-- Spring-jdbc 추가 -->								
		<dependency>								
			<groupId>org.springframework</groupId>							
			<artifactId>spring-jdbc</artifactId>							
			<version>${org.springframework-version}</version>							
		</dependency>								

		<!-- Spring-tx 추가 -->								
		<dependency>								
			<groupId>org.springframework</groupId>							
			<artifactId>spring-tx</artifactId>			
			<version>${org.springframework-version}</version>							
		</dependency>								

		<!-- Hikari CP 추가 -->								
		<dependency>								
			<groupId>com.zaxxer</groupId>							
			<artifactId>HikariCP</artifactId>							
			<version>2.7.8</version>							
		</dependency>								

		<!-- MyBatis 추가 -->								
		<dependency>								
			<groupId>org.mybatis</groupId>							
			<artifactId>mybatis</artifactId>							
			<version>3.4.6</version>							
		</dependency>								

		<!-- MyBatis-spring 추가 -->								
		<dependency>								
			<groupId>org.mybatis</groupId>							
			<artifactId>mybatis-spring</artifactId>							
			<version>1.3.2</version>							
		</dependency>								

		<!-- Log4jdbc 추가 -->								
		<dependency>								
			<groupId>org.bgee.log4jdbc-log4j2</groupId>							
			<artifactId>log4jdbc-log4j2-jdbc4</artifactId>							
			<version>1.16</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>
		<!-- Log4j 라이브러리 갱신 -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</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> -->
			<!-- Log4j 컴파일 에러 대책으로 인해 코멘트 처리 -->					
			<!-- <scope>runtime</scope> -->	
		</dependency>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>
				
		<!-- Servlet (servlet-api 버전 갱신) -->								
		<dependency>								
			<groupId>javax.servlet</groupId>							
			<artifactId>javax.servlet-api</artifactId>							
			<version>3.1.0</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>
	
		<!-- Junit Test 버전 갱신 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency> 
		
		<!-- Lombok 추가 -->								
		<dependency>								
			<groupId>org.projectlombok</groupId>							
			<artifactId>lombok</artifactId>							
			<version>1.18.0</version>							
			<scope>provided</scope>		
		</dependency>
		
		<!-- jackson-databind 추가 -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.9.6</version>
		</dependency>
		
		<!-- jackson-dataformat-xml 추가 -->
		<dependency>
			<groupId>com.fasterxml.jackson.dataformat</groupId>
			<artifactId>jackson-dataformat-xml</artifactId>
			<version>2.9.6</version>
		</dependency>
		
		<!-- gson 추가 -->
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.8.2</version>
		</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>
            	<!-- maven-compiler-plugin java 버전 갱신 -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <!-- 메이븐 플러그인 추가 : 자바 기반 스프링 프로젝트용 -->
            <plugin>
            	<groupId>org.apache.maven.plugins</groupId>
            	<artifactId>maven-war-plugin</artifactId>
            	<version>3.2.0</version>
            	<configuration>
            		<failOnMissingWebXml>false</failOnMissingWebXml>
            	</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>

jackson-databind

객체를 JSON 으로 변환할 때 사용

 

jackson-dataformat-xml

객체를 XML로 변환할 때 사용

 

gson

테스트할 때 직접 자바 인스턴스를 JSON 타입으로 문자열 변환해야할 경우에 사용

 


 

REST 방식의 테스트

 

GET방식이 아닌 POST 등의 방식으로 지정되어 있으면서 JSON 형태의 데이터를 처리하는 것을 브라우저에서 개발하려면 많은 시간과 노력이 들어간다.

 

@RestController를 쉽게 테스트할 수 있는 방법은 주로 REST 방식의 데이터를 전송하는 툴을 이용하거나 JUnit spring-test 를 이용해서 테스트하는 방식을 고려할 수 있다.

 

JUnit의 테스트 장점은 톰캣 서버를 구동하지않고도 컨트롤러를 구동해볼 수 있다는 점이다.

 

기타 도구로는 Chrome 브라우저 앱스토어(chrome://apps/)로 이동해서 'REST client' 검색하면 상당히 많은 크롬 확장 프로그램을 볼 수 있다.

(*) 2020-01-01 : 현재 Talend API Tester 로 바뀐 듯 하다.

여러 확장 프로그램 중에서 'Restlet Client'를 이용할 것이기때문에 크롬 앱스토어에서 설치한다.

설치하면 크롬 브라우저 주소창 옆에 아이콘을 통해 바로 실행이 가능하다.

 


다양한 전송방식

 

작업 전송방식
Create POST
Read GET
Update PUT
Delete DELETE

 

REST 방식은 URI와 같이 결합하므로 회원(member)라는 자원을 대상으로 전송방식을 결합하면 다음과 같다.

작업 전송방식 URI
등록 POST /members/new
조회 GET /members/{id}
수정 PUT /members/{id} + body (json 데이터 등)
삭제 DELETE /member/{id}

 

POST, PUT, DELETE 방식은 브라우저에서 테스트하기 쉽지 않기때문에 JUnit 이나 Restlet Client 와 같은 도구를 이용해서 테스트하고 개발해야 한다.

반응형

'Project B (SPMS) > Project B 파트5' 카테고리의 다른 글

[B -2-32] Ajax 댓글 처리 5  (0) 2019.10.06
[B -2-31] Ajax 댓글 처리 4  (0) 2019.10.06
[B -2-30] Ajax 댓글 처리 3  (0) 2019.10.06
[B -2-29] Ajax 댓글 처리 2  (0) 2019.10.06
[B -2-28] Ajax 댓글 처리 1  (0) 2019.10.04