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

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

xxapara님의 프로필 이미지
xxapara

작성한 질문수

실전! Querydsl

객체설계에 대해서 질문이 있습니다.

해결된 질문

작성

·

251

0

안녕하세요. 김영한 강사님.
강사님이 올려주신 강의를 잘 듣고 있습니다.
궁금한 부분은 JPA를 사용하고 있는 현업에서는 어떻게 설계하며, 개발을 진행하는지입니다.
우선 제 상황을 간단하게 말씀드리면 업무요건을 확인하면서 아래의 단계로 설계를 진행합니다.
1. 개념데이터 모델링
- 주 목적은 업무요건에 맞춰서 엔터티가 잘 도출되었는지 확인합니다.
2. 논리데이터 모델링
- 주제영역 , 엔터티 정의, 엔터티관계 정의(1:1, 1:N), 속성정의(식별자도출), 역정규화 등등
- 메타데이터(표준단어, 표준용어, 도메인,유효값) 한글(영문)명 생성
3. 물리데이터 모델링
- 논리데이터 모델링을 기준으로 물리데이터 생성합니다.
위 단계처럼 계속적으로 업무요건에 맞게 논리데티터 모델링을 진행하고, 최종적으로 물리데이터 모델링을 진행후 에 개발을 진행합니다.

질문-1) 궁금한건 JPA DDD 기반으로 설계를 하는경우에도 위 단계처럼 엔터티 설계 후 객체(Entity)를 테이블 기준으로 생성하는지요? 아니면 객체와 테이블을 나누어서 영역별로 설계를 진행하는지요? 객체와 테이블간의 설계 순서가 있는지 궁금합니다.

질문-2) 만약 위 질문-1)처럼 테이블 설계 후 객체(Entity) 설계를 진행하는경우 객체의 필드를 테이블기준으로 컬럼매핑한다면 맵핑관계에서 객체필드의 속성들을 테이블속성에 위임하는지요? 즉, 물리테이블 생성 시 컬럼사이즈, not null, default, unique index 정의 해놓고 추가적으로 객체에도 컬럼 어노테이션으로 추가적으로 설정을 하는지요. 아니면 테이블 속성에 위임을 하는지 궁금합니다.

질문-3) 객체별 식별자는 @ID Long ID 를 정의해서 수업을 진행하셨는데 보통 pk는 어떤 규칙으로 생성하는지 궁금합니다.
- 어떤 교재에서는 독립엔터티인경우 인조키로 생성하여 종속 혹은 교차엔터티는 부모의 식별자를 상속(pk) or 비상속(fk)받거나, 하위 엔터티와의 연관관계가 깊어지면 연결관계를 끊고 인조키를 생성한다고 합니다.
- 근데 또 어떤분들은 인조키만으로도 충분하다고 하시면서 모든 테이블(독립/교차/종속 전체)들을 모두 인조키로만 생성하여 진행한다고도 합니다.

질문-4) JPA 영속성 컨텍스트(SQL 저장소,1차캐시)는 지연 및 변경을 이용하여 SQL를 직접 사용하지 않고 Jpql, Flush, Transaction 등 특정 이벤트가 발생하면 jpa가 쿼리를 직접 수행하는걸로 이했습니다. 정말 개발자에게는 등록/수정/조회/삭제 등 쿼리 작성하지 않고 비지니스 로직처리에 집중한다고 하는데 좋은 기술인거 같습니다.
만약 영속성 컨텍스트를 사용하여 특정 객체를 조회하면 추가적으로 동일 객체를 조회하게 된다면 영속성 컨텍스트에 있는 객체가 조회된다고 이해하였습니다. (참조값동일) 하지만 만약 누군가가 이미 동일 객체를 변경하여 오라클 버퍼캐쉬 및 디스크까지 저장된 상태라면 어떻게 되는지요? 트랜잭션 격리성이 "Non-Repeatable Rad" 인지요?
영속성 컨텍스트가 변경감지를 통해서 동일객체가 변경되었다는걸 알고 db에서 재조회를 한 이후에 영속성컨텍스트에 재적재를 하는지 잘 이해가 되지 않아서 질문드립니다. (참고 16.1.1 트랜잭션과 격리수준)
감사합니다.

답변 1

1

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

안녕하세요. xxapara님 좋은 질문입니다^^

질문-1) 궁금한건 JPA DDD 기반으로 설계를 하는경우에도 위 단계처럼 엔터티 설계 후 객체(Entity)를 테이블 기준으로 생성하는지요? 아니면 객체와 테이블을 나누어서 영역별로 설계를 진행하는지요? 객체와 테이블간의 설계 순서가 있는지 궁금합니다.

객체를 먼저 설계하고, 테이블을 설계합니다. 그런데 이것은 이론적인 내용이고 실무에서는 결국 데이터베이스 성능이 매우 중요하기 때문에, 객체를 먼저 설계하지만, 머리속으로 테이블 설계도 함께 그려져야 합니다.

순서상 객체 설계를 먼저 하고 테이블을 설계를 그 다음에 하지만 사실상 둘이 동시에 한다고 이해하시면 됩니다.

ORM을 제대로 사용하려면 결국 객체 설계와 테이블 설계를 모두 잘해야 합니다.

질문-2) 만약 위 질문-1)처럼 테이블 설계 후 객체(Entity) 설계를 진행하는경우 객체의 필드를 테이블기준으로 컬럼매핑한다면 맵핑관계에서 객체필드의 속성들을 테이블속성에 위임하는지요? 즉, 물리테이블 생성 시 컬럼사이즈, not null, default, unique index 정의 해놓고 추가적으로 객체에도 컬럼 어노테이션으로 추가적으로 설정을 하는지요. 아니면 테이블 속성에 위임을 하는지 궁금합니다.

이 부분은 순서와 상관없이 엔티티에 적어둡니다. 그래야 JPQL을 작성할 때 엔티티만 보고 바로 인덱스를 찾을 수 있습니다.

질문-3) 객체별 식별자는 @ID Long ID 를 정의해서 수업을 진행하셨는데 보통 pk는 어떤 규칙으로 생성하는지 궁금합니다.

- 어떤 교재에서는 독립엔터티인경우 인조키로 생성하여 종속 혹은 교차엔터티는 부모의 식별자를 상속(pk) or 비상속(fk)받거나, 하위 엔터티와의 연관관계가 깊어지면 연결관계를 끊고 인조키를 생성한다고 합니다.

- 근데 또 어떤분들은 인조키만으로도 충분하다고 하시면서 모든 테이블(독립/교차/종속 전체)들을 모두 인조키로만 생성하여 진행한다고도 합니다.

네 저는 모두 인조키를 사용하는 것을 선호합니다. 이렇게 하는 것이 장기적으로 변경에 유연합니다.

자세한 내용은 JPA 기본편 강의 - 기본 키 매핑 설명드린 내용을 참고해주세요.

질문-4) JPA 영속성 컨텍스트(SQL 저장소,1차캐시)는 지연 및 변경을 이용하여 SQL를 직접 사용하지 않고 Jpql, Flush, Transaction 등 특정 이벤트가 발생하면 jpa가 쿼리를 직접 수행하는걸로 이했습니다. 정말 개발자에게는 등록/수정/조회/삭제 등 쿼리 작성하지 않고 비지니스 로직처리에 집중한다고 하는데 좋은 기술인거 같습니다.

만약 영속성 컨텍스트를 사용하여 특정 객체를 조회하면 추가적으로 동일 객체를 조회하게 된다면 영속성 컨텍스트에 있는 객체가 조회된다고 이해하였습니다. (참조값동일) 하지만 만약 누군가가 이미 동일 객체를 변경하여 오라클 버퍼캐쉬 및 디스크까지 저장된 상태라면 어떻게 되는지요? 트랜잭션 격리성이 "Non-Repeatable Rad" 인지요?

영속성 컨텍스트가 변경감지를 통해서 동일객체가 변경되었다는걸 알고 db에서 재조회를 한 이후에 영속성컨텍스트에 재적재를 하는지 잘 이해가 되지 않아서 질문드립니다. (참고 16.1.1 트랜잭션과 격리수준)

다음 질문을 참고해주세요.

https://www.inflearn.com/questions/17498

감사합니다.

xxapara님의 프로필 이미지
xxapara

작성한 질문수

질문하기