인프런 커뮤니티 질문&답변

천수환님의 프로필 이미지
천수환

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

엔티티 클래스 개발2

외래키 제약 조건

작성

·

303

1

[질문 내용]
강의 내용 중 "외래키를 꼭 사용해야할까?" 에 대한 물음에 두 가지 방안을 주셨는데요.
  1. 빠른 처리가 중요하며 실시간 트래픽이 많은 시스템인 경우 -> "외래키를 사용하지 않는 쪽도 고려해볼만 함"
  2. 돈이 왔다갔다 하는 등의 reliablity가 중요한 시스템인 경우 -> "외래키를 꼭 사용하라"
그렇다면 질문이 있습니다.질문 1. 만약 외래키 제약조건이 관계형 DB에 이미 걸려있는 상태라면 Java 코드상에서는 아무런 설정 없이 비즈니스 로직을 개발해도 되나요?질문 2. 만약 외래키 제약조건이 관계형 DB에 걸려있지 않고 관계형 DB의 성능상의 이슈로 외래키 제약 조건을 애플리케이션에서 해결해야 한다면 해당 로직 또한 개발해야 하나요? 즉, JPA가 외래키 제약 조건을 체크해주는 기능이 있는지 궁금합니다.

답변 1

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 천수환님

  1. 외래키 제약조건이 이미 설정된 경우의 Java 코드 개발: 외래키 제약조건이 데이터베이스에 이미 설정되어 있다면, 이는 데이터베이스 수준에서 관계의 무결성을 보장합니다. Java 코드상에서 별도의 설정이나 체크를 추가하지 않아도, 데이터베이스에서 외래키 제약조건 위반 시 오류를 발생시켜 관계 무결성을 유지합니다. 그러나, 어플리케이션 수준에서 무결성 오류를 더 우아하게 처리하거나, 비즈니스 로직에 따라 추가적인 유효성 검증 로직을 구현할 필요가 있을 수 있습니다.

    제가 추천하는 것은 애플리케이션에서 한번 더 검증하는 것이 좋다 입니다. 그렇지 않으면 DB에서 예외가 계속 날라오게 되고 이것을 처리하는 것이 번거로워 집니다. 그리고 DB에서 발생하는 예외는 정말 예외로 보고 사용자에게는 오류 페이지를 보여주고, 개발자는 오류 로그로 해당 문제를 확인하는 것이 좋습니다.

 

  1. 외래키 제약조건이 없는 경우의 JPA 사용: 외래키 제약조건이 데이터베이스에 설정되어 있지 않다면, JPA와 같은 ORM(객체 관계 매핑) 프레임워크를 사용하여 어플리케이션 수준에서 관계의 무결성을 유지할 수 있습니다. JPA는 엔티티 간의 관계를 객체 모델로 매핑하고 관리할 수 있는 기능을 제공합니다. 따라서, 어플리케이션 로직에서 관계 무결성을 체크하거나 유지하는 로직을 개발할 수 있습니다. 그러나, 이는 데이터베이스 수준의 무결성 보장과는 다른 개념이며, 성능상의 이슈나 복잡한 비즈니스 요구 사항에 따라 적절한 설계와 구현이 필요합니다.

정리하면 JPA가 연관관계를 통해 어느정도는 무결성을 해결해주지만, 완벽한 해결책이 되지는 않습니다. 특히 데이터베이스는 여러 서버에서 동시에 요청을 처리하게 되는데, JPA는 각각의 애플리케이션 서버에서 작동하기 때문에 동시성에 대한 무결성 처리까지 완벽히 보장하기는 어렵습니다.

 

감사합니다.

천수환님의 프로필 이미지
천수환

작성한 질문수

질문하기