딸기말차
[Spring] 5. Transaction, Annotation 본문

엔코아 플레이데이터(Encore Playdata) Backend 2기 백엔드 개발 부트캠프 (playdata.io)
백엔드 개발 부트캠프
백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.
playdata.io
1. Transaction
1. 트랜잭션 ?
트랜잭션이란, DB의 상태를 변화시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위이다.
즉, 하나의 기능(작업)을 구현하기 위해 DB의 데이터를 변경 시키는 INSERT, DELETE, UPDATE를 엮어 사용하게 되는데, 이를 트랜잭션이라 한다.
2. 트랜잭션의 성질
1. 원자성(Atomicity)
트랜잭션의 연산이 모두 반영되도록 commit이 되거나 모두 반영되지 않도록 rollback이 되어야한다.
즉, 트랜잭션이 실행될 때 트랜잭션 내 모든 쿼리가 전부 정상작동하면 commit, 중간에 하나라도
에러가 발생 시 rollback 시켜 트랜잭션 실행 전으로 돌아가야한다는 것을 의미한다.
2. 일관성(Consistency)
트랜잭션의 작업 처리 결과는 항상 일관성이 있어야 한다.
즉, 한 트랜잭션이 동작하는 도중에 다른 요청에 의해 DB가 변경되더라도, 트랜잭션이 실행될 때의
DB 상태를 기준으로 동작을 완료해야한다는 것이다.
3. 독립성(Isolation)
한 트랜잭션 수행 시 다른 트랜잭션이 연산에 끼어들지 못하도록 보장해야한다.
즉, 한 트랜잭션이 동작하고 있다면 해당 트랜잭션이 완전히 종료되기 전까지 다른 트랜잭션에서
동작 중인 트랜잭션의 결과를 참조할 수 없다는 것을 의미한다.
4. 영속성(Durability)
성공적으로 완료된 트랜잭션의 결과는 시스템이 고장 나더라도 영구적으로 반영되어야 한다.
3. Commit & Rollback
SQL이 모두 정상적으로 동작했다면,
1) Commit
모든 작업의 결과를 데이터베이스에 영구 반영
2) Rollback
동작하던 SQL 중 하나라도 잘못된 것이 있으면 모두 취소한다.
2. 트랜잭션 예시
1. JDBC
JDBC 내에서 트랜잭션을 사용하는 경우, 트랜잭션을 사용하기 위한 코드를 정확한 위치에 작성해야한다.
1) 기본적으로 JDBC는 commit 기능이 auto로 설정되어 있기 때문에, commit 기능을 false로 꺼야한다.
2) 트랜잭션 실행
3) 트랜잭션이 무사히 완료되었다면, commit
4) 트랜잭션 중간에 에러가 발생해 catch 문으로 이동했다면, rollback
public void test() {
Connection connection = dataSource.getConnection();
try (connection) {
/* 트랜잭션 단위로 작업을 수행하려면, 한 쿼리가 실행될 때 자동으로 commit되는 option을 꺼야한다. */
connection.setAutoCommit(false);
// 1. SELECT QUERY
// 2. INSERT QUERY
/* QUERY들이 모두 정상 동작했다면, commit */
connection.commit();
} catch (SQLException e) {
/* QUERY 중 하나라도 에러가 났다면, rollback */
connection.rollback();
}
}
2. Annotation 사용
@Transaction을 사용한다면, setAutoCommit(false), commit(), rollback() 이 내부에 구현되어 있다.
때문에 개발자는 트랜잭션 내에 들어갈 쿼리에만 집중해 코드를 작성할 수 있다는 장점이 존재한다.
/* JDBC에서 트랜잭션을 위해 사용하던 autocommit off, commit(), rollback() 기능이 존재하는 @Transactional */
/* propagation=Propagation.REQUIRED 는 트랜잭션을 사용하겠다는 옵션으로 default 옵션이라 작성하지 않아도된다. */
@Transactional(propagation=Propagation.REQUIRED)
public class AccountService {
private AccountDAO accDAO;
public void setAccDAO(AccountDAO accDAO) {
this.accDAO = accDAO;
}
public void sendMoney() throws Exception {
/* 트랜잭션 수행 */
accDAO.updateBalance1();
accDAO.updateBalance2();
}
}
3. Annotation
1. 어노테이션 ?
어플리케이션의 기능이 복잡해짐에 따라 XML 설정 파일의 내용도 복잡해졌고, 유지보수에 문제가 생기기 시작했다.
때문에 스프링 3.0부터는 DI 같은 자바 코드와 관련된 설정은 Java 코드에서 할 수 있게 어노테이션이라는 기능을 제공해준다.
현재 스프링 기반 어플리케이션에서는 XML에서 설정하는 방법과 어노테이션 기능을 사용하는 방법 두 가지를 혼합해서 사용하고 있다.
스프링에서 어노테이션을 사용하려면, 스프링에서 제공하는 어노테이션 관련 클래스를 XML 설정 파일에서 빈으로 설정해야 한다.
* 브라우저 URL 요청 처리 애너테이션 관련 클래스
1. <bean class="org.springframework.web.servlet.mvc.annotation. DefaultAnnotationHandlerMapping"/>
클래스 레벨에서 @RequestMapping을 처리한다.
2. <bean class="org.springframework.web.servlet.mvc.annotation. AnnotationMethodHandlerAdapter"/>
메서드 레벨에서 @RequestMapping을 처리한다.
* <context:component-scan base-package="패키지 이름" />
해당 태그를 사용 시, 어플리케이션 실행 시 패키지 이름 하위 패키지 내의 @Component가 붙어있는 어노테이션들을 빈으로 등록한다.
ex) @Controller, @Service, @Repository
* @Autowired 이용해 빈 주입
XML에서 빈을 설정한 후 어플리케이션이 실행될 때 주입해서 사용하면 XML 파일이 복잡해지면서 사용 및 관리가 불편하다.
때문에 스프링에서는 @Autowired를 이용해서 별도의 setter나 생성자 없이 객체에 빈을 주입해 사용한다.
4. 31일차 후기
트랜잭션은 크게 복잡한 개념은 아니지만, 앞으로 배울 JPA는 모든 동작이 트랜잭션을 기준으로 동작하기 때문에 반드시 알고 있어야 하는 개념이다.
어노테이션은 기존에 xml에 복잡하게 작성하던 설정들을 간단한 단어 하나로 줄여서 사용할 수 있게 해준다.
비록 xml 파일보다 동작이 느리다는 단점이 존재하긴 하지만, 복잡한 설정을 단순하게 줄여서 사용할 수 있어 유지보수성이 뛰어나고, 개발자가 개발에 좀 더 집중할 수 있도록 도와주기 때문에 기존에 xml에 작성하던 방식을 이해하고 어노테이션을 외운다면 개발에 많은 도움이 될 것이라 생각한다.
'Bootcamp > Spring' 카테고리의 다른 글
| [Spring] 7. Log, Tiles (0) | 2023.08.21 |
|---|---|
| [Spring] 6. STS (0) | 2023.08.19 |
| [Spring] 4. Spring Mybatis (0) | 2023.08.16 |
| [Spring] 3. Spring JDBC, Mybatis (0) | 2023.08.14 |
| [Spring] 2. MVC (0) | 2023.08.12 |