DDL
create table account
(
ulid varchar(26) not null
primary key,
user_ulid varchar(26) not null,
balance decimal(15, 2) default 0.00 not null,
account_number varchar(100) not null,
is_deleted tinyint(1) default 0 not null,
created_at timestamp default CURRENT_TIMESTAMP null,
updated_at timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
deleted_at timestamp null,
constraint account_number
unique (account_number)
);
create table user
(
ulid varchar(26) not null
primary key,
username varchar(50) not null,
access_token varchar(255) null,
created_at timestamp default CURRENT_TIMESTAMP null,
constraint username
unique (username)
)
- Spring Boot 에서는 @Transactional 을 사용하여 트랜잭션 처리가 가능하다
- 스프링부트 @Transactional 은 한 클래스에서 다른 클래스에 트랜잭션을 처리할때 자기순회 문제가 발생 할 수 있음.
장점 :
트랜잭션 추상화: 비즈니스 로직과 트랜잭션 로직을 분리하여 관심사를 명확히 분리할 수 있음.
명시적인 역할 구분: run()은 쓰기 트랜잭션, readOnly()는 읽기 전용 트랜잭션으로 구분되어 의도를 명확하게 표현할 수 있음.
확장성: 트랜잭션 실행 전/후에 로깅, 모니터링 등의 공통 기능을 손쉽게 삽입 가능.
유연한 전략 교체: JPA 외에 다른 트랜잭션 매커니즘으로의 교체가 쉬워짐 .