작성
·
237
0
토이 프로젝트를 진행하던 중 궁금한 내용이 생겨서 질문 드립니다.
과거 Mybatis와 같은 것을 활용해 진행할 때는
코드 매핑 테이블에 코드값 (기본키)과 코드명
이렇게 있고
특정 테이블에서는 이러한 코드 값 키를 들고 있어 서브쿼리를 활용해 코드 명을 가져오는 방식으로 활용했습니다.
JPA에서 위 구조를 활용하려면 특정 엔티티에 코드 엔티티를 넣고 서로 연관관계를 걸어 준 후에 fetch join으로 select 하는게 베스트 일까요?
답변 1
2
안녕하세요. ybs1121님
코드키, 코드명을 활용하는 코드성 테이블에 대한 질문이군요 🙂
이 경우 몇가지 선택지가 있습니다.
코드성 테이블과 연관관계를 가진다. 그리고 fetch join 등을 사용한다.
코드성 테이블과 연관관계를 가지지 않는다. SQL을 사용할 때와 같이 join을 사용하고(JPQL도 일반 join을 사용할 수 있습니다) 그 결과를 DTO로 받아온다. 쉽게 이야기해서 코드 매핑된 결과도 함께 DTO로 받아온다. 이 경우 entity로 조회하기는 어렵다.
코드성 테이블과 연관관계를 가지지 않고, 코드 매핑 테이블은 별도로 조회한다. 단 이때 성능 문제가 발생할 수 있으니 코드 매핑 테이블에 캐시 등을 적용한다. 이 경우 entity로 조회할 수 있지만, 코드 테이블에 대해서 캐시 등을 적용하는 것이 필요하다.
다양한 방법이 있기 때문에 정답이 있다기 보다는 본인에게 맞는 방법을 찾는 것이 좋겠지요.
제가 추천하는 방법은 JPA를 사용하든, JPA를 사용하지 않고 SQL을 직접 사용하든 둘다 같은데요. 앞서 설명한 3번의 방법을 사용하는 것입니다.
단순히 코드 이름을 얻기 위해 코드성 테이블과 SQL로 항상 조인을 하게 되면 SQL이 코드성 테이블에 너무 큰 의존성을 가지게 됩니다. 그리고 그 결과를 저장하기 위한 DTO도 어떤 경우에는 코드성 테이블의 이름이 필요하고 어떤 경우에는 필요하지 않게 되면서 재사용이 어렵고, 많이 지저분해집니다.
내가 원하는 것은 단순히 이 코드의 이름만 얻으면 되는 것인데, 그것 때문에 비즈니스의 핵심 로직들이 유지보수 하기 어려워지는 문제가 발생하는 것을 많이 보았습니다.
이런 경우에 애플리케이션에서 유틸리티 클래스를 만들어서 코드를 넘기면 해당 코드의 이름을 반환하는 기능을 만들면 더 단순하게 문제를 해결할 수 있습니다. 물론 코드 테이블을 계속 조회할 수 있기 때문에 코드 테이블을 자주 조회하지 않게 적절한 캐시 기능이 필요합니다.
감사합니다.