심화 부트캠프 수강을 월요일부터 시작했다 !
경쟁력있는 취준생이 되어보자
오늘이 부트캠프 시작 3일차다.
행복하게 웰컴드링크 대신 웰컴 과제가 등장했다.
정확하게 잘 몰랐던 부분을 복습할 수 있어서 빡세지만 좋은 경험이였다 !
과제를 하면서 새롭게 알게된 부분을 기록한다.
productList = productRepository.findAll()
만약 위와 같은 코드가 있다고 가정해보자.
findAll()
을 통해 넘어오는 product가 얼마나 많은지 알 수 없다. 만약 100개 이상의 product가 넘어온다면, 사용자의 한화면을 전부 채워버릴 수도 있다.
한 화면에 너무 많은 데이터를 보여주려고하면 과부하가 걸리거나 처리하기 복잡하기 때문에, 페이지로 데이터들을 적당히 나눠 화면에 보여줄 필요가 있다.
JPA에서는 이 과정을 페이징 기법을 사용해 해결한다.
주소창에서 쉽게 볼 수 있듯 page를 나눠 각각의 화면으로 뿌려주는 역할을 페이징이 해준다.
org.springframework 내부에 Pageable이라는 인터페이스가 존재한다.
내가 이번에 사용한 getPageable()이다.
매개변수로 page, size, 정렬기준, isAsc를 받아 PageRequest에 정보를 담아 전달한다.
Pageable의 경우 내부에 정렬을 포함하기 때문에 Sort.Direction을 사용해서 오름차순과 내림차순을 정의할 수 있다.
isAsc ? sort.Direction.ASC : Sort.Direction.DESC;
3항 연산자로 나타나 있듯 boolean 형식으로 받은 isAsc가 true이면 오름차순, false이면 내림차순이 Direction 값으로 정의된다.
Sort.by
에서는 위에서 얻은 정렬방식을 어디에(sortBy) 맞춰 사용할지를 정의한다.
상품을 view에 뿌려주는 과정이 다른형태로 꽤 여러번 등장해서 페이징을 메소드화해서 사용했다.
엔티티를 정의하는 과정에서 궁금했던 코드들이 있다.
바로 이 코드에 fetch = FetchType.LAZY)
이다.
앞에있는 @ManyToOne 어노테이션이 힌트가 될 수 있다.
@ManyToOne은 다른 entity와의 관계를 나타내는 어노테이션으로 다대일의 관계를 가지고 있다는 의미이다.
JPA는 이렇게 연관관계가 있는 entity가 있을때 관련된 정보를 바로 가지고 올지, 필요할때 가지고 올 지 시점을 정할 수 있다.
이 데이터를 가져오는 시점을 FetchType으로 정할 수 있고 종류는 아래와 같다.
사전에 LAZY는 게으르다 라는 뜻인데 그런 의미로 지연로딩을 표시하게 된것 같다.
필요할때만 연관된 엔티티를 로딩한다.
eager는 갈망하다, 열렬한 이라는 의미로 바로 데이터를 가져옴을 알 수 있다.
특정 엔티티를 조회할 때 연관된 모든 엔티티를 같이 로딩한다.
즉시 로딩의 경우 연관되어 있는 엔티티에 있는 정보를 모두 즉시 가져올 수 있다는 장점이 존재하나 불필요한 상황에서까지 데이터를 가져오는 경우 프로그램의 성능저하를 야기할 수 있다. 특히 즉시 로딩의 경우 개발자가 입력하지 않아도 Outer Join을 자동으로 하기 때문에 불필요한 조인이 일어날 수 있다.