꾸준하게, 차근차근

[Redis] 로컬에서 Spring Boot + Redis 사용해보자! (1) 본문

Redis

[Redis] 로컬에서 Spring Boot + Redis 사용해보자! (1)

jn4624 2024. 10. 25. 02:38
Redis의 기본 개념부터 전략까지 머릿속에 넣었으니 이제 활용해볼 때이다!
익숙한 Spring Boot를 활용해서 Redis를 구현해볼까?

 

1. Spring Boot 프로젝트 생성

Spring Boot 프로젝트 세팅 환경은 참고로 작성한다.

  • Spring Boot 3.x.x 버전
  • MySQL 8.x 버전 이상
  • JDK 17

 

우선 IntelliJ Ultimate 버전을 사용하고 있어 사이트를 통하지 않고 프로젝트를 진행하는 방법만 다룰 예정이다.

Community Edition 버전을 사용하거나 다른 IDE 사용 유저들은 사이트를 통해 진행할 수 있도록 링크를 공유해놓을테니 참고하시면 좋겠다.

 

Community Edition, 다른 IDE 사용 유저 프로젝트 세팅 참고

https://start.spring.io/

 

Ultimate 사용 유저 프로젝트 세팅 참고

Spring Boot 프로젝트 생성

프로젝트명을 작성하고 JDK17 버전을 맞춰준다.

  1. Spring Boot DevTools
  2. Spring Web
  3. Spring Data JPA
  4. MySQL Driver

총 4개의 디펜던시를 선택하고 프로젝트를 생성한다.

 

프로젝트 생성 후 작업

  1. 사용하지 않는 테스트 코드 삭제
  2. application.properties -> application.yml로 변경

 

2. application.yml 설정 파일 작성

spring:
  profiles: # 개발환경과 배포환경 분리를 위한 설정
    default: local
  datasource: # 데이터베이스 연동 설정
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: [password]
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update # 데이터베이스 테이블 생성을 위한 설정
    show-sql: true # SQL을 로그로 확인하기 위한 설정

 

3. Entity와 조회 API 구현

@Entity
@Table(name = "boards")
public class Board {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String content;

    /*
      데이터베이스에 저장될 때 필드의 값을 관리하고,
      JSON 데이터로 변환할 때 일관된 형식으로 처리되도록 설정
     */
    @CreatedDate
    // 직렬화/역직렬화 시 해당 필드를 지정된 형식으로 처리
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    // 직렬화할 때 LocalDateTimeSerializer 를 사용
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    // 역직렬화할 때 LocalDateTimeDeserializer 를 사용
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    private LocalDateTime createdAt;

    public Long getId() {
        return id;
    }

    public String getTitle() {
        return title;
    }

    public String getContent() {
        return content;
    }

    public LocalDateTime getCreatedAt() {
        return createdAt;
    }
}

 

@RestController
@RequestMapping("boards")
public class BoardController {
    private final BoardService boardService;

    public BoardController(BoardService boardService) {
        this.boardService = boardService;
    }

    @GetMapping
    public List<Board> getBoards(@RequestParam(defaultValue = "1") int page,
                                 @RequestParam(defaultValue = "10") int size) {
        return boardService.getBoards(page, size);
    }
}

 

@Service
public class BoardService {
    private final BoardRepository boardRepository;

    public BoardService(BoardRepository boardRepository) {
        this.boardRepository = boardRepository;
    }

    public List<Board> getBoards(int page, int size) {
        Pageable pageable = PageRequest.of(page - 1, size);
        Page<Board> pageOfBoards =  boardRepository.findAllByOrderByCreatedAtDesc(pageable);
        return pageOfBoards.getContent();
    }
}

 

@Repository
public interface BoardRepository extends JpaRepository<Board, Long> {
    Page<Board> findAllByOrderByCreatedAtDesc(Pageable pageable);
}

 

4. 데이터베이스 생성

기존 application.yml 파일에 mydb 데이터베이스를 사용하는 것으로 연동 정보를 작성하였기에, 로컬 데이터베이스에 접속하여 mydb 데이터베이스를 생성해준다.

데이터베이스 생성 후 Spring Boot를 구동하여 엔티티 정보가 데이터베이스에 반영되었는지 확인해주자!

 

5. 더미 데이터 추가

-- 높은 재귀(반복) 횟수를 허용하도록 설정
-- (아래에서 생성할 더미 데이터의 개수와 맞춰서 작성하면 된다.)
SET SESSION cte_max_recursion_depth = 1000000; 

-- boards 테이블에 더미 데이터 삽입
INSERT INTO boards (title, content, created_at)
WITH RECURSIVE cte (n) AS
(
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM cte WHERE n < 1000000 -- 생성하고 싶은 더미 데이터의 개수
)
SELECT
    CONCAT('Title', LPAD(n, 7, '0')) AS title,  -- 'Title' 다음에 7자리 숫자로 구성된 제목 생성
    CONCAT('Content', LPAD(n, 7, '0')) AS content,  -- 'Content' 다음에 7자리 숫자로 구성된 내용 생성
    TIMESTAMP(DATE_SUB(NOW(), INTERVAL FLOOR(RAND() * 3650 + 1) DAY) + INTERVAL FLOOR(RAND() * 86400) SECOND) AS created_at -- 최근 10년 내의 임의의 날짜와 시간 생성
FROM cte;

 

 

참고로 위에 SQL문은 MySQL 8.0 이상부터 사용이 가능하니 버전에 맞게 변경해서 사용하거나 버전을 맞추거나 해야 한다.

 

6. API 정상 동작 확인

API가 정상적으로 동작하는지 우선 확인하자.

Spring Boot 서버를 시작하고 브라우저에서 API를 호출하면 된다.

물론 Postman을 사용해도 좋다!

 

json 형태의 데이터가 정상적으로 응답 오는 것을 확인할 수 있다.

서버 로그도 확인해볼까?

 

조회 쿼리도 정상적으로 찍혀 있다.

 

구현 코드들 때문에 내용이 많이 길어지는 것 같아서 2개의 챕터로 나누어 정리해야겠다.

다음 챕터에서는 Redis 연동 추가하고 성능 비교해보자!

 

Reference.

https://www.inflearn.com/course/%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90-redis-%EC%9E%85%EB%AC%B8-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94

 

비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편) 강의 | JSCODE 박재성 - 인프런

JSCODE 박재성 | 비전공자 입장에서도 쉽게 이해할 수 있고, 실전에서 바로 적용 가능한 'Redis 입문/실전 (조회 성능 최적화편)' 강의를 만들어봤습니다!, 🤬 에라이, 못 해먹겠네!비전공자로 개발

www.inflearn.com