All Honey Tip

[기술 면접] 15. JPA를 사용하는 이유가 무엇인가요?

JPA를 사용하는 이유가 무엇인가요?

저번 시간에 이어, 이번엔 JPA를 사용하는 이유가 무엇인지에 대한 질문들을 알아보겠습니다. 이번에 등장하는 문제들은 서비스 플랫폼 회사 L사에서 등장한 문제들입니다. 필자의 개인적인 해석이 포함되어 있으며 본인만의 답변을 만들어보시길 권해드립니다.

image



Q: JPA를 사용하는 이유가 무엇인가요?

기존에는 테이블이 하나 생기면, 그 테이블에 대한 CRUD SQL을 모두 생성해야 했고 SQL 중심적인 개발이 진행될 수 밖에 없었다는 단점도 있었으며, 객체지향과의 패러다임의 불일치가 존재했습니다. 동일 트랜잭션 내에서 조회한 엔티티가 같음을 보장하기 위해, 객체를 자바 컬렉션에 저장 하듯이 DB에 저장할 수 있도록 하기위해 등장했고 연관관계 매핑으로 이러한 점을 구현했습니다.



Q: 연관관계 매핑이 왜 필요한가요?

JOIN 시에 객체관계 맵핑은 상속개념으로 데이터를 바로 가져올 수 있지만, 테이블은 그 자체로 고윳값을 가지지 못 하기 때문에 기본키-외래키 맵핑 연산으로 데이터를 가져와야 합니다. 이 것은 객체지향의 상속 개념에도 위반되며 객체지향 관점의 협력 관계라고 볼 수 없습니다.



Q: JPA에서 2개 이상의 데이터 변경 요청이 동시에 하나의 Entity에 대해 발생할 때, 어떻게 해결할 수 있을까요?

하나의 회원 데이터에 대해서 2개의 변경 요청이 동시에 발생할 때를 가정해서, 2가지 해결 방법을 말씀드릴 수 있습니다.


낙관적 Lock: Lock을 우선적으로 걸어두지 말고, 동시성 문제가 발생할 때, 처리하는 방법론입니다.

  1. 충돌이 없을 것으로 기대하고 진행합니다.
  2. 충돌을 막지 않고, 충돌 감지 시 처리를 시작합니다.
  3. 일반적으로 version 상태를 보고 충돌을 확인하며, 충돌이 확인될 경우 rollback을 진행합니다.
  4. hashcode나 timestamp를 이용하여 충돌을 확인할 수도 있습니다.
  5. DB에서 충돌을 처리하는 것이 아닌, Application 단에서 처리합니다.
    장점: 충돌이 안 일어난다는 가정 하에, 동시 요청에 대해서 처리 성능이 좋습니다.
    단점: 잦은 충돌이 일어나는 경우, rollback처리에 대한 비용이 많이 들기 때문에 성능이 좋지 않습니다.


비관적 Lock: 동시성 문제가 발생할 것으로 예상하여 Lock을 겁니다.

  • Shared Lock: 여러 thread가 한 데이터에 access할 때 읽기는 가능하나, 수정은 하나의 thread만 진행 가능하도록 합니다.
  • exclusive lock: 읽기, 쓰기 모두 하나의 thread만 가능하도록 합니다.
    장점: 충돌이 자주 발생하는 환경에서 rollback 횟수를 줄이고 성능을 향상시킬 수 있습니다.
    단점: 서로 자원이 필요한 경우, lock으로 인해 데드락이 발생할 가능성이 있습니다.



마치며

이번 시간에는 JPA가 무엇인지와 그에 대한 심화 면접 질문들을 간단하게 알아보았습니다.

신입 개발자 기준으로 어려운 개념에 속한다고 할 수 있기 때문에 자주 나온다고는 할 수 없지만, 본인의 포트폴리오에서 JPA를 다루었거나, 해당 직무 설명에 JPA가 등장한다면, 숙지하시길 강력히 권해드립니다.

이번 Spring 카테고리에서도 다양한 면접 질문들을 마주했습니다. 반복적으로 학습하시고 좋은 결과를 이룰 수 있으시길 바랍니다.

image


코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다