[스프링부트와 AWS로 혼자 구현하는 웹 서비스] Mustache로 게시글 조회 화면 만들고 게시글 조회 기능 넣기

세이라·2023년 7월 25일
0

스터디를 통해 스프링부트와 AWS로 혼자 구현하는 웹 서비스(저자 이동욱) 서적을 공부하는 중입니다.

공부/실습한 내용을 정리한 포스팅입니다.
책에 모르는 부분이 있으면 구글링하거나 챗gpt에 물어봐서 보충하였습니다.
(아직 초보라 모르는 부분이 많아 이것저것 다 적었습니다.)

참고한 사이트 출처는 포스팅 맨 하단에 적었습니다.

게시글 조회 화면 만들기

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>
        </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}} : posts라는 List 순회
  • {{변수명}} : List에서 뽑아낸 객체의 필드 사용

게시글 조회 기능 넣기

  1. PostsRepository 인터페이스 아래와 같이 코드 추가
package com.webservice.springboot.springboot_board.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();
}
  • @Query : Spring Data JPA에서 제공하지 않는 메소드는 쿼리로 작성가능.
  1. PostsService 클래스 아래의 코드 추가
    @Transactional(readOnly = true)
    public List<PostsListResponseDto> findAllDesc(){
        return  postsRepository.findAllDesc().stream()
                .map(PostsListResponseDto::new)
                .collect(Collectors.toList());
    }
  • @Transactional(readOnly = true) : readOnly를 true로 주면 트랜잭션 범위는 유지하되 조회 기능만 남겨두어 조회속도 개선되기 때문에 등록, 수정, 삭제 기능이 전혀 없는 서비스 메서드에 사용.
  • .map(PostsListResponseDto::new) : .map(posts->new PostsListResponseDto(posts))와 동일
  1. web.dto 패키지에PostsListResponseDto 클래스 생성 후 작성
package com.webservice.springboot.springboot_board.web.dto;

import com.webservice.springboot.springboot_board.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();
    }
}
  1. IndexController 클래스 변경
package com.webservice.springboot.springboot_board.web;

import com.webservice.springboot.springboot_board.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";
    }
}

참고 사항

  • 규모가 있는 프로젝트에서의 데이터 조회는 FK의 조인, 복잡한 조건 등으로 인해 Entity 클래스만으로 처리하기 어려워 조회용 프레임워크를 추가로 사용. 대표적으로 querydsl, jooq, MyBatis가 있음.
  • 조회는 위 3가지 프레임워크 중 하나로, 등록/수정/삭제는 Spring Data JPA로 진행.
  • Querydsl 권장 이유
  1. 타입 안정성 보장
    : 단순히 문자열로 쿼리 생성X 메서드 기반으로 쿼리 생성하여 오타나 존재하지 않는 컬럼명 명시 시 IDE에서 자동으로 검출.
  2. 국내 많은 회사에서 사용
  3. 레퍼런스가 많음.

0개의 댓글