동일한 환경에서 실습을 진행하기 위해 아래 버전을 사용할 것을 권장한다.
- Spring Boot는 3.x.x 버전
- MySQL 8.x 버전
- JDK 17
Spring boot 프로젝트 세팅
아래에서 name은 redis-test, dependency에는 lombok을 추가로 넣어준다.
application.properties를 지우고 application.yml을 생성 application.yml# local 환경
spring:
profiles:
default: local
datasource:
url: jdbc:mysql://localhost:3306/redis_test
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: trueBoard 엔티티 만들기
Board
@Entity
@Table(name = "boards")
@Getter
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String content;
@CreatedDate
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime createdAt;
}
기본 Controller, Service, Repository 만들기
BoardController
@RequiredArgsConstructor
@RestController
@RequestMapping("boards")
public class BoardController {
private final BoardService boardService;
@GetMapping()
public List<Board> getBoards(@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size) {
return boardService.getBoards(page, size);
}
}
BoardService
@RequiredArgsConstructor
@Service
public class BoardService {
private final 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();
}
}
BoardRepository
public interface BoardRepository extends JpaRepository<Board, Long> {
Page<Board> findAllByOrderByCreatedAtDesc(Pageable pageable);
}
사용할 database 생성하기
yml을 보면 database가 redis_test라고 되어있다. redis_test를 생성해주자
datasource:
url: jdbc:mysql://localhost:3306/redis_test
database 생성하기
# database 확인하기
show databases;
# database 생성하기
create database redis_test;
datagrip 연결하기
내가 생성한 DB의 정보와 맞게 기입해준다.
아래와 같이 succeded가 뜨면 성공이다.
조회 성능 테스트를 위한 더미데이터 백만건을 넣을 것이다.
아래의 insert문은 mysql 8.0이상에서만 가능한 로직이다.
-- 높은 재귀(반복) 횟수를 허용하도록 설정
-- (아래에서 생성할 더미 데이터의 개수와 맞춰서 작성하면 된다.)
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;
걸린 시간
31초 정도 걸렸다.
데이터가 잘 들어갔는지 확인까지 해보자
select count(*) from boards;
