[JPA]getOne() 과 findById의 차이

윤재열·2022년 3월 3일
0

JPA

목록 보기
4/21
post-custom-banner

책에 있는 예제를 보다가 오류가 발생하여 getOne()에 대해서 한번더 공부해보려고 정리해보았습니다.

  • findById()getOne()메서드는 모두 기본 데이터 저장소에서 개체를 검색하는데 사용합니다.
  • 그러나 레코드 검색을 위한 기본 케머니즘은 두 메서드가 다릅니다.(getOne()은 데이터페이스에 도달하지도 않는 지연 작업 입니다.

getOne()메서드

  • getOne()은 주어진 식별자를 가진 엔티티에 대한 참조를 반환합니다.
  • getOne은 내부적으로 EntityManager.getReference()메서드를 호출합니다. 문서에 따라 이 메서드는 항상 데이터베이스에 충돌하지 않고(지연하게 가져옴)프록시를 반환합니다.
  • 이 메서드는 요청된 엔티티가 데이터베이스에 없는 경우 실제 엑세스 시 EntityNotFoundExceoption을 thorow 합니다.

findById()메서

  • 이 메서드는 실제로 데이터베이스에 도달하고 데이터베이스의 행에 대한 실제 개체 매핑을 반환합니다.
  • 데이터베이스에 레코드가 없는 경우 null을 반환하는 것은 EAGER 로드 작업입니다.

어느것을 선택할 것인가?

  • 이 두 방법의 차이는 성능에 관한 것입니다.

  • 지연로딩된 getOne() 메서드는 반환된 프록시 개체의 속성에 실제로 엑세스 할 때까지 데이터베이스에 도달하지 않으므로 JVM에서 데이터 베이스 왕복을 방지합니다.

  • 관계(OneToOne 또는 ManyToOne)를 유지하기 위해 데이터베이스에서 엔티티를 검색하고 다른 개체에 대한 참조를 할당하려는 예제가 있습니다.

  • Department에 속한 Employee가 있습니다.

@Entity
@Table(name = "t_departments")
public class Department {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;

    private String name;
@Entity
@Table(name = "t_employees")
public class Employee {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;

    private String name;

    @ManyToOne  
    private Department department;
  • 직원 개체에는 부서 참조가 필요합니다.
  • 이제 새 직원을 만들고 부서에 할당하려는 코드를 생각해 보겠습니다.
@Service
@Transactional(propagation = Propagation.REQUIRES_NEW)
public class HRService {

    @Autowired
    private DepartmentRepository departmentRepository;

    @Autowired
    private EmployeeRepository employeeRepository;

    public Department createDepartment() {
        Department dept = new Department();
        dept.setName("Product & Engg");
        return departmentRepository.save(dept);
    }

    public void createEmployee1(long deptId) {
        final Department pne = departmentRepository.getOne(deptId); 
        Employee employee = new Employee();
        employee.setName("Foo 1");
        employee.setDepartment(pne);
        employeeRepository.save(employee);
    }
  • Department 개체의 참조를 검색하여 직원에게 할당합니다.
  • 부서 개체의 세부 정보를 가져올 필요가 없기 때문에 이 특별한 경우에는 getOne()을 사용하고 그 외에는 findById()를 사용하는 것이 좋습니다.

profile
블로그 이전합니다! https://jyyoun1022.tistory.com/
post-custom-banner

0개의 댓글