저번 시간에 이어, 이번엔 JPA를 사용하는 이유가 무엇인지에 대한 질문들을 알아보겠습니다. 이번에 등장하는 문제들은 서비스 플랫폼 회사 L사에서 등장한 문제들입니다. 필자의 개인적인 해석이 포함되어 있으며 본인만의 답변을 만들어보시길 권해드립니다.
Q: JPA를 사용하는 이유가 무엇인가요?
기존에는 테이블이 하나 생기면, 그 테이블에 대한 CRUD SQL을 모두 생성해야 했고 SQL 중심적인 개발이 진행될 수 밖에 없었다는 단점도 있었으며, 객체지향과의 패러다임의 불일치가 존재했습니다. 동일 트랜잭션 내에서 조회한 엔티티가 같음을 보장하기 위해, 객체를 자바 컬렉션에 저장 하듯이 DB에 저장할 수 있도록 하기위해 등장했고 연관관계 매핑으로 이러한 점을 구현했습니다.
Q: 연관관계 매핑이 왜 필요한가요?
JOIN 시에 객체관계 맵핑은 상속개념으로 데이터를 바로 가져올 수 있지만, 테이블은 그 자체로 고윳값을 가지지 못 하기 때문에 기본키-외래키 맵핑 연산으로 데이터를 가져와야 합니다. 이 것은 객체지향의 상속 개념에도 위반되며 객체지향 관점의 협력 관계라고 볼 수 없습니다.
Q: JPA에서 2개 이상의 데이터 변경 요청이 동시에 하나의 Entity에 대해 발생할 때, 어떻게 해결할 수 있을까요?
하나의 회원 데이터에 대해서 2개의 변경 요청이 동시에 발생할 때를 가정해서, 2가지 해결 방법을 말씀드릴 수 있습니다.
낙관적 Lock: Lock을 우선적으로 걸어두지 말고, 동시성 문제가 발생할 때, 처리하는 방법론입니다.
- 충돌이 없을 것으로 기대하고 진행합니다.
- 충돌을 막지 않고, 충돌 감지 시 처리를 시작합니다.
- 일반적으로 version 상태를 보고 충돌을 확인하며, 충돌이 확인될 경우 rollback을 진행합니다.
- hashcode나 timestamp를 이용하여 충돌을 확인할 수도 있습니다.
- DB에서 충돌을 처리하는 것이 아닌, Application 단에서 처리합니다.
장점: 충돌이 안 일어난다는 가정 하에, 동시 요청에 대해서 처리 성능이 좋습니다.
단점: 잦은 충돌이 일어나는 경우, rollback처리에 대한 비용이 많이 들기 때문에 성능이 좋지 않습니다.
비관적 Lock: 동시성 문제가 발생할 것으로 예상하여 Lock을 겁니다.
- Shared Lock: 여러 thread가 한 데이터에 access할 때 읽기는 가능하나, 수정은 하나의 thread만 진행 가능하도록 합니다.
- exclusive lock: 읽기, 쓰기 모두 하나의 thread만 가능하도록 합니다.
장점: 충돌이 자주 발생하는 환경에서 rollback 횟수를 줄이고 성능을 향상시킬 수 있습니다.
단점: 서로 자원이 필요한 경우, lock으로 인해 데드락이 발생할 가능성이 있습니다.
마치며
이번 시간에는 JPA가 무엇인지와 그에 대한 심화 면접 질문들을 간단하게 알아보았습니다.
신입 개발자 기준으로 어려운 개념에 속한다고 할 수 있기 때문에 자주 나온다고는 할 수 없지만, 본인의 포트폴리오에서 JPA를 다루었거나, 해당 직무 설명에 JPA가 등장한다면, 숙지하시길 강력히 권해드립니다.
이번 Spring 카테고리에서도 다양한 면접 질문들을 마주했습니다. 반복적으로 학습하시고 좋은 결과를 이룰 수 있으시길 바랍니다.
답글 남기기