index.mustache의 UI 변경하기
{{>layout/header}}
...
<!--목록 출력 영역-->
<table class="table table-horizontal table-borderd">
<thead class="thead-strong">
<tr>
<th>게시글 번호</th>
<th>제목</th>
<th>작성자</th>
<th>최종수정일</th>
</tr>
</thead>
<tbody id="tbody">
{{#posts}} // 1
<tr>
<td>{{id}}</td> // 2
<td>{{title}}</td>
<td>{{author}}</td>
<td>{{modifiedDate}}</td>
</tr>
{{/posts}}
</tbody>
</table>
</div>
{{>layout/footer}}
PostsRepository
package orm.example.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> {
//인터페 이스를 생성 후, JpaRepository<Entity 클래스, PK 타입>를 상속하면 기본 적인 CRUD 메소드가 자동으로 생성
@Query("SELECT p FROM Posts p ORDER BY p.id DESC")
List<Posts> findAllDesc();
}
Querydsl 사용이유
1. 타입안정성 보장됩니다.
메소드를 기반으로 쿼리를 생성하기때문에 오타, 존재하지 않는 컬럼을 명시할 경우 IDE에서 검출됩니다.
2. 레퍼런스가 많습니다.
쿠팡, 배민등 많이 사용하고있어 국내 자료가 많습니다.
PostsService
...
@Transactional(readOnly = true)
public List<PostsListResponseDto> findAllDesc() {
return postsRepository.findAllDesc().stream()
.map(posts -> new PostsListResponseDto(posts)) //
// .map(PostsListResponseDto::new)
.collect(Collectors.toList());
}
}
코드 분석
1. readOnly = true로 트랜젝션 옵션을 주게되면 트랜잭션의 범위는 유지하면서 조회기능만 남겨두어 조회 속도 개선이 됩니다.
2. .map(PostsListResponseDto::new)는 람다식입니다.
postsRepository로 넘겨받은 posts stream을 map을 사용하여 PostsListResponseDto로 변환후 List로 반환합니다.
PostsListResponseDto 생성
package orm.example.springboot.web.dto;
import lombok.Getter;
import orm.example.springboot.domain.posts.Posts;
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 변경
...
@RequiredArgsConstructor
@Controller
public class IndexController {
private final PostsService postsService;
@GetMapping("/")
public String index(Model model) {
model.addAttribute("posts", postsService.findAllDesc());
return "index";
}
...
}
코드 분석
1. Model