Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PK 생성을 DB에 위임하지 않았을 시 발생하는 문제와 해결 (feat.복합키) #5

Open
Sun26-Avrin opened this issue Feb 3, 2022 · 0 comments

Comments

@Sun26-Avrin
Copy link
Owner

Sun26-Avrin commented Feb 3, 2022

PK 생성을 DB에 위임하지 않았을 시 목격되는 현상

  • 엔티티를 생성하고 insert를 위한 로직에서 select쿼리가 하나 더 호출 되는 현상

이러한 현상의 이유는?

프록시객체는 PK를 기반으로 움직이며, PK가 null 인 프록시로 DB와 관련된 일을 수행할 경우 PK를 받아오려 select 를 날린다. (referencedColumn 에서도 목격됨) 하지만 null 인 값이 @mapsid, @GeneratedValue, @manytoone 과 같은 어노테이션으로 매핑되어 있을 경우는 select를 날리지 않고 EntityManager가 자동주입을 해준다.

PK가 null이 아닌 프록시로 DB와 관련된 일을 수행할 경우, 영속성에서 해당 PK를 가진 엔티티를 검색하며, 없을 경우 Select를 날려 영속성에 추가한다.

insert 를 위해 엔티티를 생성하였기 때문에 프록시 객체가 아닌 엔티티 객체이다.

밑의 save() 의 스크린샷에서 확인 할 수 있듯이, isNew로 persist() 냐 merge() 가 분기하는데
엔티티에 pk가 없으면 isNew == true, pk가 있으면 isNew == false 이다.

persist는 sql 저장소에 sql문을 저장하고 영속성에 추가한다.

merge는 영속성컨텍스트에 해당 엔티티가 있나 확인하고 없으면 select로 엔티티를 가져온다.
select 로 반환되는 값이 없다면 해당 객체를 insert 한다.

merge의 반환값이 영속성에 추가된다. (이래서 save로 반환되는 엔티티로 작업하라는 관념이 생긴 것)

나는 ID를 내가 직접 주입해줘야한단 말야.... (복합키, 대리키, 업무키 경우)

  • save()의 경우

Screen Shot 2022-02-03 at 5 32 39 PM

위의 save 구현 코드를 보면 isNew로 persist와 merge가 나누어진다.

insert를 위한 로직에서 select쿼리가 나가는 이유는 em.merge() 가 실행되었기 때문이다.

그럼 isNew 를 재정의 해주면 된다.

테스트 코드

isNew 재정의 부분

수정할사항

  1. 프록시가 아니라 객체를 생성한 것이기 때문에 엔티티임
  2. 원시타입은 null 값이 없으니까, isNew에 항상걸리나? 테스트해볼것 save() 호출 시, 원시타입의 PK는 isNew가 True 일까? #7 확인
@Sun26-Avrin Sun26-Avrin changed the title PK 생성을 DB에 위임하지 않았을 시 발생하는 문제와 해결 (프록시) (feat.복합키) PK 생성을 DB에 위임하지 않았을 시 발생하는 문제와 해결 (feat.복합키) Feb 17, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant