기존의 getById()
Spring 2.5 이전 버전에선 getOne()과 getById()란 메서드가 있었다. getOne()과 getById()는 findById()와 같은 동작을 하지만 분명한 차이점이 있다. 먼저 메서드 명으로 동작을 유추해보자.
getOne() 은 하나를 가져온다? 라고 해석이 된다. 뭔가 메서드 명에서 재사용 하기에 부족한 것 같은 느낌이 든다. 찾아 보니 deprecated가 되었다.
getById() 는 Id 로 부터 가져온다.? 라고 해석이 된다. findById() 는 Id 로 부터 찾아온다.? 라고 해석이 된다.
즉, getById() 는 영속성 컨텍스트에 올라가 있는 프록시 객체를 lazy 로딩으로 가져온다. findById() 는 직접 DB를 조회하여 where 절로 가져온다.
여기서 만약 persitant에 들어가지 않은 객체를 가져온다면?
라는 예외가 발생한다.
deprecated 된 getById() 대안으로 getReferenceById() 제공
객체 지향 프로그래밍에서 이름 짓기는 아주 중요한 요소이다. 해당 기능이 어떤 기능이 하는지 명확하게 알아볼 수 있도록 하는 장점을 가진다.
여기서 내가 생각 한 spring 2.5 이전 버전의 getById()는 사실상 영속성 컨텍스트에 참조되어 있는 프록시 객체를 가지고 오는 것이 아니라 db에서 직접 가져온다라는 기능을 가진 메서드라 생각했다.
메서드 명 에서 명확함 이 좀 더 필요했었던 것 같았는지 Spring 2.5 이후 부터 getById() 를 dpreacted 로 선언하였고 getReferenceById() 를 추가하였다.
getReferenceById() 도 getById() 와 같은 동작으로 영속성 컨텍스트에 참조되어 있는 프록시 객체를 lazy 로딩으로 가져오는데 getById() 보다 메서드 명으로 좀 더 동작을 잘 유추할 수 있게 됬다.
findById() 와 getReferenceById() 어떤 것을 사용할까?
둘의 차이점은 프록시 객체를 lazy로딩으로 가져온다는 것과 db에서 직접 조회해서 가져온다라는 것인데, 이는 서비스 로직에서 다루는 객체가 영속성 컨텍스트에 올라가 있는 객체인지 잘 판단하여 getReferenceById() 를 사용할 지 findById() 를 사용할 지 개발자가 정해야 한다.
참조 :
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/
'JPA' 카테고리의 다른 글
[Jpa] 대댓글 계층구조 연관관계 메소드 이슈 (0) | 2022.08.12 |
---|---|
[Jpa] Cascade (0) | 2022.08.07 |
[Jpa] Transaction Propagation (0) | 2022.08.06 |
[Jpa] Transaction Scope and Isolation (0) | 2022.08.05 |
[Jpa] Dirty Checking (0) | 2022.07.19 |
[Jpa] Projections (0) | 2022.07.18 |
[Spring JPA] 트랜잭션은 언체크, 체크 예외에 대해 어떻게 커밋과 롤백을 처리할까? (1) | 2022.05.18 |
[Spring JPA] CASCADE 는 무엇일까? (0) | 2022.05.15 |