Spring 트랜잭션 관리와 Proxy 패턴에 대해 공부해보던 과정

규바·2024년 10월 27일
2
post-thumbnail

개요

강의 중 아래와 같이 말씀하시고 Proxy 패턴에 대해 공부해보세요 라고 하셨습니다. 이해를 잘 하지 못했기 때문에, 말씀하신 내용을 정리하며 공부했던 내용을 적어보겠습니다.

다음 강의에 한번 짚고 넘어가겠다고 하셔서 그때 말씀의 의중을 알 수 있지 않을까 싶어요

말씀

public void a라는 메소드가 있다. 여기서 transaction처리해야하는데 writeArticle이라는 메서드를 트랜잭션해야하는데 a에다가도 transactional해놓고 writeArticle의 내용을 a에다가 넣어놓고 a호출해라 그러면 안된다. 직접적으로 타면 트랜잭션 타지 않아서 트랜잭션 관리가 안된다.

writeArticle 코드

    @Transactional
    public void writeArticle(BoardDto boardDto) throws Exception {
        boardMapper.writeArticle(boardDto);
        List<FileInfoDto> fileInfos = boardDto.getFileInfos();
        if (fileInfos != null && !fileInfos.isEmpty()) {
            boardMapper.registerFile(boardDto);
        }
    }

직접 객체 생성하지 말 것

아마 아래와 같은 그림을 말씀하신 것 아닐까 생각합니다.

@Service
public class OtherService {
    @Transactional  // 스프링이 이 어노테이션을 보고 프록시를 생성합니다
    public void a() {
        // DB 처리 로직
    }
}
// Case 1: 프록시를 통한 호출 (올바른 방법)
@Service
public class ArticleService {
    @Autowired  // 스프링이 프록시 객체를 주입
    private OtherService otherService;

    public void writeArticle() {
        otherService.a();  // 프록시를 통한 호출 -> 트랜잭션 처리 OK
    }
}
// Case 2: 직접 호출 (잘못된 방법)
public class ArticleService {
    public void writeArticle() {
        OtherService otherService = new OtherService();  // 직접 객체 생성
        otherService.a();  // 직접 호출 -> 트랜잭션 처리 안됨!
    }
}

스프링의 트랜잭션 관리를 사용하려면 반드시 프록시를 통해서 호출해야합니다.

프록시를 통한 호출을 하려면 스프링의 DI를 사용해야합니다.

만약 위의 잘못된 방법처럼 new키워드로 직접 객체를 생성하면 프록시가 아닌 실제 객체가 생성되어 트랜잭션이 동작하지 않습니다.

내부 호출

혹은 내부 호출을 하면 안된다는 뜻일 것도 같았습니다.

@Service
public class ArticleService {
    
    @Transactional
    public void writeArticle() {
        // 여기서 내부 메서드인 updateCount를 호출
        updateCount();  // 트랜잭션 적용 안됨!
    }

    @Transactional
    private void updateCount() {
        // DB 업데이트 로직
    }
}

내부 호출은 프록시를 거치지 않고 직접 호출되어 버립니다.

따라서 @Transactional 어노테이션이 동작하지 않습니다.


다음엔

Proxy 객체에 대해 짚고, Java, Spring에서 어떻게 쓰이고 있는지를 다루어보겠습니다.

그리고 볼 수록 이해가 안가는 트랜잭션, @Transactional에 대해서는 공부해보고 다룰 수 있으면 다뤄보겠습니다...🥲

profile
그때그때 학습하고 있는 내용을 올려요

0개의 댓글