해결된 질문
작성
·
251
0
답변 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
감사합니다.