프로젝트/크루트

단일 테이블 전략에 의해 자동으로 생성된 칼럼인 dtype을 get하고 싶으면

발전생 2022. 1. 28. 11:56

기술 스택들이 저장되는 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별로 서버에서 데이터를 주면 된다.

결국 프론트엔드가 일을 더 많이 할 것이냐, 백엔드가 일을 더 많이 할 것이냐의 문제에 봉착한다.