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

dionisos198님의 프로필 이미지

작성한 질문수

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

주문 서비스 개발

@transactional 의 범위에 대해 질문이 있습니다.

24.02.16 03:38 작성

·

240

0


[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예

[질문 내용]
현재 개발을 하다가 @transactional 의 범위에 대해 궁금한 점이 있어서 질문 올립니다.

@Service
class A{
    //A 메서드
    @transactional
    public Response saveShowProgram{
       saveTV(Long openapiId);
       saveMovie(Long openapiId);
       Response = TV 의 일부+ movie의 일부
        return response;
     }
    //B 메서드 
    @transactional
    public Response saveShowMoive{
       saveMovie(Long openapiId);
       Response = Movie 내용 
       return response;
    }

    private Program saveMoview(Long openapiId){
        Program program= programRepository.findByOpenAPiId(openapiId).orElseGet(
    Program newProgram = apiProgramToProgram;
            programRepository.save(newProgrm);
            return newProgram;
     }

}

 

현재 문제 코드를 간략하게 나타낸 것입니다.

saveShowProgram 과 saveShowMovie 모두 saveMovie를 호출하고 있습니다.

 

근데 이게 개발 과정에서 테스트 할 때는 몰랐는데

프론트 쪽에서 동시에 파바바박 둘다 동시에 호출했는데

세상에나... 같은 openapiId를 가지고 있는 프로그램이 두개씩 저장되는 경우가 있는게 아니겠습니까??(원래는 saveMovie 에서 program 에서 openapiId를 통해 조회하고 조회결과가 있는 경우에는 그 조회한 결과를 반환하지만 그렇지 않은 경우 저장해서 반환하고 있습니다).

 

그래서 @transactional 에 대해 제대로 이해를 못하고 있다고 생각했습니다.

 

당연하게 여겼던 것

1) @tranactioanl 은 public 에 선언이 가능하고 거기 안에 t사용된 private 함수도 역시 @transactioanl 이다.

2) @transactional 이 붙은 것은 하나가 끝나면 처리되게 lock 이 걸릴 것이다.

 

이렇게 넘어갔었는데 어느 내용에서 제가 놓치고 있는게 있는지 알려주시면 감사하겠습니다! ㅠㅠㅠㅠㅠㅠㅠㅠㅠ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

답변 1

0

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

2024. 02. 16. 21:59

안녕하세요. dionisos198님

트랜잭션 관련된 부분은 기초적인 내용에 대한 학습이 필요합니다.

스프링 DB 1편 강의를 들어보시면 도움이 되실거에요.

감사합니다.