[Spring Boot] 전체 조회 화면 만들기

윤동환·2023년 2월 27일
1
post-thumbnail

전체 조회 만들기

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}}

Mustache 문법 설명

  1. {{#posts}}
  • posts라는 list를 순회
  • Java의 for문과 유사
  1. {{변수명}}
  • list에서 뽑아낸 객체의 필드를 사용

Controller, Service, Repository 코드 작성

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

  • 서버 템플릿 엔진에서 사용할 수 있는 객체를 저장할 수 있습니다.
  • findAllDesc()로 가져온 결과를 posts로 index.mustache에 전달합니다.
profile
모르면 공부하고 알게되면 공유하는 개발자

0개의 댓글