[spring boot] 게시글 등록/수정/삭제/조회 API 만들기 - 05

Momenter·2021년 7월 21일
0

Spring Boot

목록 보기
10/15

게시글 전체 조회 화면 만들기

index.mustache 변경

{{>layout/header}}

<h1>스프링부트로 시작하는 웹 서비스 Ver.2</h1>
<div class="col-md-12">
    <div class="row">
        <div class="col-md-6">
            <a href="/posts/save" role="button" class="btn btn-primary">글 등록</a>
            {{#userName}}
                Logged in as: <span id="user">{{userName}}</span>
                <a href="/logout" class="btn btn-info active" role="button">Logout</a>
            {{/userName}}
            {{^userName}}
                <a href="/oauth2/authorization/google" class="btn btn-success active" role="button">Google Login</a>
                <a href="/oauth2/authorization/naver" class="btn btn-secondary active" role="button">Naver Login</a>
            {{/userName}}
        </div>
    </div>
    <br>
    <!-- 목록 출력 영역 -->
    <table class="table table-horizontal table-bordered">
        <thead class="thead-strong">
        <tr>
            <th>게시글번호</th>
            <th>제목</th>
            <th>작성자</th>
            <th>최종수정일</th>
        </tr>
        </thead>
        <tbody id="tbody">
        {{#posts}}
            <tr>
                <td>{{id}}</td>
                <td>{{title}}</td>
                <td>{{author}}</td>
                <td>{{modifiedDate}}</td>
            </tr>
        {{/posts}}
        </tbody>
    </table>
</div>

{{>layout/footer}}
  • {{#posts}} : posts라는 List를 순회
  • {{id}}, {{title}}, {{author}}, {{modifiedDate}} : List에서 뽑아낸 객체의 필드를 사용

PostsRepoitory 인터페이스에 쿼리 추가

package com.momenting.book.springboot.domain.posts;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

public interface PostsRepository extends JpaRepository<Posts, Long> {

    @Query("select p from Posts p order by p.id desc")
    List<Posts> findAllDesc();
}

PostsService에 코드 추가

package com.momenting.book.springboot.service.posts;

import com.momenting.book.springboot.domain.posts.Posts;
import com.momenting.book.springboot.domain.posts.PostsRepository;
import com.momenting.book.springboot.web.dto.PostsResponseDto;
import com.momenting.book.springboot.web.dto.PostsSaveRequestDto;
import com.momenting.book.springboot.web.dto.PostsUpdateRequestDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@RequiredArgsConstructor
@Service
public class PostsService {

    private final PostsRepository postsRepository;

    @Transactional(readOnly = true)
    public List<PostsListResponseDto> findAllDesc() {
        return postsRepository.findAllDesc().stream().map(PostsListResponseDto::new).collect(Collectors.toList());
    }

    @Transactional // <- 이번 포스팅에서 추가된 구문
    public Long save(PostsSaveRequestDto requestDto) {
        return postsRepository.save(requestDto.toEntity()).getId();
    } // <- 이번 포스팅에서 추가된 구문

    @Transactional
    public Long update(Long id, PostsUpdateRequestDto requestDto) {

        Posts posts = postsRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("해당 게시글이 없습니다. id =" + id));

        posts.update(requestDto.getTitle(), requestDto.getContent());

        return id;
    }

    public PostsResponseDto findById (Long id) {
        Posts entity = postsRepository.findById(id).orElseThrow( () -> new IllegalArgumentException("해당 게시글이 없습니다. id =" + id));

        return  new PostsResponseDto(entity);
    }
}

PostsListResponseDto 클래스 생성 및 작성

web.dto 패키지에 PostsListResponseDto 클래스 생성

  • 작성
package com.momenting.book.springboot.web.dto;

import com.momenting.book.springboot.domain.posts.Posts;
import lombok.Getter;

import java.time.LocalDateTime;

@Getter
public class PostsListResponseDto {
    private Long id;
    private String title;
    private String author;
    private LocalDateTime modifiedDate;

    public PostsListResponseDto(Posts entity) {
        this.id = entity.getId();
        this.title = entity.getTitle();
        this.author = entity.getAuthor();
        this.modifiedDate = entity.getModifiedDate();
    }
}

IndexController 변경하기

package com.momenting.book.springboot.web;

import com.momenting.book.springboot.service.posts.PostsService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@RequiredArgsConstructor
@Controller
public class IndexController {

    private final PostsService postsService; // <-

    @GetMapping("/") // <-
    public String index(Model model) { // <-
        model.addAttribute("posts", postsService.findAllDesc()); // <-
        return "index"; // <-
    } // <- 이번 포스팅에서 변경된 곳

    @GetMapping("/posts/save")
    public String postsSave() {
        return "posts-save";
    }
}

브라우저에서 확인하기


글 작성 전에는 목록이 없습니다.
글 작성 후 다시 확인해 보겠습니다.

작성한글이 정상적으로 조회 되는것을 볼 수 있습니다.

profile
순간을 기록하는 개발자

0개의 댓글