스프링

 

 

 

https://projects.spring.io/spring-framework/

 

스프링으로 간단한 블로그를  빠르게 개발해 보자.

2017- 10- 11일 현재 GA 가 5.0.0 까지 되었다.

GA(General Availability, General Acceptance)는 필요한 모든 상업화 활동이 완료되어 웹이나 물리 매체를 통해 시장에서 이용할 수 있게 됨을 의미한다. GA와 거의 비슷한 의미의 다른 용어로 FCS(First Customer Shipment)가 있다. 썬마이크로시스템즈와 시스코와 같은 일부 기업들은 자사의 소프트웨어 버전에 FCS라는 용어를 사용한다.

 

 

안정된 버전 

4.3.12 로 이나 4.3.0 을 사용하겠다.

스프링이 설정 하는데 참 까다롭다.  스프링 버전에 따른 라이브러리 설정 때문에 그렇다.

 

다음과 같은 방법으로 프로젝트를 생성하자.

 

1 . Spring Legacy Project

 

 

 

2. Spring  MVC Project 선택

 

 

 

프로젝트를 생성 했으면 다음과 같이 변경하자.

3. 프로젝트 마우스 우클릭 -> properties  클릭 하면 다음과 같은 화면이 나온다.

아래 그림처럼  3.1 과 1.8 로 변경하자.

 

 

 

4. 메뉴에서 윈도우 ->   preferences

자바 컴파일 버전도 1.8 로 변경하자.

 

 

5. pom.xml  의 properties 를 다음과 같이 변경하자.

	<properties>
		<java-version>1.8</java-version>
		<org.springframework-version>4.3.0.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>

 

 

6. 이클립스 톰켓을 연동 하자.

 

이클립스 톰캣 연동방법  

=>http://itpangpang.xyz/213

 

 

 

7. 충돌 방지를 위해 포트 설정을 변경하자.

 

8. 루트로 변경하자.

 

macaronics.net/index.php/m01/jsp/view/1352

 

 

 

9. 실행 해보자.

http://localhost:7070/

 

위 내용을 잘 따라 했으면  http://localhost:7070/   주소에서 

Hello world!  

출력 되는 것이 정상이다.

 

 

 

10. MySQL 을 설치하자.

 

MySQL 다운로드 및 설치 방법 (MySQL Community Server GPL 무료버전)

 

Windows10에서 MySQL 5.7 설치하기

 

 

11. MySQL 새로운 스키마 추가 및 유저를 생성하자.

 

 

 

command 를 실행 해서 다음과 같은 방법으로 스키마 생성 및   유저를 생성한 후 권한을 부여 하자.

 

 

create user 'simpleblog'@'localhost' identified by '1111';

create database simpleblog character set=utf8;


grant all privileges on simpleblog.* to 'simpleblog'@'localhost';

 

 

커맨드 창에 status 로 입력하자.

 

-- mysql 환경 정보 보기 : status 

 

--Connection id:          2
--Current database:
--Current user:           root@localhost
--SSL:                    Not in use
--Using delimiter:        ;
--Server version:         5.7.9-log MySQL Community Server (GPL)
--Protocol version:       10
--Connection:             localhost via TCP/IP
--Server characterset:    utf8
--Db     characterset:    utf8
--Client characterset:    utf8
--Conn.  characterset:    utf8
--TCP port:               3305
--Uptime:                 2 hours 24 min 19 sec
--
--Threads: 3  Questions: 134  Slow queries: 0  Opens: 127  Flush tables: 1  Open t
--ables: 120  Queries per second avg: 0.015
----------------

 

utf8 로 되어 있어야 한글 깨짐이 없다.

 

 

12. DB 툴을 설치 해 보자.

Mysql 을 설치 했으면 workbench 가 설치 되는데. workbench 를 사용하던지,

개인 취향에 맞게 사용하면 되겠다.

 

참고  ) DB 툴로 이클립스 토드를 사용 

Toad의 강력한 기능을 eclipse 안에서 - Toad Extension for eclipse

 

http://macaronics.net/index.php/m01/jsp/view/1353

 

 

 

13. MySQL 연결 테스트 위한 Connector/j 설치

 

메이븐 저장소  mvnrepository 로 가면 버전에 따른 많은 라이브러리를 볼 수 있다.

 

http://mvnrepository.com/artifact/mysql/mysql-connector-java

 

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.44</version>
</dependency>

 

pom.xml 에 추가하자.

 

라리브러리를 설치했으면 Hello world!   가 잘 뜨는 지 재 구동 시켜보자. 

스프링은 항상 라이브러리 버전에 민감해서  충돌과 에러가 발생한다. 

 

그리고 mysql 의 경우 현재 자신의 설치한 mysql 버전과도 맞아 한다.  그렇지 않으면 에러가 난다.

즉 mysql-connector-java  버전 설정은 스프링 버전과 mysql 설치 버전에 따라 맞게 설치하자.

 

스프링은 설정에 문제가 있다면 정상적 작동이 안 되기 라이브러리 설정 및 기타 설정후  테스트를 해 봐야 한다.

그렇지 않으면 차후에 개발 코드 작성후 실행 했을때, 설정 문제인지 개발 코드 문제인지 찾다가 시간을 보낼 수 있다.

 

 

14. MySQL 연결 테스트 위한 junit


 

스프링의 템플릿 프로젝트를 생성한 순가 테스트와 관련된 jUnit 설정이 완료된 상태이므로 개발자는 테스트 관련 코드를 

작성하고 바로 실행할 수 있다.

@Test :  테스트해야 하는 내용을 메소드 안에 작성하고 메소드 위에 @Test 애노테이션을 추가 하면 jUnit 은 해당 메소드를 

테스트용 코드로 간주하고 테스트를 진행할 수 있게 한다.

 

@ Before : 모든  테스트 작업에 앞서 준비되어야 하는 내용을 작성해서 메소드에 추가하는 애노테이션이다. @Test 메소드의 

실행 전에 실행되기 때문에 테스트를 위한 준비 작업을 할 대 상요한다.

 

@After : 테스트 작업이 끝난 후 자동으로 실행되는 메소드에 추가하는 애노테이션이다.

 

 

스프링 프로젝트를 생성하면 기본적인  junit 버전이 4.7 버전이다. 

 

메이븐 저장소 로 가서 버전별로 생성년도를 살펴 보자. 4.7버전이 2009 년도에 생성 되었다.

http://mvnrepository.com/artifact/junit/junit

 

최신 버전인 4.12 로 사용하자.   버전이 낮으면 안된다. 그리고   숫자 4.7 이 더 높은데 최신이라고 생각 하면 착각이다.

<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

 

 

 

15. JDBC 연결 테스트 코드를 만들어 보자

mysql-connector 버전이 맞는지 연결이 되는지 테스트 해보자.

 

보통 3306이 정상인데  localhost:3305  필자는 변경했기 때문에  localhost:3305 설정 했다.

각자 알아서 환경에 맞게 포토버호를 부여하고  데이터베이스 스키마 설정,  USER , PW  설정하자.

package net.macaronics.web;

import java.sql.Connection;
import java.sql.DriverManager;

import org.junit.Test;

public class MySQLConnectionTest {

	private static final String DRIVER ="com.mysql.jdbc.Driver";
	
	private static final String URL ="jdbc:mysql://localhost:3305/simpleblog?characterEncoding=utf8";
	
	private static final String USER ="simpleblog";
	
	private static final String PW="1111";
	
	
	@Test
	public void testConnection() throws Exception{
		
		Class.forName(DRIVER);
		
		try(Connection con =DriverManager.getConnection(URL, USER, PW)){
			System.out.println("test");
			System.out.println(con);
		}catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	
	
	
}

 

 

 

파일 선택후 마우스 우클릭후  Run As  -> junit 클릭 

또는 alt+shift+x , t  를 해서 실행 해보자.

 

 

 

 

 

다음과 같은 에러 메시지가  URL에 파라미터 값을 추가해서 다음과 같이 변경하자.

Thu Oct 12 18:22:23 KST 2017 WARN:
 Establishing SSL connection without server's identity verification
 is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements 
SSL connection must be established by default if explicit option isn't set. For compliance
 with existing applications not using SSL the verifyServerCertificate property is set to 'false'.
 You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide
 truststore for server certificate verification.


 

    
    private static final String URL ="jdbc:mysql://localhost:3305/simpleblog?characterEncoding=utf8&useSSL=false";

    

 

 

16. MyBatis 라이브러리를 추가하자.

 

http://mvnrepository.com/artifact/org.mybatis/mybatis

 

mybatis

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.2.8</version>
</dependency>

 

3.2.8 이 아닌 상위 버전이나 혹은 버전이 틀릴경우 23번 에 적어놓은  에러 현상이 발생할 수 있다. 

에러가 발생하면 버전을 확인 한다.   

 

 

Mybatis Spring

http://mvnrepository.com/artifact/org.mybatis/mybatis-spring

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.2</version>
</dependency>

 

 

17. spring-jdbc 라이브러리를 추가하자.

 

Spring JDBC

http://mvnrepository.com/artifact/org.springframework/spring-jdbc

 

또는 다음 이미지 처럼 이클립스에서 진행 해보자.

 

 

다음과 같이 변경하자. 스프링 4.3.0 에 맞게 jdbc 가 버전이 설정 되어 진다.

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
	

 

 

18. spring-test 라이브러리를 추가하자.

 

spring-test 는 스프링과 MyBatis 가 정상적으로 연동되었는지를 확인하는 용도로 사용된다. 

WAS 의 구동 없이 정상적으로 동작하는지를 확인하는 용도로 사용된다.

 

spring-jdbc 를 설정 했던 방법과 같이 이클립스에서 진행해보자.

메이븐 저장 소 주소는 다음과 같다.

 

Spring TestContext Framework

http://mvnrepository.com/artifact/org.springframework/spring-test

 

${org.springframework-version} 로 변경하자.

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

 

 

스프링을 실행해 Hello World 가 실행 되는지 테스트 해보자.

이상없이 잘 작동 된다면.  라이브러리 버전에 아무런 문제없가 없는 것이다.

 

이클립스에서 메이븐에서 라이브러리를 다운 못 받거나  라이브러리를 변경 했음에도 불과하고 설정이 안 된 경우가 있다.

이럴때는 이클립스 메뉴에서 project 클릭 후 clean 과 , 톰켓 클린을 해보자. 

그리고 프로젝트 우 클릭후 Maven  -> update project 를 해 보자.  중요한것은  maven update project 를 하면  project facets 가 초기화된다

3번 으로 올라가서 다시 설정하자.

 

 

19. root-context.xml  , servlet-context.xml  파일을 수정 하자.

 

src/main/webapp/WEB-INF/spring/root-context.xml 파일은 STS 가 스프링 프로젝트를 생성할 때 만들어 주는 파일이다.

웹 자원과 관련되지 않은 모든 자원의 설정을 위해 존재한다.

웹과 관련된 설정은 servlet-context.xml 에서 관리한다.

 

 

root-context.xml 에서 네임 스페이스를 그림과 같이 추가하자.

 

 

 

19. DataSource 설정 하기.

DataSource 는 JDBC 의 커넥션을 처리하는 기능르 가지고 있기 때문에 데이터베이스와 연동 작업에 필요하다.

<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 <property name="driverClassName" value="com.mysql.jdbc.Driver" />
 <property name="url" value="jdbc:mysql://localhost:3305/simpleblog?useSSL=false" />
 <property name="username" value="simpleblog"  />
 <property name="password"  value="1111"/>
</bean>

 

 

20. DataSource 의 테스트 진행

 

DataSource  연결 테스트를 하려면 서버를 구동 시키는 것이 정상이다.

그러나 WAS 구동없이 연결 테스트를 진행 해보자.

package net.macaronics.web;

import java.sql.Connection;

import javax.sql.DataSource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring/**/*.xml"})
public class DataSourceTest {

	@Autowired
	private DataSource ds;
	
	@Test
	public void testConnection() throws Exception{
		try(Connection conn =ds.getConnection()){
			System.out.println(conn);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}










 

ctrl+F11 을 눌러 junit 을 실행하자.

 

@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring/**/*.xml"})

 

locations 속성 경로에 xml 파일을 이용해서 스프링이 로딩된다.

 

-------------------

@Autowired, @Resource, @Inject의 차이

이번에 소개하는 세가지 어노테이션 @Autowired, @Resource,@Inject은 모두 의존관계를 자동으로 연결해주는 기능을 가진 어노테이션입니다. 다만 조금씩의 차이가 있습니다. 

                          @Autowired                            @Inject                                 @Resource 

  범용              스프링 전용                             자바에서 지원                자바에서 지원

 연결방식  타입에 맞춰서 연결           타입에 맞춰서 연결          이름으로 연결

 

 

 자세한 설명을 하자면, @Inject와 @Resource는 JSR에 실려있는 자바 기존의 어노테이션입니다. 반면 @Autowired의 경우에는 스프링에서 등장한 어노테이션입니다. 따라서 스프링 이외에서는 사용 할 수 없습니다. 만약에 프로젝트를 스프링에서 다른 프레임워크로 바꿀 생각이 있으시다면 @Autowired보단 @Inject나 @Resource를 쓰시면 됩니다. 다만 이런 경우는 거의 없다고 봅니다.

 

또한 연결 방식은 @Autowired와 @Inject는 타입에 맞춰서 하는 반면, @Resource는 이름에 맞춰서 연결하게 됩니다. 예를 들어보겠습니다.

 

Bird 인터페이스를 상속하는 Chicken과 Penguin 이라는 클래스가 있다고 합시다. 

Chicken과 Penguin 클래스를 연결할 것이므로 @Component로 빈에 등록해주었습니다.

 

public class Bird{}

@Component

public class Chicken implements Bird{}

@Component

public class Penguin implements Bird{}

 

  

그리고 다음과 같이 연결해봅시다.

@Autowired

private Chicken penguin;  //Chicken 타입으로 연결됩니다.



@Inject

private Penguin chicken; //Penguin 타입으로 연결됩니다.



@Resource

private Chicken penguin;  //penguin 타입으로 연결됩니다만, Chicken 클래스를 자료형으로 두었기에 캐스팅이 되지 않아 에러가 납니다



@Resource

private Bird penguin;      //penguin 타입으로 연결되어 호출해보면 penguin 클래스의 값을 호출하는 것을 볼 수 있습니다.



@Autowired와 @Inject의 경우에도 @Qualifier 어노테이션을 사용하면, 타입 이외의 방법으로도 연결 할 수 있습니다.

 

@Autowired

@Qualifier("chicken")

pirvate Brid penguin;

 

위와 같이 쓰면 이름에 상관없이 Chicken 타입으로 연결되는 것을 알 수 있습니다.

이렇게 @Qualifer와 함께 쓰면 더욱 강력한 기능을 쓸 수 있는 장점이 있습니다.

[출처] [Spring] @Autowired, @Resource, @Inject의 차이|작성자 심해

 

-------------------

 

 

 

21. MyBatis 연결

16번의  라이브러리 설정을 참조하자.

 

SqlSessionFactory 객체 는

MyBatis와 스프링 연동 작업에서의 핵심은 Connection 을 생성하고, 처리하는 SqlSessionFactory  이다. 

SqlSessionFactory  는 SQL 의 실행에 대한 모든 것을  가진 가장 중요한 객체이다.

 

	<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
	 <property name="dataSource" ref="datasource"></property>
	</bean>

 

 

src/main/resources 내에 mybatis-config.xml 파일을  생성하자.

 

MyBatis logo

 

http://www.mybatis.org/mybatis-3/ko/getting-started.html

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

 

root-context.xml 에 다음과 같이 추가 하자.

	     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
          <property name="dataSource" ref="dataSource"  />
        <property name="configLocation"  value="classpath:/mybatis-config.xml"  />
    </bean>
    

	

 

 

22. MyBatis 연결 테스트

package net.macaronics.web;


import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring/**/*.xml"})
public class MyBatisTest {

	@Autowired
	private SqlSessionFactory sqlSessionFactory;
	
	
	@Test
	public void testSqlSessionFactory(){
		System.out.println(sqlSessionFactory);
	}
	
	@Test
	public void testSession() throws Exception{
		try(SqlSession session=sqlSessionFactory.openSession()){
			System.out.println(session);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	
}

 

 

 

 

23. pom.xml 라이브러리 잘못 설정에 대한  에러  현상.

 

java.lang.NoSuchMehtodError 의 에러 현상이 나타날 수 있다.

코드상의 라이브러이에서는 전혀 문제가 없는 경우 발생할 때에는 주로 classpath 상에서 중복되는 class 가 있어서 

정상적으로 method 를 찾지 못해서 발생하는 문제이다.

만약, 스프링에서 라이버리 설치 후 이와 같은 에러 현상이 발생한다면 pom.xml 에서 중복된 라이브러리가 존재한지

확인 해본다. 

요약하자면,  스프링에서 라이브러리 충돌이다.

 


java.lang.NoClassDefFoundError:  과 같은 에러 현상이 발생한다면.

클래스 패스를 찾지 못한다는 것이다.  컴파일 된 클래스 파일 또는  라이브러리 설정에 대한 파일 위치를 찾지 못한다는 것이다.

스프링에서 이와 같은 현상이 발생한다면 

스프링 버전과  설치된 라이브러리 버전과 호환성이 안 맞아서 클래스 파일을 찾을 수 없다는 에러일 수 있으니.

설정된 라이브러리 버전을 높이던지 혹은 낮추던지 해서 스프링 버전과 맞춰야 한다.

 

 

24. servlet-context.xml

servlet-context.xml 은 스프링 MVC 관련 설정만을 분리하기 위해 서 만들어진 파일이다.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.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 -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	
	<context:component-scan base-package="net.macaronics.web" />
	
	
  
	
	
</beans:beans>

 

 

<annotation-driven /> 의 설정은 클래스 선언에 애노테이션을 이용해서 컨트롤러를 작성할 수 있다는 선언이다.

 

InternalResourceViewResolver     부분은 뷰를 어떻게 처리하는 가에 대한 설정이다.

 

/WEB-INF/views/   는 절대 브라우저에서 직접 접근할 수 없는 경로로서 반드시 컨트롤러의 호출에 의해서만 views 안의 파일에 

접근할 수 있다.

 

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

는 웹에서 이미지나 CSS,  javaScript 파일과 같이 고정된 자원들의 위치를 의미한다.

사용 예  

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving 
		up static resources in the ${webappRoot}/resources directory 
	이미지, 자바스크립트, 스타일시트 등의 리소스에 대한 매핑 정의
	mapping="url pattern" logaction="실제경로" 
	-->
	<resources mapping="/resources/**" location="/resources/" />
	<resources mapping="/resources/temp/**" location="/resources/temp/" />
		
	<resources mapping="/coupon/**" location="/WEB-INF/uploads/coupon/" />
	<resources mapping="/promotions/**" location="/WEB-INF/uploads/promotions/" />
	
	<resources mapping="/mailbox/**" location="/WEB-INF/uploads/mailbox/" />
	<resources mapping="/products/img/**" location="/WEB-INF/uploads/productsImg/" />
	<resources mapping="/mainbanner/**" location="/WEB-INF/uploads/mainbanner/" />
	
	<resources location="/WEB-INF/upload/andorid/" mapping="/andorid/**" />
	

 

 

 

<context:component-scan base-package="net.macaronics.web" />

 component-scan 은 base-package 속성값에 해당하는 패키지 내부의 클래스를 조사한다는 뜻이다.  <annotation-driven /> 과 

같이 결합해서 해당 패키지에 애노테이션 처리가 된 컨트롤러를 작성만 해주면 자동으로 인식 된다.

사용예 :

	
	<!-- 스프링 빈을 태그로 등록하지 않고 자동으로 검색(auto scan) --> 
	<context:component-scan base-package="com.macaronics.www" />
	<context:component-scan base-package="com.macaronics.www.*" />
	<context:component-scan base-package="com.macaronics.www.com.macaronics.www.util.captcha" />
	
	

 

 

braverokmc.cafe24.com  의 스프링 으로 필자가 단독으로  개발한 사이트의 servlet-context.xml 파일 예이다.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:security="http://www.springframework.org/schema/security"
    xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
    xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.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
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

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

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />
      <!-- aop의 설정을 통한 자동적인 Proxy 객체 설정 --> 
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    <!-- 트랜잭션 처리 -->
    <tx:annotation-driven/>
            
        
        

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving 
        up static resources in the ${webappRoot}/resources directory 
    이미지, 자바스크립트, 스타일시트 등의 리소스에 대한 매핑 정의
    mapping="url pattern" logaction="실제경로" 
    -->
    <resources mapping="/resources/**" location="/resources/" />
    <resources mapping="/resources/temp/**" location="/resources/temp/" />
        
    <resources mapping="/coupon/**" location="/WEB-INF/uploads/coupon/" />
    <resources mapping="/promotions/**" location="/WEB-INF/uploads/promotions/" />
    
    <resources mapping="/mailbox/**" location="/WEB-INF/uploads/mailbox/" />
    <resources mapping="/products/img/**" location="/WEB-INF/uploads/productsImg/" />
    <resources mapping="/mainbanner/**" location="/WEB-INF/uploads/mainbanner/" />
    
    <resources location="/WEB-INF/upload/andorid/" mapping="/andorid/**" />
    
    
    <beans:bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/jsp/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>
    

    
    <!-- 스프링 빈을 태그로 등록하지 않고 자동으로 검색(auto scan) --> 
    <context:component-scan base-package="com.macaronics.www" />
    <context:component-scan base-package="com.macaronics.www.*" />
    <context:component-scan base-package="com.macaronics.www.com.macaronics.www.util.captcha" />
    
    
    <beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <beans:property name="maxUploadSize" value="10485760" />
    </beans:bean>


    <!-- 파일 업로드을 위한 디렉토리 설정 -->
    <beans:bean id="uploadPath" class="java.lang.String">
        <beans:constructor-arg value="d:/upload" />
    </beans:bean>
    
    
    
    <!-- 인터셉터 -->
    <beans:import resource="interceptor-context.xml"/>
    
    
    <interceptors>

        <interceptor>
            <mapping path="/**"/>
            <beans:ref  bean="sampleInterceptor"/>
        </interceptor>        
    
        <interceptor>
            <mapping path="/member/login.do"/>
            <beans:ref bean="loginInterceptor"/>
        </interceptor>
        
        
        <!-- 로그인한 유저만 접근 가능한 페이지 -->
        <interceptor>
            <mapping path="/board/write.do"/>
            <mapping path="/board/insert.do"/>
            <mapping path="/board/update.do"/>
            <mapping path="/shop/cart/insert.do/**"/>
            <mapping path="/shop/cart/list.do" />
            <mapping path="/shop/cart/cartDelete.do"/>
            <mapping path="/shop/order/**" />
            <mapping path="/users/**" />
            <beans:ref bean="authInterceptor"/>
        </interceptor>
        
        <interceptor>
            <mapping path="/member/logout"/>
            <beans:ref bean="logOutIntercepor" />
        </interceptor>
        
        <!-- 관리자만 접근 가능한 페이지 -->
        <interceptor>
            <mapping path="/admin/**"/>
            <exclude-mapping path="/resources/**"/>
            <exclude-mapping path="/products/img/**"/>
            <exclude-mapping path="/admin/gallery/displayFile"/>
            <beans:ref bean="adminInterceptor" />
        </interceptor>
    </interceptors>


    
    <!--  mybatis mapper interface bean 을 자동으로 검색하여 생성함 -->
    <mybatis-spring:scan base-package="com.macaronics.www.user.model.dao.memo"/>
    

</beans:beans>








 

 

 

25. 스프링 MVC 어노테이션 

 

  • @Controller
  • 프리젠테이션 레이어를 구성하는 Controller 클래스를 정의하는데 사용하며, Spring MVC 기반인 경우에 한해 활용 가능하다.

 

  • @Service
  • 비즈니스 로직을 처리하는 클래스를 정의하는데 사용한다.

 

  • @Repository
  • DB 처리를 위해 DAO영역 혹은 퍼시스턴스 영역을 정의하는데 사용한다.

 

출처 : Spring Framework: annotation 정리 #1

 

 

 

26. JSON 처리 

 

pom.xml 을 사용해서 Jackson-databind 라이브러리를 추가한다.

 

http://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind

		<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.8.10</version>
		</dependency>

 

JSON 데이터를 생성하기 위해서 사용자는 적절한 객체를 반환해 주고,  @ResponseBody 애노테이션을 추가 한다.

 

 

	@RequestMapping("/doJson")
	public @ResponseBody ProductVO doJson(){
		ProductVO vo =new ProductVO("상품 2", 70000);
		return vo;
	}
	
	@RequestMapping("/doJSON")
	public @ResponseBody Map<String, Object> doJSON(){
		Map<String, Object> map=new HashMap<>();
		map.put("name", "홍길동");
		map.put("age", "21");
		return map;
	}
	
	

 

 

 

 

 

[Spring] Restful한 스프링 @ResponseBody vs @RestController

@ResponseBody 와 @RestController 두가지 차이점을 알아보기 전에 우선 스프링에서 REST하게 데이터가 송수신 되는 과정은 다음과 같다.

 

  1. 클라이언트에서 웹서비스에 요청을 보냄.
  2. Handler Mapping과 그 타입을 찾는 Dispatcher Servlet에 의해 요청이 가로채짐.
  3. 요청은 Controller에 의해 처리되고 응답은 Dispatcher Servlet으로 반환되고 Dispatcher Servlet은 다시 View로 보내게 됩니다.

 

@ResponseBody

 

메소드에서 @ResponseBody 어노테이션을 사용하면 Spring은 반환 값을 변환하여 HTTP Response 에 자동으로 씁니다. Controller 클래스의 각 메소드에는 @ResponseBody 어노테이션이 있어야합니다.

 

@RestController

Spring 4.0은 @Controller와 @ResponseBody 을 합쳐놓은것 이상의 역할을 수행하는@RestController를 추가했습니다. 컨트롤러 클래스에 @RestController 어노테이션을 작성함으로써 더 이상 @ResponseBody를 모든 요청 매핑 메소드에 추가 할 필요가 없습니다.

 

결론

스프링을 restful하게 만들 때, 앞으로는 스프링 4.0 부터 추가된 @RestController을 활용하므로써 기존의 @ResponseBody in @Controller 방식을 벗어나 좀 더 쉽게 restful한 코드를 작성할 수 있습니다.

출처: http://highcode.tistory.com/24 [HighCode]

 

@RestController와 @Controller 차이

@RestController : 뷰가 필요없는 API만 지원하는 서비스에서 사용, @ResponseBody를 포함하고 있음
@Controller : API와 뷰를 동시에 사용, 대신 API 서비스는 @ResponseBody를 붙여줘야 함

 

 

27. WAS 없이 컨트롤러 테스트  -- 

WAS 에 만들어진 컨트롤러 코드를 수정해서 배포하는 것 보다 다음과 같은 방법으로 

 빠르게 테스트를 진행 할 수 있다.


스프링은 spring-test 모듈을 통해서 별도의 WAS 구동 없이도 컨트롤러를 테스트하는 작업이 가능하다.  스프링 3.2 버전부터 jUnit 만을

사용해서 스프링 MVC 에서 작성된 컨트롤러를 테스트 할 수 있다. 

spring-test 를 사용해서 실행할 때 가능하면 WAS servlet 스펙 버전을 일치시켜 테스트 해야한다.

WAS를 실행하지 않고 컨트롤러를 테스트하려면  pom.xml 의 servlet 버전을 높여줘야 한다.

 

		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>

 

=> 변경

		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
		</dependency>

 

테스트 방법 예

컨트롤러

	@RequestMapping("/doJSON")
	public @ResponseBody Map<String, Object> doJSON(){
		Map<String, Object> map=new HashMap<>();
		map.put("name", "홍길동");
		map.put("age", "21");
		logger.info(" doJSON ( )  -  {} " , map.toString()); 
		return map;
	}

 

테스트

일반적인 테스트 방법에  @WebAppConfiguration  의 어노테이션을 추가 하였다.

MockMvc  는 브라우저에서 요청과 응답을 의미하는 객체로 간주하는 객체이다.

@Before 어노테이션을 적용해서

MockMvcBuilders.webAppContextSetup(this.wac).build();

의 코드로 객체를 실행전 매번 생성 해준다.

perform 은 get. post 방식의 호출을 사용해 테스트할 url 값을 넣으면 된다.

package net.macaronics.web;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring/**/*.xml"})
public class SampleControllerTest {

	private static final Logger logger= LoggerFactory.getLogger(SampleController.class);
	
	@Autowired
	private WebApplicationContext wac;
	
	private MockMvc mockMvc;
	
	@Before
	public void setUp(){
		//실행전 매번 mockMvc 객체를 생성 한다.
		this.mockMvc=MockMvcBuilders.webAppContextSetup(this.wac).build();
		logger.info("setUp ----");
	}
	
	@Test
	public void test() throws Exception{
		//perform 은 get. post 방식의 호출을 사용해 테스트할  url 값을 넣으면 된다.
		mockMvc.perform(MockMvcRequestBuilders.get("/doJSON"));
	}
	
	
	
}


 

 

 

다음 페이지에 이어서 진행. ...

 

 

제작 : macaronics.net - Developer  Jun Ho Choi

소스 :  소스가 필요한 분은 비밀 댓글로 작성해 주세요.

 

 

 

about author

PHRASE

Level 60  라이트

진정한 애국심은 그 말보다 실천에 있음을 알아야 한다. -안창호

댓글 ( 5)

댓글 남기기

작성