Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[M1칩조] 파즈 5장 PR 제출합니다. #60

Open
wants to merge 1 commit into
base: bepoz
Choose a base branch
from

Conversation

Be-poz
Copy link

@Be-poz Be-poz commented Jun 9, 2021

5. 서비스 추상화

JdbcTemplate은 하나의 템플릿 메소드 안에서 DataSource의 getConnection() 메소드를 호출해서 Connection 오브젝트를 가져오고, 작업을 마치면 Connection을 확실하게 닫아주고 템플릿 메소드를 빠져나온다.

Dao 메소드를 호출할 때 마다 새로운 트랜잭션이 만들어지는 구도일 시에 여러번 DB 업데이트를 해야 하는 작업을 수행할 때에 적절하게 롤백을 할 수 없을 것이다. 그래서 비즈니스 로직 내에 트랜잭션 경계 설정을 해주어야 한다. 하지만, 서비스 계층에 Connection을 들고 있을 수는 없다. 빈은 싱글톤으로 관리되기 때문에 상태를 가지면 여러 문제가 발생하게 된다.
image

이를 위해 스프링에서는 트랜잭션 동기화라는 방식을 사용한다. 트랜잭션을 시작하기 위해 만든 Connection 오브젝트를 특별한 저장소에 보관해두고, 이후에 호출되는 DAO의 메서드에서는 저장된 Connection을 가져다가 사용하게 하는 방법이다. 정확히는 DAO가 사용하는 JdbcTemplate이 트랜잭션 동기화 방식을 이용하도록 하는 것이다.
image

하지만 만약 하나의 트랜잭션 안에서 여러 DB에 데이터를 넣게 되는 경우에 문제가 생긴다. 트랜잭션은 하나의 DB에 종속되기 때문이다. 이 경우에 글로벌 트랜잭션 방식을 사용해야 한다. 자바는 JDBC 외에 이런 글로벌 트랜잭션을 지원하는 트랜잭션 매니저를 지원하기 위한 API인 JTA(Java Transaction API)를 제공한다.

image

하지만 이것을 사용하게되면 기술환경에 따라서 UserService의 코드를 변경해주어야 한다. 때에 따라서는 Hibernate를 사용할 수도 있는데 이 경우에는 Connection이 아닌 Session을 사용하게 되므로 이 경계 또한 설정해주어야 한다.

image

Service에서는 이제 PlatformTransactionManager만 알면된다. DAO를 하이버네이트나 JPA, JDO 등을 사용하도록 수정하더라도 그에 맞게 transactionManager의 클래스만 변경해주면 되고, UserService는 변경할 필요가 없어지게 된다.

코드 안따라치고 그냥 읽었습니다!
트랜잭션이 필요한 이유, 여러 디비를 사용할 경우의 글로벌 트랜잭션 이용과 그에 따른 추상화 계층 변환.
커넥션이 아닌 다른 방식을 사용하는 경우(여러 다양한 기술)의 추상화 계층을 나누는 작업이 주된 내용이었네요. 메일은 안읽었습니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant