현재 데브싱크(DevThink) 서비스를 구축하고 있다.
데브싱크는 개발자들이 사용하는 성장형 커뮤니티 앱이다.
자세한 내용은 아래 링크를 통해 확인할 수 있다!
https://devthink.notion.site/devthink/185af3c83f4743f292067f206bc95acf
데브싱크 서비스에 기본적인 게시글 기능이 필요하다.
그래서 내가 짠 전체적인 POST API에 대해 소개 하려고 한다.
일단 Controller의 개념에 대해 소개하려고 한다.
Controller는 사용자의 요청이 진입하는 지점(entry point)이며, 요청에 따라 어떤 처리를 할지 결정해주며
실질적인 처리는 Service에서 담당한다고 나와 있다.
출처:
https://hardlearner.tistory.com/315
[PostController의 전체적인 기능은 다음과 같다]
1. 글 작성, 글 ID로 검색, 업데이트, 삭제 (기본적인 CRUD)
2. 페이징 처리하여 게시글 가져오기, 키워드로 제목 검색 기능
일단 페이징 처리하여 게시글을 가져오는 기능을 소개하려고 한다.
[페이징 처리하기]
일단 PostService(실질적인 처리)를 통해 데이터 저장이 필요하여 final로 선언을 해두었다.
생성자 의존성 주입을 통해 스프링 빈에 등록을 해두었다.
아래에 있는 list가 페이징 처리하여 글 검색 API이다.
GET: /posts/?page=페이지 수 를 통하여 사용자가 읽고 싶은 페이지를 불러왔다.
@RequestParam("가져올 데이터의 이름") [데이터타입] [가져온데이터를 담을 변수]
이런식으로 쿼리스트링 값을 가져와서 데이터를 처리할 수 있다.
PostService 부분은 다음과 같다.
PostService 부분은 PostRepository가 필요하여 final로 선언하였고,
DozerMapper(ETO -> ENTITY로 쉽게 변환해주는 매퍼)를 사용하기 위해 final로 선언해주었다.
각각 생성자 의존성 주입을 통해 스프링 빈에 자동등록 해주었다.
JPA를 사용하기 때문에 Repository는 interface로 구현하면 쉽게 DB에 접근할 수 있다.
Repository를 인터페이스로 선언하고, JpaRepository<사용하고자 할 Entity, ID> 를 상속하면 된다.
기본적인 CRUD를 제공하고, 쿼리문을 쉽게 처리할 수 있는 장점이 있다.
확실히 JdbcTemplate 보다 JPA를 사용하는 것이 정말 간단하다.
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
[제목으로 검색하기]
GET : /posts/search?keyword=검색 할 제목
검색할 제목을 통해 사용자가 원하는 게시글을 가져온다.
PostController 내에서 PostRepository 내에 있는 findByTitleContaining(keyword)를 불러와서
반환해주는 형태로 제공했다.
추후에 페이징 처리도 같이 구현하여 불러올 계획이다.
직접 선언한 findByTitleContaining 메소드이다.
SELECT * FROM movie WHERE title LIKE '%in%';
JPA는 By부분 뒤에 얻고 싶은 변수, Containing -> LIKE로 쿼리문으로 반환해준다.
이러한 부분을 따로 사용자가 메서드로 선언을 해주면 사용할 수 있다.
'💻 프로젝트 > DevThink' 카테고리의 다른 글
개발일지 - (1) 전체적인 구조와 도메인 (0) | 2022.01.16 |
---|