💻 프로젝트/DevThink

개발일지 (2) - 페이징 처리하기 & 제목으로 검색하기

미미누 2022. 1. 19. 14:09

현재 데브싱크(DevThink) 서비스를 구축하고 있다.

데브싱크는 개발자들이 사용하는 성장형 커뮤니티 앱이다.

자세한 내용은 아래 링크를 통해 확인할 수 있다!

https://devthink.notion.site/devthink/185af3c83f4743f292067f206bc95acf

 

안녕하세요, '데브싱크' 팀 입니다

데브싱크(DevThink) 팀을 소개합니다!

devthink.notion.site

 


데브싱크 서비스에 기본적인 게시글 기능이 필요하다.

그래서 내가 짠 전체적인 POST API에 대해 소개 하려고 한다.

 

PostController

일단 Controller의 개념에 대해 소개하려고 한다.

Controller는 사용자의 요청이 진입하는 지점(entry point)이며, 요청에 따라 어떤 처리를 할지 결정해주며

실질적인 처리는 Service에서 담당한다고 나와 있다.

 

출처:

https://hardlearner.tistory.com/315

 

스프링부트 - Controller란 무엇인가

스프링부트 Controller Spring Boot - Controller controller란 무엇인가? 사용자의 요청이 진입하는 지점(entry point)이며 요청에 따라 어떤 처리를 할지 결정해주며 단, controller는 단지 결정만 해주고 실질..

hardlearner.tistory.com

 

[PostController의 전체적인 기능은 다음과 같다]

1. 글 작성, 글 ID로 검색, 업데이트, 삭제 (기본적인 CRUD)

2. 페이징 처리하여 게시글 가져오기, 키워드로 제목 검색 기능

 


일단 페이징 처리하여 게시글을 가져오는 기능을 소개하려고 한다.

[페이징 처리하기]

일단 PostService(실질적인 처리)를 통해 데이터 저장이 필요하여 final로 선언을 해두었다.

생성자 의존성 주입을 통해 스프링 빈에 등록을 해두었다.

 

아래에 있는 list가 페이징 처리하여 글 검색 API이다. 

GET: /posts/?page=페이지 수 를 통하여 사용자가 읽고 싶은 페이지를 불러왔다.

 

@RequestParam("가져올 데이터의 이름") [데이터타입] [가져온데이터를 담을 변수]

이런식으로 쿼리스트링 값을 가져와서 데이터를 처리할 수 있다. 

 

실질적인 처리를 담당하는 PostService 부분

PostService 부분은 다음과 같다. 

PostService 부분은 PostRepository가 필요하여 final로 선언하였고,

DozerMapper(ETO -> ENTITY로 쉽게 변환해주는 매퍼)를 사용하기 위해 final로 선언해주었다.

각각 생성자 의존성 주입을 통해 스프링 빈에 자동등록 해주었다.

 

 

PostRepository 담당 부분

JPA를 사용하기 때문에 Repository는 interface로 구현하면 쉽게 DB에 접근할 수 있다.

Repository를 인터페이스로 선언하고, JpaRepository<사용하고자 할 Entity, ID> 를 상속하면 된다.

기본적인 CRUD를 제공하고, 쿼리문을 쉽게 처리할 수 있는 장점이 있다.

확실히 JdbcTemplate 보다 JPA를 사용하는 것이 정말 간단하다.

 

PostService/list 구현체

Repository에서 게시글을 가져오는 findAll에

Pageable 인터페이스 구현체(PageRequest.of)를 전달해주면 페이징을 할 수 있다.

 

PageRequest.of(limit값, 가져올 양, 정렬방식) 으로 사용할 수 있다.

(limit는 실제 페이지 번호와 SQL의 limit가 다르기 때문에 '현재 페이지 - 1'값을 준다.)

Page 객체의 getContent()를 사용하면, 리스트를 꺼낼 수 있다.

 

출처

https://velog.io/@max9106/Spring-Boot-JPA-MySQL-%ED%8E%98%EC%9D%B4%EC%A7%95

 

[Spring Boot + JPA + MySQL] 페이징

게시글이 많아지면, 페이징으로 관리를 해줘야 할 때가 있다.메인 페이지(list.html)를 살펴보면, pageList로 페이징 처리를 함을 볼 수 있다.page 링크를 누르면, Get요청으로 page값을 넘겨줌을 볼 수

velog.io

 


[제목으로 검색하기]

Controller 제목 검색 API

GET : /posts/search?keyword=검색 할 제목     

검색할 제목을 통해 사용자가 원하는 게시글을 가져온다.

 

PostCotroller 내부 search 구현체

PostController 내에서 PostRepository 내에 있는 findByTitleContaining(keyword)를 불러와서

반환해주는 형태로 제공했다. 

추후에 페이징 처리도 같이 구현하여 불러올 계획이다.

 

PostRepository

직접 선언한 findByTitleContaining 메소드이다.

SELECT * FROM movie WHERE title LIKE '%in%';

JPA는 By부분 뒤에 얻고 싶은 변수, Containing -> LIKE로 쿼리문으로 반환해준다.

이러한 부분을 따로 사용자가 메서드로 선언을 해주면 사용할 수 있다.

 

 

'💻 프로젝트 > DevThink' 카테고리의 다른 글

개발일지 - (1) 전체적인 구조와 도메인  (0) 2022.01.16