티스토리 뷰

Overviews

스프링 부트로 되어 있는 예제는 많으나 레거시로된 spring framework 프로젝트의 연동 예제는 찾기가 힘들었습니다. 

기존 코드에 설정을 추가했는데 에러가 발생해서 별도 프로젝트로 먼저 구성해 보고 삽입 하기로 했습니다. 

 

프로젝트 생성 

이클립스에서 프로젝트 생성

  • 프로젝트 선택
  • Spring - Spring Legacy Project 선택 
  • Simple Projects - Simple Spring Web Maven 선택 

기본 프로젝트를 생성 후 필요한 코드를 추가해서 테스트.

 

개발환경

  • spring framework 4.3.9
  • jdk 1.8
  • maven
  • eclipse

Dependency

redis 연동 dependency

* spring-data-redis 2.*는 spring framework 5.* 이상에서만 가능합니다. 

		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-redis</artifactId>
			<version>1.8.23.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.10.2</version>
		</dependency>

RestController에 필요한 dependency

* 간단한 프로젝트를 만들고 캐시에 객체를 바인딩 할 때 기본 프로젝트에 필요한 라이브러리입니다.  

		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>2.10.1</version>
		</dependency>

		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.10.1</version>
		</dependency>

전체 pom.xml

<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.springframework.samples.service.service</groupId>
	<artifactId>RedisLegacyExample</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<properties>

		<!-- Generic properties -->
		<java.version>1.8</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

		<!-- Web -->
		<jsp.version>2.2</jsp.version>
		<jstl.version>1.2</jstl.version>
		<servlet.version>2.5</servlet.version>

		<!-- Spring -->
		<spring-framework.version>4.3.9.RELEASE</spring-framework.version>

		<!-- Logging -->
		<logback.version>1.0.13</logback.version>
		<slf4j.version>1.7.5</slf4j.version>

		<!-- Test -->
		<junit.version>4.11</junit.version>

	</properties>

	<dependencies>

		<!-- Spring MVC -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring-framework.version}</version>
		</dependency>

		<!-- Other Web dependencies -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>${jstl.version}</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>${servlet.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>${jsp.version}</version>
			<scope>provided</scope>
		</dependency>

		<!-- Spring and Transactions -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring-framework.version}</version>
		</dependency>

		<!-- Logging with SLF4J & LogBack -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j.version}</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>${logback.version}</version>
			<scope>runtime</scope>
		</dependency>

		<!-- Test Artifacts -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${spring-framework.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-redis</artifactId>
			<version>1.8.23.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.10.2</version>
		</dependency>

		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>2.10.1</version>
		</dependency>

		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.10.1</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>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.6.1</version>
				<configuration>
					<source>${java.version}</source>
					<target>${java.version}</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>

 

XML 설정

application-config.xml

* JedisConnectionFactor, redisTemplate 설정 

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

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="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">

	<bean id="jedisConnectionFactory"
		class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:usePool="true"  p:hostName="192.168.***.***" p:port="6379" />

	<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connectionFactory-ref="jedisConnectionFactory" />

</beans>

 

mvc-config.xml 설정

	<!-- declare Redis Cache Manager -->
	<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager" 
	      c:redis-operations-ref='redisTemplate'>
        <property name="expires">
            <map>
                <entry key="sessionData" value="7200"></entry>
                <entry key="portalData" value="7200"></entry>
                <entry key="referenceData" value="86400"></entry>
            </map>
        </property>
    </bean>

* annotation을 사용하기 위한 설정입니다. 

	<context:component-scan base-package="eblo.cache.test.web"/>

	<mvc:annotation-driven>
	   <mvc:message-converters>
	       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
	   </mvc:message-converters>
	</mvc:annotation-driven>

* RestController에서 데이터 바인딩할 때 필요한 부분입니다. 

 

전체

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

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:cache="http://www.springframework.org/schema/cache"
	xmlns:c="http://www.springframework.org/schema/c"
	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/cache http://www.springframework.org/schema/cache/spring-cache.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

	<context:component-scan base-package="eblo.cache.test.web"/>

	<mvc:annotation-driven>
	   <mvc:message-converters>
	       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
	   </mvc:message-converters>
	</mvc:annotation-driven>

	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- Example: a logical view name of 'showMessage' is mapped to '/WEB-INF/jsp/showMessage.jsp' -->
		<property name="prefix" value="/WEB-INF/view/" />
		<property name="suffix" value=".jsp" />
	</bean>

	<!-- turn on declarative caching -->
	<cache:annotation-driven />

	<!-- declare Redis Cache Manager -->
	<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager" 
	      c:redis-operations-ref='redisTemplate'>
        <property name="expires">
            <map>
                <entry key="sessionData" value="7200"></entry>
                <entry key="portalData" value="7200"></entry>
                <entry key="referenceData" value="86400"></entry>
            </map>
        </property>
    </bean>
 

</beans>

 

web.xml 

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         id="WebApp_ID" version="2.5">

    <display-name>RedisLegacyExample</display-name>
    
   <!--
		- Location of the XML file that defines the root application context.
		- Applied by ContextLoaderListener.
	-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:spring/application-config.xml
        </param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    
    <!--
		- Servlet that dispatches request to registered handlers (Controller implementations).
	-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
            /WEB-INF/mvc-config.xml
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

연동 및 설정 끝

 

테스트를 위한 서비스 생성 

Controller 

@RestController
public class TestController {

    @Autowired
    private TestCacheService testCacheService;
    
    @RequestMapping("/test")
    public List<User> getUsers() {//Welcome page, non-rest
        return testCacheService.getUsers();
    }

    @RequestMapping("/test-refresh")
    public List<User> refreshUsers() {//Welcome page, non-rest
        testCacheService.removeCacheUsers();
        return testCacheService.getUsers();
    }
}

 

Service

@Service
public class TestCacheService {

    @Cacheable(cacheNames="userCache")
    public List<User> getUsers(){
        List<User> users = new ArrayList<>();
        users.add(new User("고객1", 21));
        users.add(new User("고객2", 22));
        users.add(new User("고객3", 23));
        return users;
    }

    @Caching(evict = {
            @CacheEvict(cacheNames="userCache", allEntries = true)
        })
    public void removeCacheUsers(){
    }
    
}

 

Domain

public class User implements Serializable{

    private static final long serialVersionUID = 1L;

    private String id;
    private int age;
    private Timestamp timestamp;
    
    public User(String id, int age) {
        this.id = id;
        this.age = age;
        this.timestamp = new Timestamp(new Date().getTime());
    }
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Timestamp getTimestamp() {
        return timestamp;
    }
    public void setTimestamp(Timestamp timestamp) {
        this.timestamp = timestamp;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }
    
}

 

도메인 클래스와 서비스에 대한 내용은 이전 글을 참고 하시면 될거 같습니다. 

2019/02/26 - [Spring Frameworks] - Spring boot - Ehcache, cache 예제

 

Spring boot - Ehcache, cache 예제

Overviews 예제를 만드는 것은 간단합니다. 먼저 Spring Starter Project로 기본 프로젝트를 생성합니다. cache 관련 dependencies를 추가해주고 설정 Configuration 추가해 줍니다. ehcache.xml 파일을 클래스패..

eblo.tistory.com

 

댓글
댓글쓰기 폼