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

미란님의 프로필 이미지

작성한 질문수

Java/Spring 주니어 개발자를 위한 오답노트

스프링에서 OOP와 안티 패턴 : Transaction script

@Entity != RDB Table에 대한 질문입니다.

23.10.07 00:37 작성

·

365

·

수정됨

0

예전에 조영호님의 '오브젝트' 서적을 읽고 "어떻게 비즈니스 모델을 더 변경에 부드럽게 설계할 수 있을까?"에 고민을 했습니다.

 

그때의 기억으로는 "역할은 책임을 위한 최소한의 정보만 가지고 있자"라고 제가 이해를 했고

 

@Entity가 달린 class를 "역할"로 보고 코드 작성을 하니 1개의 RDB Table이 2개 이상의 Entity Class로 매핑이 되었습니다.

평소에 1개 Entity Class가 1개 Table와 매핑하는 것과 달라 괴리감이 들었습니다.

 

핵사고날 아키텍쳐를 적용하면 비즈니스 모델과 JPA의 Entity를 분리할 수 있지만 팀원들과의 합의도 필요해서 적용할 수 없었고 주니어라 해당 기술 도입으로 생산성이 올라갈 것이라고 장담할 수도 없었습니다.

 

두서가 없이 말이 많았는데 궁금한 점은!

"RDB의 1개 Table을 2개 이상의 Entity로 매핑해서 운영을 하는게 보편적인 방식인가요?" 입니다.

 

++ 개인적인 질문입니다만 객체의 협력 관계를 먼저 설계하는 것과 DB 설계하는 것 어떤 것이 우선인가요?

답변 2

1

김우근님의 프로필 이미지
김우근
지식공유자

2024. 01. 27. 02:30

안녕하세요. 근래에 책을 집필할 기회가 생겨 그쪽에 힘을 실어주다 보니 다른 일에 신경 쓰지 못했습니다. 답변이 늦어 죄송합니다. 다만 해당 강의는 공식적으로 질의응답을 제공하지 않는 강의였다는 점을 이유로 늦어진 부분에 대해 양해 부탁드립니다.

우선 "RDB의 1개 Table을 2개 이상의 Entity로 매핑해서 운영을 하는게 보편적인 방식인가요?” 이 질문에 맞춰 답변하겠습니다.

일단 테이블 하나에 Entity를 여럿 매핑해서 운영하려는 시도는 실제로 꽤 있었습니다. (https://vladmihalcea.com/multiple-entities-on-same-table/) 제가 예전에 본 어떤 프로젝트에서는 하나의 테이블에 Editable class 와 Readonly class를 분리해서 사용하고 있었고요. 조회할 때는 Readonly 클래스를 이용하되 편집이 필요한 경우 Editable 클래스로 변환해서 편집후 저장하고 있었습니다. (ex. 이는 경험담이라 유사 사례로 대체합니다. https://forum.hibernate.org/viewtopic.php?p=2401288 (그런데 이 글은 너무 오래되긴 했네요. 비슷한 사례를 쉽게 찾을 수도 없고요.))

그래서 JPA를 이렇게 운영 하는 것을 ‘저는’ 이상하다 생각하지 않습니다. 다만 이는 hibernete 철학과는 어긋나는 방향이기 때문에 권장하지 않는다는 말이 있으니 참고 바랍니다.(https://stackoverflow.com/a/64862047)

그래서 이야기한 것처럼 개발하는 것이 보편적이냐 물어본다면, 솔직히 그건 아닌 것 같습니다. 😭 경험상 대부분 조직이나 회사에선 하나의 Table에 하나의 Entity를 매핑해서 사용하고 있는 듯 보였습니다. 그래서 저도 ‘왜 그렇게 사용하지 않는 걸까?’에 관해서 많이 고민했었는데요. 제가 내린 결론은 결국 돌고 돌아 ‘복잡하게 사용하고 싶지 않아서 그런 거 아닐까?’였습니다.

더불어 개인적으로는 JPA를 어떻게 더 잘 사용하려는 생각은 이미 많이 버린 상태입니다. 이와 관련해는 이전의 글에서도 의견을 피력한 바가 있기에 링크로 대체합니다. (https://www.inflearn.com/questions/978220/진짜-객체지향과-테스트하기-쉬운-코드를-위헤서는-jpa가-의미없는게-아닌가하는-생각이-들어요)

다음으로 이건 질문과는 별도로 이야기하면 좋은 주제인 것 같아 글로 남깁니다. 객체 지향에서 말하는 역할은 클래스보단 인터페이스에 가까운 개념입니다. 인터페이스로 역할을 지정하고 클래스가 그 역할을 수행하는 관계라 생각하면 객체 지향을 이해하는 데 조금 더 도움이 되지 않을까 싶네요!

답변이 도움 됐길 바랍니다.

0

인프런 AI 인턴님의 프로필 이미지

2023. 10. 08. 00:41

안녕하세요, 인프런 AI 인턴이에요.

RDB의 1개 Table을 2개 이상의 Entity로 매핑하는 것은 보편적인 방식은 아닙니다. 일반적으로 1개의 Entity Class는 1개의 RDB Table과 매핑됩니다. 이렇게 설계하는 이유는 객체지향 프로그래밍과 RDB의 차이 때문입니다.

객체지향 프로그래밍에서는 클래스와 객체 간의 협력 관계를 먼저 설계하고, 그에 맞는 데이터 모델을 작성합니다. 따라서, 비즈니스 모델을 객체지향적으로 설계한 후에 데이터베이스 스키마를 작성하는 것이 일반적입니다.

객체의 협력 관계를 먼저 설계하고 나면, 이를 RDB에 맞게 매핑해야 합니다. 이때 @Entity 어노테이션을 사용하여 객체를 RDB 테이블에 매핑할 수 있습니다. 하지만, 모든 경우에 1:1로 매핑하는 것은 아니기 때문에 여러 개의 Entity Class가 하나의 RDB 테이블과 매핑되는 경우도 있을 수 있습니다.

하지만, 일반적으로는 객체와 RDB 간의 매핑은 1:1로 이루어지는 것이 좋습니다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있습니다. 따라서, 1개의 RDB Table을 2개 이상의 Entity로 매핑하여 운영하는 것은 예외적인 경우일 수 있습니다.

결론적으로, 객체의 협력 관계를 먼저 설계한 후에 데이터베이스 스키마를 작성하는 것이 일반적이며, 대부분의 경우에는 1개의 RDB Table에 1개의 Entity를 매핑하는 것이 보편적입니다.

저희 AI는 프로그래밍과 인프런 관련된 질문에 대한 답변만 가능합니다. 더 궁금하신 점은 인프런 고객센터로 문의해 주세요. 감사합니다!

미란님의 프로필 이미지

작성한 질문수

질문하기