스터디를 통해 스프링부트와 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에서 뽑아낸 객체의 필드 사용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에서 제공하지 않는 메소드는 쿼리로 작성가능.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))
와 동일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();
}
}
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";
}
}