728x90
반응형

https://spring.io/projects/spring-data-redis

 

Spring Data Redis

Spring Data Redis, part of the larger Spring Data family, provides easy configuration and access to Redis from Spring applications. It offers both low-level and high-level abstractions for interacting with the store, freeing the user from infrastructural c

spring.io

Spring Data Redis 란 무엇인가?

The Spring Data Redis (SDR) framework makes it easy to write Spring applications that use the Redis key-value store by eliminating the redundant tasks and boilerplate code required for interacting with the store through Spring’s excellent infrastructure support.

Spring Data Redis 는 Spring project 에서 Redis의 데이터를 쉽게 관리할 수 있게 해주는 Framework이다. RDB나 NoSQL의 경우도 각각의 Framework을 가지고 있어서 개발을 편리하게 해준다. 

 

Spring Data Redis Dependency 추가

<dependencies>

  <!-- other dependency elements omitted -->

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

</dependencies>

Dependency는 위와 같이 추가하면 되는데, Spring boot framework을 사용중이라면 아래와 같이 추가하면 된다. 

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

 

Spring boot dependency를 추가하면 좋은 점은 많이 사용되고 있는 Redis client인 LettuceJedis가 같이 추가된다. 

 

이 문서에서는 Redis 연결을 위한 작업이 아니라 Redis key를 어떻게 원하는 방식으로 추가할 것인가를 고민해보도록 하겠다. 

 

Spring Data Redis의 사용

Spring Data Redis는 사용하면 JPA 처럼 코드를 통해 Redis의 값을 저장하고 읽어 올 수 있다. 그것이 복잡한 Object 형태라고 하더라도 세분화하여 자체적으로 Key값을 만들어서 저장한다. 

 

Default Key Value

Spring Data Redis에서의 기본 key 값은 Model의 구조에 결정된다. 

@RedisHash("people")
public class Person {

  @Id String id;
  String firstname;
  String lastname;
  Address hometown;
}

유저의 Person을 저장한다고 하였을 때 간단하게 위와 같이 Model을 만들 수 있다. Key 명에 대해서 생각할 때 중요한 부분은 

`@RedisHash` annotation이다. 이 annotation은 이 Model이 Redis의 Entity라는 것을 나타내줄 뿐더러 Key의 Prefix를 결정한다. 위의 예제에서는 @RedisHash("people")이라고 되어 있는데 이럴 경우 jwtToken 이라는 이름으로 Key이름이 시작되게 된다. 

`@RedisHash`만 사용할 경우 `getClass().getName()`의 리턴값이 기본으로 들어가게 된다. 

 

즉 아래와 같은 key 값이 만들어진다. (ex. e2c7dcee-b8cd-4424-883e-736ce564363e 는 생성된 Id 값)

 

SADD people e2c7dcee-b8cd-4424-883e-736ce564363e

 

@Indexed annotation

@RedisHash("people")
public class Person {

  @Id String id;
  @Indexed String firstname;
  String lastname;
  Address hometown;
}

위의 예제의 경우 `@Indexed` annotation이 추가된 것을 볼 수 있다. `@Indexed`을 추가되면 Secondary Index가 추가된다고 생각하면 된다. 이 말은 사용자가 Key 값에 원하는 구분자를 추가하여 검색을 용이하게 하는 역할을 한다. 

 

예를 들어 아래와 같이 Redis에 Data를 저장시킨다. 

repository.save(new Person("rand", "althor"));

이 경우 실제 Redis에서는 아래와 같은 명령들이 수행된다. 

HMSET "people:19315449-cda2-4f5c-b696-9cb8018fa1f9" "_class" "Person" "id" "19315449-cda2-4f5c-b696-9cb8018fa1f9" "firstname" "rand" "lastname" "althor" 
SADD  "people" "19315449-cda2-4f5c-b696-9cb8018fa1f9"                           
SADD  "people:firstname:rand" "19315449-cda2-4f5c-b696-9cb8018fa1f9"            
SADD  "people:19315449-cda2-4f5c-b696-9cb8018fa1f9:idx" "people:firstname:rand"

우선 HMSET 명령어를 통해서 Model에 입력된 전체 정보가 HashMap으로 저장된다. 그때의 key값은 `Prefix:Id` 구조로 저장된다. 

하지만 사용자의 검색을 위해서 SADD "people:firstname:rand" 라는 Set에 Id를 저장해 두고 사용자의 `repository.findByFirstname()` 검색이 가능하도록 저장을 한다. 

마지막 라인의 경우 Secondary Index의 Update 와 Delete를 위해 Set을 저장한다. 이 곳에는 전체 Secondary Index들을 저장한다고 생각하면 된다. 

 

오늘은 간단하게 어떻게 Key가 생성되는지 알아보았다. 

 

사실 이 내용에 대해서 공부하게 된 이유는 내가 개발하고 있는 서비스에서 Redis Key Convention(Key naming rule)을 가져갈 것인지 고민하면서 시작되었다. MSA(Micro Service Architecture)에서 여러 Service에서 Redis에 정보를 저장할 경우 Key 값의 구조를 잘 만들어야지 나중에 어떠한 이유로 인해 key값을 확인해야할 때 또는 서비스에서 값을 가져오기 위해 Key값을 만들 때 쉽게 할 수 있을 것 같기 때문이다. 

 

이 부분에 대한 고민은 다음 포스트로 넘기겠다. 

728x90
반응형
728x90
반응형

Server API의 Request 나 Response 의 String이 모두 영어로 되어 있을 경우에는 문제가 없지만, 에러메세지나 Validation 메세지 등을 한글로 보낼 경우에는 `UTP-8` Encoding 을 사용해야 한다. 그럼 언어를 Character Encoding을 설정하는 방법에 대해서 알아보자. 

 

Spring에서 Character Encoding을 설정하기 위해서는 Configuration annotation을 활용하여 Bean으로 Character Encoding Filter를 등록시키면 된다. 

 

내 개인 프로젝트에서는 아래와 같이 간단하게 AppConfig class를 만들어 두었다. 

 

 

 

728x90
반응형
728x90
반응형

Spring boot application을 실행해보면 아래와 같은 기본적인 banner가 보여진다. 

 

이것은 기본적으로 Spring boot dependecy에 추가되어 있는 banner이다. 하지만, 변경을 하고 싶다면 변경이 가능하다. 

Microservice의 service는 각자의 이름이 있으므로 그 이름으로 보여지는 것이 더 좋지 않을까?

 

그래서 바꿔보겠다.

 

감사하게도 Online Spring Boot Banner Generator 라는 사이트가 있고 우리는 여기 안에 있는 폰트로 Banner의 내용을 채워볼 것이다. 

 

우선 banner.txt. 파일을 `src/main/resources` 아래에 생성한다. 다음 위 사이트로 가서 원하는 이름으로 Banner 내용을 만든다.

일단 기본 Banner Font로 간단하게 생성하였다. 

 

아래의 표시된 내용을 복사하여 banner.txt 로 옮긴다. 그리고 수행해보면 Banner가 변경된 것을 알 수 있다. 

 ,---.                           ,--.
'   .-'   ,---.   ,---.   ,---.  `--'  ,---.  ,--,--,
`.  `-.  | .-. : (  .-'  (  .-'  ,--. | .-. | |      \
.-'    | \   --. .-'  `) .-'  `) |  | ' '-' ' |  ||  |
`-----'   `----' `----'  `----'  `--'  `---'  `--''--'

 
Powered by Spring Boot 2.6.2

 

하지만 자세히 살펴보면 한 줄이 표시되지 않고 있다. 바로 아래의 내용이다. 

${application.title} ${application.version}

이 부분을 표시하기 위해서는 application.properties나 application.yaml 파일에 해당 내용을 등록시켜주면 된다. 

 

Spring Initializr로 생성하면 `application.properties`로 디폴트로 생성되는데, 개인적으로 Yaml이 편해 application.yaml로 파일명을 변경하였다. 

 

Banner 정보 표시를 위해서 최종적으로는 아래와 같이 수정하였다. 

banner.txt

 ,---.                           ,--.
'   .-'   ,---.   ,---.   ,---.  `--'  ,---.  ,--,--,
`.  `-.  | .-. : (  .-'  (  .-'  ,--. | .-. | |      \
.-'    | \   --. .-'  `) .-'  `) |  | ' '-' ' |  ||  |
`-----'   `----' `----'  `----'  `--'  `---'  `--''--'

${server.title} ${server.version}
Powered by Spring Boot ${spring-boot.version}

application.yaml

# server
server:
  title: spring-micro-session
  version: '@project.version@'
  port: 8180

 

최종 결과물! 원하는대로 표시되었다. 

 

728x90
반응형
728x90
반응형

Spring boot project를 생성하는 방법에 대해서 간략하게 공유하고자 한다. 

 

IDE 선택

Project를 생성하기에 앞서 어떠한 나는 어떤 IDE를 사용하는지 간단히 공유해볼까 한다. 난 Software Quality Engineer와 DevOps 업무를 하다보니 여러가지 언어를 사용하여 프로젝트를 진행하였고, 그러다 보니 이런저런 IDE를 많이 사용하게 되었다. 

 

1. Java / Scala Project

   Java 나 Scala로 개발을 한다면 JetBrain사의 Intellij가 아주 편리하다. Java를 타겟으로 개발된 IDE 이다 보니, 자동완성이나 Lombok, Spring boot annotation 등 많은 부분을 편리하고 쉽게 개발이 가능하다. Maven, Kotlin, SBT 등 여러가지 Dependency management, Build, Packaging 환경도 쉽게 설정 및 테스트가 가능하다.

 

2.  Python Project

   Python의 경우 JetBrain 사의 PyCharm 을 사용하거나 Visual Studio Code를 사용한다. 요즘 vscode로 왠만한 개발을 다할 수 있어서 하나만 사용해도 크게 문제가 없으나, Intellij에 익숙해진 나는 PyCharm이 편리했다. 

 

3. 그 외

  그 외의 Project로 Jenkins Pipeline을 위한 Groovy, Kubernetes 배포를 위한 Yaml (Helm Chart 포함), C++ 개발은 Visual Studio Code를 사용하고 있다. 

 

현재 Project가 Python이 주력이 아니기 때문에 PyCharm은 거의 쓰고 있지 않고 Intellj 와 vscode는 활발하게 사용하고 있는 중이다. 

개인적으로 Spring boot Project는 Intellij가 최고인 것 같다. 

 

Spring Boot Project 시작

Spring boot Project를 생성하는 방법은 Manual로 Java Project를 만들어서 Dependency와 Plugin을 처음부터 추가하는 방법과 Spring Initializr 를 사용하여 몇가지 Dependency를 추가한 후 초기 프로젝트를 생성하는 방법이다. 

 

우선 Spring Initializr로 생성하는 방법은 여기로 접속하고 아래와 같이 간략하게 정보를 입력한다. 

Spring Initializr

위와 같이 간단하게 설정 후 `Generate` 버튼을 누르면 Java Project를 다운로드 할 수 있다.

spring-boot-session.zip
0.06MB

 

아래는 위의 Tool로 생성하였을 때 생성된 pom.xml이다. 

위에 첨부된 프로젝트를 열면 기본 프로젝트 생성 끝이다. 

프로젝트를 열어보면 아래와 같은 Project Tree구조가 나온다. (.gitignore 및 LICENCE는 이 프로젝트를 Github에 등록하면서 생성하였다.)

 

먼저 Project를 시작하면 Dependency를 Download 해야한다. 

Intellij의 오른편의 Maven Menu를 열고 "Reload All Maven Project" 를 클릭한다.  (Reload 모양의 버튼이다.)

 

Dependency가 완료되면 프로젝트를 실행해볼 수 있다. SpringBootSessionApplication.java 파일에서 마우스 오른쪽 버튼을 누르고 아래 메뉴를 선택한다. 

실행을 해보면 아래와 같이 서비스가 시작되는 것을 확인할 수 있다. 

 

오늘은 간단하게 Spring boot Project를 만드는 것을 알아보았다. 앞으로 이 프로젝트를 베이스로 코드는 추가해 나가고자 한다. 

현재 auth project는 코드가 어느정도 들어가 있는 상태이지만 session project는 이제 시작이므로 이 프로젝트에 추가되는 정보들을 가지고 포스트를 이어나가고자 한다. 

728x90
반응형

+ Recent posts