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

이찬원님의 프로필 이미지

작성한 질문수

스프링 DB 1편 - 데이터 접근 핵심 원리

트랜잭션 - 적용2

하나의 비즈니스 로직에서 동일한 Connection을 사용해야 하는 것에 대해 질문드립니다.

해결된 질문

작성

·

160

·

수정됨

0

강의를 듣다가 의문점이 생겨서 질문 드립니다.

아래 코드는 강의중 작성된 코드입니다.

private void bizLogic(Connection con, String fromId, String toId, int money)
throws SQLException {
        //findById 호출시 connection을 전달
        Member fromMember = memberRepository.findById(con, fromId);
        Member toMember = memberRepository.findById(con, toId);

        memberRepository.update(con, fromId, fromMember.getMoney() - money);
        validation(toMember);
        memberRepository.update(con, toId, toMember.getMoney() + money);
}

강의를 듣던 도중 findById와 update는 굳이 같은 connection을 사용할 필요가 없다고 생각이 들었습니다.

그래서 아래와 같이 코드를 수정했고 강의에서 작성한 테스트 코드가 정상적으로 성공하였습니다.

private void bizLogic(Connection con, String fromId, String toId, int money)
throws SQLException {
        //findById 호출시 connection을 전달하지 X
        Member fromMember = memberRepository.findById(fromId);
        Member toMember = memberRepository.findById(toId);

        memberRepository.update(con, fromId, fromMember.getMoney() - money);
        validation(toMember);
        memberRepository.update(con, toId, toMember.getMoney() + money);
}

여기서 드는 의문점은 findById는 DB에서 Member 정보를 가져오는 것이고,
이 기능은 계좌 이체를 위한 update와 다른 connection을 사용해도 문제가 없다고 생각됩니다.
그럼에도 불구하고, 하나의 비즈니스 로직 흐름에서 같은 connection을 사용하는 것이 DB의 원자성을 지키기 위해 중요하다고 생각했습니다.
실무에서 한 비즈니스 로직 안에서 같은 connection을 사용하지 않아도 되는 경우에도 동일한 connection을 사용하는 것이 바람직한가요?

답변 1

2

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

님의 질문에 답변드리겠습니다.
하나의 비즈니스 로직에서 동일한 Connection을 사용하는 이유는, 트랜잭션을 관리하기 위함입니다. 트랜잭션은 여러 작업을 한 단위로 묶어서 모두 성공하거나 실패하도록 보장하는 기능입니다. 같은 Connection을 사용하면, 해당 Connection에 묶인 모든 작업들이 하나의 트랜잭션으로 관리됩니다.

예를 들어, 계좌 이체 과정에서는 돈을 보내는 계좌의 금액을 감소시키고, 받는 계좌의 금액을 증가시켜야 하는데, 이 두 과정이 하나의 트랜잭션으로 묶여야 합니다. 만약 중간에 오류가 발생하여 한 과정만 성공하고 다른 과정이 실패한다면, 데이터의 일관성이 깨지게 됩니다. 따라서, 두 작업 모두 동일한 Connection을 사용하여 하나의 트랜잭션으로 처리되어야 합니다.

실무에서도 이와 같은 이유로 한 비즈니스 로직 내에서는 가능한 같은 Connection을 사용하여 트랜잭션을 관리하는 것이 바람직합니다. 물론, 읽기 전용 작업의 경우에는 트랜잭션으로 묶을 필요가 없을 수도 있으나, 작업의 통합성과 일관성을 위해 전체 로직을 한 트랜잭션으로 관리하는 것이 좋습니다.

따라서, 님이 수정한 코드처럼 findById 작업에서 다른 Connection을 사용할 수도 있지만, 전체 로직의 원자성을 유지하기 위해 같은 Connection을 사용하는 것이 더 바람직하다고 볼 수 있습니다.