티스토리 뷰

728x90

 

 

Ubuntu Redis 설치

 

1. apt 업데이트

sudo apt update

 

 

2. redis 설치

sudo apt install redis-server

 

 

3. redis 서버를 시스템 부팅 시 자동으로 시작하도록 설정

sudo systemctl enable redis-server.service

 

 

4. redis 서버 시작

sudo systemctl start redis-server.service

 

 

5. redis 서버 실행확인

redis-cli ping

 

- PONG으로 응답이 온다면 정상실행되는거다.

 

 

6. 설치된 redis 서버 버전 확인

redis-server --version

 

Spring Boot 연동

1. 빈 프로젝트 생성

 

 

2. pom.xml 의존성 추가

 

pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

 

 

3. yml 파일 수정

 

application.yml

spring:
  data:
    redis:
      host: localhost
      port: 6379

 

- host 부분은 redis를 설치하여 사용중인 서버의 ip주소를 입력하면된다.

- redis기본포트가 6379이므로 기본포트로 redis 설정을 추가해준다.

 

 

4. Redis Configuration 클래스 작성

 

package com.redis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

	@Bean
	public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
		RedisTemplate<String, Object> template = new RedisTemplate<>();
		template.setConnectionFactory(redisConnectionFactory);
		template.setKeySerializer(new StringRedisSerializer());
		template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
		return template;
	}

}

 


 

 

Rest API 생성

 

할일목록을 CRUD 하는 Rest API를 만들어보겠습니다.

 

1. VO 생성

 

TodoVO.java

package com.redis.vo;

import java.io.Serializable;

public class TodoVO implements Serializable {
	private static final long serialVersionUID = 1L;

	private int id;
	private String title;
	private String content;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

}

 

 

2. Redis Repository 생성

 

RedisRepository

package com.redis.repository;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

import com.redis.vo.TodoVO;

@Repository
public class RedisRepository {

	@Autowired
	private RedisTemplate<String, Object> redisTemplate;

	private static final String KEY = "TODO";

	// Todo 저장
	public void save_todo(TodoVO todo) {
		redisTemplate.opsForHash().put(KEY, todo.getId(), todo);
		;
	}

	// Todo 한건 가져오기
	public TodoVO get_todo(int id) {
		return (TodoVO) redisTemplate.opsForHash().get(KEY, id);
	}

	// Todo 여러건 가져오기
	public List<Object> get_todos() {
		return redisTemplate.opsForHash().values(KEY);
	}

	// Todo 삭제
	public Long delete_todo(int id) {
		return redisTemplate.opsForHash().delete(KEY, id);
	}
}

 

 

3. Controller 생성

 

RedisController.java

package com.redis.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;

import com.redis.repository.RedisRepository;
import com.redis.vo.TodoVO;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;


@RestController
public class RedisController {

	@Autowired
	private RedisRepository redisRepository;

	@PostMapping("/save_todo")
	public boolean save_todo(@RequestBody TodoVO todo) {
		try {
			redisRepository.save_todo(todo);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	
	@GetMapping("/get_todo/{id}")
	public TodoVO get_todo(@PathVariable int id) {
		return redisRepository.get_todo(id);
	}
	
	@GetMapping("/get_todos")
	public List<Object> get_todos() {
		return redisRepository.get_todos();
	}
	
	@DeleteMapping("/delete_todo/{id}")
	public boolean delete_todo(@PathVariable int id) {
		try {
			redisRepository.delete_todo(id);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

}

 


 

 

그럼 그렇지 한번에 될리가 없지 ^^;

 

 

1. ConnectExeption

java.net.ConnectException: Connection refused: no further information
	at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
	at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[na:na]
	at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:946) ~[na:na]
	at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:336) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final]
	at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:339) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:776) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final]
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) ~[netty-transport-4.1.111.Final.jar:4.1.111.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:994) ~[netty-common-4.1.111.Final.jar:4.1.111.Final]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.111.Final.jar:4.1.111.Final]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.111.Final.jar:4.1.111.Final]
	at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]

 

Connect 오류가 발생했다.

 

1. 방화벽에서 Redis포트를 허용하지 않아 발생한 문제였다.

 

sudo ufw allow 6379
sudo ufw reload

 

 

2. Redis 설정문제

 

- 제 경우 Redis서버가 별도의 서버에 설치되어있었기 때문에 외부에서 접근을 해야하는 경우였습니다. 그러나 Redis기본설정이 기본적으로 로컬에서만 접근을 허용했기때문에 오류가 발생했었음.

 

sudo nano /etc/redis/redis.conf

 

- 설정파일을 열고

 

bind 127.0.0.1
...
protected-mode yes
...

 

이 부분을

 

bind 0.0.0.0
...
protected-mode no
...

 

이렇게 변경함

 

- 이건 실서버로 사용한다면 보안상 문제가 발생할 수 있으니 신중하게 사용하시는게 좋을듯 합니다.


 

테스트

 

테스트에는 Post Man을 사용함.

 

1. 저장

 

 

2. 한건 가져오기

 

 

3. 여러건 가져오기

 

4. 삭제하기

 


 

 

Thank You!

728x90