인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김한수님의 프로필 이미지
김한수

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

코드테이블 조인방법이 궁금합니다.

작성

·

3.1K

0

안녕하세요. 강의 잘 듣고있습니다.

질문은,

회사에서 Query를 작성하다보면 코드테이블을 여러번 join 하는 경우가 허다한데요.

a join code 처럼 a 테이블의 특정 코드에 대한 코드값을 읽어오고자 할 경우, a 테이블에서

code 테이블쪽으로 driving이 걸리는 컬럼은 대부분 pk가 아닐텐데요.

이럴 경우 어떤식으로 해결을 해야할까요?

join을 통해서 이래저래 방법을 찾아보았으나 pk와 fk 관계가 아니면 오류가 나네요.

몇일동안 테스트는 하는데 딱히 방법이 보이지않습니다.

내부적으로 메인테이블에서는 단순코드만 관리하고 description 자체를 코드테이블에서 읽어오는 

방식이다 보니 상기방식의 작업이 상당히 많은 편입니다.

그럼 조언부탁드립니다.

미리 감사드립니다.

답변 1

5

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요 김한수님^^

섹션10. 객체지향 쿼리 언어1 - 기본문법에 있는 조인강좌를 보시면 도움이 되실꺼에요. 그 중에 8:20초에 나오는 ON 절을 활용한 조인 부분을 보시면 연관관계가 없는 부분도 조인을 할 수 있습니다.

그런데 여기서! 코드 테이블에 관한 정말 중요한 내용을 한가지 말씀드리겠습니다.

저도 오랜기간 코드 테이블을 관행처럼 자주 사용해왔습니다. 특히 말씀하신 것 처럼 코드의 설명(description)을 꺼내야 하기 때문에 코드 테이블과 자주 조인을 했습니다. (그래서 정말 조인을 많이 썼지요!)

하지만, 정말 SQL 쿼리에서 이렇게 처리하는게 좋은 방법인가에 대해서는 본질적으로 의문을 가질 필요가 있습니다.

지금까지 수 많은 애플리케이션을 개발하면서 느낀 점은 코드테이블 때문에 코드 유지보수성이 너무 떨어진다는 점입니다. 뭘 하나 하려고 해도 다 코드 테이블에 정의가 되어 있어서, 애플리케이션 코드 로직을 보다가, 중간에 코드 속성이 있으면 데이터베이스 열어서 이 코드가 뭐하는 건지 읽어보고, 또 다시 돌아오고... 그리고 심지어 필드 이름도 그냥 code이고, 여기에 단순 문자이므로 무슨 값이 들어가 있는지 보장도 안됩니다.

그래서 최근에 진행한 모든 프로젝트에서는 코드 테이블을 제거해버렸습니다. 대신에 자바의 ENUM을 적극 활용했습니다. 덕분에 코드 테이블을 사용할 때와는 비교가 되지 않을 정도의 편리함과 유지보수성을 얻었습니다.

JPA를 사용하신다면 테이블 보다는 객체 중심으로 개발을 하게 되므로, 단순한 코드 테이블 보다는 ENUM을 적극 활용하시는 것을 권장합니다.

물론 어쩔 수 없이 코드 테이블을 사용해야 한다면, 제가 권장하는 방법은 SQL에서 조인하는 부분은 피하고, 대신에 코드 테이블은 공통 코드 서비스 등을 만들어서, 애플리케이션 로딩 시점에 메모리에 다 올려서 캐시해서 사용하는 것을 권장합니다. (물론 코드가 자주 바뀐다면 다른 접근법이 필요하겠지만요)

ENUM 관련해서 제가 좋아하는 이동욱님이 작성한 글을 한번 읽어보시면 도움이 되실꺼에요: http://woowabros.github.io/tools/2017/07/10/java-enum-uses.html

감사합니다.

김한수님의 프로필 이미지
김한수

작성한 질문수

질문하기