sun cloud

복습 키워드

javaSE(Standard Edition) image / javaEE(Enterprise Edition) image-20210906092859555 | jdk | compiler | jre | jvm | interpreter | gc | heap | local variable | stack | 자료구조 | Queue | static | metaspace | 객체지향 | inheritance | encaptulation | polymorphism | template method design pattern | abstract | interface | Collection | 객체 직렬화 | Stream | Thread | synchronized | extends Thread | implements Runnable | java.lang.Object | socket | String, StringBuilder, StringBuffer(thread safe) | sql | jdbc | DML | DDL | DCL | Driver loading | Connection | ComparedStatement | ResultSet | close | finally | order by | distinct |


트랜잭션과 서브쿼리에 대해 알아보겠습니다.

목차

TRANSACTION

: 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위를 트랜잭션이라고 합니다.

보통 업데이트 작업 중 오류가 생길 경우 작업을 정상 상태로 돌아오도록 하는 데 사용합니다.

DCLCOMMITROLLBACK 기능이 있는데, 이 두 기능이 트랜잭션 처리를 위해 필요합니다.

  • COMMIT: 변경된 작업 내용을 바로 실제 데이터베이스에 반영해줍니다.(실제 저장)
  • ROLLBACK: 변경된 작업 내용을 취소하고 이전 상태로 되돌려줍니다.


실생활 예시

예를 들면, 카드사에서 카드 발급 시 포인트 지급을 약속한다고 가정해보겠습니다.

카드를 발급할 때 카드만 발급되어선 안되고, 포인트 지급 또한 같이 이루어져야 하기 때문에 트랜잭션 처리가 필요합니다.
만약 카드는 발급되고 포인트는 지급되지 않거나, 카드는 발급되지 않고 포인트만 지급된다면 트랜잭션 처리 시 비정상 작업으로 인식해서 처음 상태로 되돌리게 해줍니다.

image

그림을 보시면 카드 발급이나 포인트 지급 과정 중 이상이 생길 경우 rollback하게 되어 처음 발급 신청 과정으로 되돌아가게 됩니다.


COMMIT & ROLLBACK

이제 본격적으로 자바에서 트랜잭션 처리하는 방법을 알아보겠습니다.

  • 기본적으로 자동 커밋을 지원하기 때문에 JDBC 기본 트랜잭션 설정을 변경해줘야 합니다.
    Auto Commit - true에서 수동(Mannual Commit) 모드로 변경
  • Connection의 method를 보시면 setAutoCommit(false) 메서드를 사용해서 false로 변경합니다.

image

  • 먼저 트랜잭션의 기본 설정인 Auto Commit 모드를 수동으로 변경합니다.

  • 그리고 트랜잭션 내 모든 작업이 정상적으로 진행되었을 때 commit()을 실행(실제 db에 작업 내용을 반영)합니다.

    image

  • 작업 진행 중 문제가 발생했을 때에는 rollback()을 실행(작업 내용을 취소하고 되돌린다)합니다.

    image

자바 예시

예시를 보겠습니다.

1
2
3
4
5
6
7
8
9
try{
    con.setAutoCommit(false); // 자동 커밋 x.
    ....
    ....
    commit();//정상 수행
}catch(Exception e){
    rollback();//문제 발생 시 롤백
 	throw e;//롤백 진행 후 메인에도 에러 상황을 전파
}finally{}

Subquery

이제 서브퀘리에 대해 배워보겠습니다. 이전 글에서 한 번 가볍게 다루고 넘어간 적이 있는데, 이번에 보다 자세히 살펴보도록 하겠습니다.

image
(사진: https://docs.microsoft.com/en-us/sql/relational-databases/performance/subqueries?view=sql-server-ver15)

서브쿼리란?

: 쿼리문(SELECT,INSERT,UPDATE,DELETE) 안 또는 다른 서브쿼리문 안에 또 다른 쿼리문을 사용하는 것을 서브쿼리라고 합니다.
전 글에서도 보셨다시피 보다 다양한 조건을 한 쿼리문으로 표현해 낼 수 있는 장점이 있습니다.
그리고 서브쿼리는 종종 JOIN과 비교되기도 하는데 성능 저하를 일으킨다는 점에서 가능하면 JOIN을 사용하는 것을 권장하는 글들을 볼 수 있습니다. 이에 관한 내용은 다음에 JOIN을 배운 뒤 다시 다뤄보도록 하겠습니다.

SQL예제

이제 SQL문을 어떻게 적용시키는지 살펴보겠습니다.

상품 정보 중 가장 비싼 가격의 상품명을 조회하는 subquery문을 만들어보겠습니다.
지금은 연습하는 단계이기 때문에 한 번에 서브쿼리문을 작성하지 않고 여러 단계로 나누어서 진행하도록 하겠습니다.

  1. 상품 최고가를 조회
1
SELECT max(price) FROM product;
  1. 최고가인 2200 price를 가진 상품명을 조회
1
SELECT name FROM product WHERE price=2200;
  1. 위의 1번, 2번 sql을 subquery를 이용해 한 번에 조회
1
SELECT name FROM product WHERE price=(SELECT max(price) FROM product);

참고) 앞에서 뒤로 순차적 실행이 아닌 조건부터 실행합니다. 그래서 subquery가 먼저 실행되고 최고가를 조회한 뒤에 상품명을 조회합니다.


다음 글에서는 본격적으로 자바에서 subquery 연습을 해보도록 하겠습니다.

Database 카테고리 내 다른 글 보러가기

댓글남기기