강의

멘토링

커뮤니티

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

cho766님의 프로필 이미지
cho766

작성한 질문수

6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법

4-8. 락 실습 및 데드락 해결하기

데드락 발생 시, 외래 키를 제거하는 방법 관련 질문

작성

·

24

·

수정됨

0

1. 현재 학습 진도

  • 몇 챕터/몇 강을 수강 중이신가요? 4-8

     

  • 여기까지 이해하신 내용은 무엇인가요?

    • 외래키 제약조건으로 인해 발생한 데드락 문제를 해결하기 위해 INSERT하려는 테이블에 외래 키를 제거한다.

       

 

2. 어려움을 겪는 부분

  • 외래키를 만약에 제거한다면, 어플리케이션 레벨에서 직접 관리한다고 했는데, 구체적으로 어떻게 관리를 하는 건지 궁금합니다!

    • INSERT하려는 테이블과 연관된 테이블들을 먼저 조회(findXXX())를 하고, 만약에 없다면 예외를 발생시켜서 트랜잭션을 롤백시키는 방식으로 처리하나요? 실무에서 주로 어떻게 해결하는지 궁금합니다.

  • 그리고 외래키를 사용하지 않는 첫 번째 방법은 이미 테이블이 생성된 시점(INSERT하려는 테이블에 외래키가 추가되어 있는 상황)에서도 적용할 수 있는건가요?

    • 예를 들어, 이미 테이블에 데이터가 추가되어 있는 상황에서 첫 번째 방법을 적용하려면, 테이블 구조를 아예 바꿔야 할텐데 이 경우에는 두 번째 방법인 쿼리 순서를 바꾸는 걸 대안으로 사용하는 건가요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. cho766님.

외래 키 제약 조건과 관련된 데드락 문제 해결에 대한 질문을 주셨네요. 이와 관련하여 두 가지 핵심 질문에 대해 답변드리겠습니다.

1. 외래키 제거 후 어플리케이션 레벨에서 데이터 무결성 관리

외래키를 제거한 후 어플리케이션 레벨에서 데이터의 무결성을 관리하는 방법은 다음과 같습니다:

  • 사전 조회(Check Before Insert):

    • 어떤 데이터를 삽입하기 전에, 해당 데이터가 유효한지 확인하기 위해 관련 테이블을 미리 조회합니다. 예를 들어, 특정 외래키에 연결된 데이터가 존재하는지를 확인합니다. 이를 위해 직접적으로 SQL 조회(findXXX())를 먼저 수행한 다음, 관련 데이터가 없는 경우 예외를 던져서 트랜잭션을 롤백시킵니다.
  • 애플리케이션 로직으로 무결성 확보:

    • 이렇게 확인된 상태에서만 데이터 삽입이 이루어지도록 하여 외래 키 무결성을 응용 프로그램이 보장합니다.
    • 특정 라이브러리나 ORM(Object-Relational Mapping)을 사용하는 경우, 이러한 무결성 보장을 위해 추가적인 비즈니스 로직을 작성할 수 있습니다.

실제 예시: 스프링 프레임워크에서는 서비스 계층에서 이러한 검증 로직을 추가하여 외래키로 인해 발생할 수 있는 무결성 문제를 예방할 수 있습니다.

2. 외래키 제거 후 기존 테이블에 적용 가능 여부 및 쿼리 순서 변경 대안

  • 이미 생성된 테이블에서도 외래키 제거 가능:

    • 기존 테이블에서도 외래키를 제거하는 것이 가능하긴 합니다. 하지만 이 경우에는 데이터의 무결성을 우리가 직접 관리해야 하므로 더 복잡한 어플리케이션 로직이 필요합니다.
    • 테이블이 이미 존재하고 충분한 데이터가 있는 상태에서 외래키를 제거하면, 새로운 데이터 삽입 시 잘못된 데이터가 입력될 가능성이 있으므로 더욱 철저한 검증 및 관리가 필요합니다.
  • 쿼리 순서 변경:

    • 외래키를 제거하지 않고도 데드락을 피하고 싶다면 트랜잭션 내에서 쿼리 순서를 조절하여 외래키 제약조건에 걸리지 않도록 할 수 있습니다.
    • 즉, 데이터의 일관성이 깨지지 않도록 관련된 테이블에 대해 적절한 순서로 INSERT, UPDATE, DELETE 쿼리를 수행하거나, 잠금을 적절히 활용하여 문제가 되는 시점에 트랜잭션이 충돌나지 않도록 하는 방법입니다.

외래키 관리에 대한 더 많은 정보와 실전 적용 사례는 아래 링크를 참고해 보세요:
- 외래키 제거 후 관리 사례

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

cho766님의 프로필 이미지
cho766

작성한 질문수

질문하기