MyBatis

9.27 [ mybatis ] + 트랜잭션

J휘 2024. 9. 27. 18:47

[용어 정리]

파라미터 (parameter)

Servlet에서 parameter는 브라우저로부터의 요청과 함께 전달된 데이터를 의미함


 

트랜잭션 (Transaction)

"DB의 상태를 변화시키기 위해 수행하는 작업단위"가 정의인데 이 설명으로는 오히려 더 헷갈려서 더 자세하게 정리를 해봤다.

 

트랜잭션은 하나의 행동(작업)이 아니라, 하나의 논리적인 작업을 처리하기 위해 묶여 있는 여러 작업들의 집합을 의미한다. 즉, 트랜잭션은 여러 작업(행동)을 묶은 하나의 작업 단위라고 이해하는게 맞다

트랜잭션의 특징

  • 작업 단위: 여러 작업을 하나로 묶어서 처리하고, 모든 작업이 성공해야 트랜잭션이 완료된다 ( = Commit )
  • 성공 or 실패: 트랜잭션 내의 모든 작업이 완료되어야만 데이터베이스에 반영되고, 중간에 실패하면 전체 작업이 취소된다.( = rollback )

요약:

  • 트랜잭션은 하나의 행동을 의미하는 것이 아니라, 하나의 논리적 작업을 위해 여러 행동(작업)을 묶어놓은 작업 단위
  • 트랜잭션 내의 작업들은 모두 성공해야만 데이터베이스에 적용된다(성공하면 COMMIT), 아니면 취소(실패 시 ROLLBACK)

총정리

#헷갈렸던 부분이 하나의 행동인지, 여러개의 행동(작업)을 말하는 건지 헷갈렸는데, 둘 다 해당돼서 더 정리가 안 되고 헷갈렸던 거 같다 (1개의 작업이 트랜잭션이 될 수도 있고 여러 개의 작업이 하나의 트랜잭션이 될 수도 있는거다)


DML ( Data Manipulation Language ) = 데이터 조작어

  • SELECT
  • INSERT
  • UPDATE
  • DELETE 

위 4가지 DB 조작어들을 말한다

 

클래스패스 ( classpath )

class를 찾기 위한 경로

/mybatis-config.xml과 같은 경로

 

참조

데이터의 주소를 보내주는 것

 

# 간단한 개념들을 두루뭉실하게 알고 있으니까 개념이 더해졌을 때 이해하기가 힘들어졌고

# 그 개념들을 설명하라고 했을 때 생각보다 말로 설명을 못해서 간단한 개념들도 정


[mybatis]

SqlSession 클래스

: MyBatis에서 DB와 상호작용하기 위한 핵심 인터페이스

 

주요 기능

  • SQL쿼리 실행 : DB의 데이터를 조회하거나 삽입, 수정, 삭제
  • 트랜잭션 관리: commit과 rollback을 할 수 있게해줌
  • 연결관리:  SqlSession은 내부적으로 JDBC연결을 사용해서 DB와 상호작용을 함 (연결은 Mybatis가 자동으로 관리)

SqlSession 사용 흐름

1. SqlSessionFactory로 SqlSession생성

- SqlSessionFactory는 Mybatis설정파일(=mybatis-config.xml)을 기반으로 SqlSession을 생성하는 팩토리임

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// SqlSession팩토리빌더의 bulid()로 SqlFactory를 만든다

SqlSession sqlSession = sqlSessionFactory.openSession();
//만든 sqlSession팩토리로 sqlSession응애를 낳는다

 

2. SQL 쿼리 실행

- SqlSession으로 SQL쿼리를 실행하고 조회(select) / 추가(insert) / 삭제(delect) 한다

List<User> users = sqlSession.selectList("UserMapper.selectAllUsers");
// 위 코드에서는 여러개의 목록을 조회하기 때문에 List<>에 담아준 모습

 

3. 트랜잭션 처리

- 데이터베이스를 변경작업 후에는 반드시 트랜잭션을 커밋하거나 롤백해야 함

sqlSession.insert("UserMapper.insertUser", user); // 수정(추가)
sqlSession.commit();  // 트랜잭션 커밋

# 보통 if문으로 commit과 rollback을 나눈다

 

4. 자원해제

-모든 작업이 완료된 후에는 SqlSession을 닫아야 함

sqlSession.close(); //문 닫아요

# 닫지 않으면 메모리를 잡아먹는다고 한다

 

SqlSession 특징

mapper와 연동

mybatis에서는 mapper.xml파일이나 어노테이션(@)을 통해 SQL쿼리를 정의하고 

이걸 sqlSession에서 호출해서 실행한다.

mapper의 name과 쿼리 ID를 사용해서 SQL을 호출하기 때문에 처음에 설정이 필요하다.


Resources.getResourceAsStream();

> MyBatis에서 자주 사용되는 메서드로, 클래스패스에서 resource파일(설정파일, XML파일 등)을 읽어 들여준다

> resource파일을 스트림(InputStream)형태로 반환해줌

 

Q. 왜 스트림 형태로 반환을 하지?

InputStream은 파일을 스트림방식으로 읽어들이는 방식이기 때문에, 파일의 내용을 한번에 메모리에 올리는 게 아니라서

필요할 때 필요한 부분만 조금씩 읽어들일 수 있음 << 이 방식은 파일이 큰 경우 메모리를 효율적으로 쓸 수 있게 해준다

 

Q. " 스트림방식으로 읽어들이는 방식"이 뭐지?

= 데이터를 한 번에 모두 읽지 않고, 필요할 때 조금씩 연속적으로 읽는 방식

파일을 읽는 방식에는 2가지가 있음

  • 일괄 처리 방식
  • 스트림 처리 방식

결론

클래스패스에 있는 파일의 크기가 커서 일괄처리하면 메모리 효율이 떨어지기 때문에

기능을 만든 사람이 알잘딱 한 것 같다