기술 스택들이 저장되는 Stack 테이블에서 데이터를 모두 가져와야 하는 상황이다. 데이터가 많지 않기 때문에 페이지네이션도 필요없고 정말 한 번에 다 가져와도 문제가 없을 양이다.
단일 테이블 전략에 의해 자동으로 생성된 칼럼인 dtype을 get한다. 그 뒤 프론트엔드 쪽에서 dtype별로 다른 div 아래에 데이터를 그려주기를 원했다. 그러면 쿼리를 한번만 날려서 테이블에 있는 데이터를 전부 한 번에 가져올 수 있기 때문이다. 문제는 이 dtype이 자동으로 생성됐기 때문에 lombok으로 @Getter를 선언해도 getDtype()은 만들어지지 않는다.
그래서 Stack 엔티티에 dtype 필드를 추가해줘봤다. 자동으로 만들어주는 dtype과 중복이기 때문에 충돌이 나 에러를 내주는 것을 볼 수 있었다. 에러에서 준 힌트대로 해봤더니 잘 됐다.
Stack 엔티티에 이렇게 애노테이션을 추가한 dtype 필드를 넣어주면 된다.
@Column(insertable = false, updatable = false)
private String dtype;
저 애노테이션만 보면 마치 dtype이 insert가 안 될 것처럼 보이지만 직접 설정한 dtype이 insert가 안 되는 것이지 dtype을 jpa가 만들지 못 하게 하는 것이 아니다.
테스트 삼아서 setDtype을 사용해 임의의 값을 넣어줘봤다.
Stack react = new FrontendStack("react", "https://w7.pngwing.com/pngs/452/495/png-transparent-react-javascript-angularjs-ionic-github-text-logo-symmetry-thumbnail.png");
react.setDtype("test");
stackRepository.save(react);
넣어주고자 했던 값인 test는 dtype에 들어가지 않고, 엔티티 타입에 맞게끔 dtype을 jpa가 생성해 넣어준 것을 볼 수 있다.
하지만 이 방법은 프론트엔드에게 짐을 조금 넘기는 구조이다. for문을 통해 dtype을 확인해서 적절한 배열에 넣어줘야 하기 때문이다.
이 방법 대신에 백엔드가 조금 더 부담을 지는 방법도 있다. 프론트엔드에서 하위 클래스 별로 데이터를 요청하는 것이다. 쿼리는 몇번 더 나가겠지만 dtype별로 서버에서 데이터를 주면 된다.
결국 프론트엔드가 일을 더 많이 할 것이냐, 백엔드가 일을 더 많이 할 것이냐의 문제에 봉착한다.
'프로젝트 > 크루트' 카테고리의 다른 글
.nuxt 하위 파일을 변경하지 마세요 (0) | 2022.02.11 |
---|---|
처음 테스트 코드를 작성하며 겪었던 문제들 (0) | 2022.02.10 |
사용자 스토리로 요구사항 정리해보기 (0) | 2022.02.07 |
AService에서는 ARepository만 사용하고 BService 사용은 지양하자 (0) | 2022.01.30 |
Entity 설계하기 (0) | 2022.01.21 |