# 레이어별 트랜잭션 의미와 읽기 전용 트랜잭션

1. Service 에 트랜잭션을 걸고 사용하는 것이 보편적인데 Repository 에 트랜잭션을 거는 것은 어떤 의미인가?
2. Read Only Transaction 은 어떤 의미가 있는 것일까?

## 레이어별 트랜잭션의 의미

예전에 선배 개발자께 컨트롤러에 트랜잭션을 걸면 안되나요? 라는 질문을 했다가 당연히 서비스에 걸어야지 라는 답을 들었었다. 왜 서비스에 걸어야 하는지 궁금해졌다. 트랜잭션은 어디에 걸어야 하나? 서비스에 건다는 의미는 무엇인가?

사실 기능적인 측면과 성능적인 측면으로 나눠서 설명할 수 있다.

#### 기능적인 측면 :  JPA 의 데이터 변경은 트랜잭션이 필요하다.

**모든 JPA의 데이터 변경은 트랜잭션 안에서 일어나야 한다.**\
따라서, [JPA 기본 구현체는 Repository 컨테이너에 Transactional 이 선언](/second-brain/second-brain/spring/jpa-orm/spring-data-jpa.md#simplejparepository-less-than-t-id-greater-than)되어 있다.

JPA 에서는 트랜잭션이 끝났다는 것은 영속성 컨텍스트가 종료된다는 의미가 된다.

#### 성능적인 측면 : 트랜잭션의 범위는 성능에서 중요한 의미를 갖는다.

레이어별 트랜잭션의 의미는 단순하다. **트랜잭션의 범위를 어디까지 할 것인가?**

트랜잭션은 데이터베이스의 변경 사항을 하나의 오퍼레이션으로 취급하겠다는 것이고, \
보통 하나의 오퍼레이션은 Repository 레이어에 정의되고, 비즈니스 로직에 의한 변경들은 Service 레이어에 정의된다.

Service 레이어에 트랜잭션을 건다는 의미는 좀더 상세히 말하자면, DB 변경이 필요한 오퍼레이션 단위로 트랜잭션을 건다는 의미가 된다. 어떤 레이어에 거느냐가 중요한 것이 아니라 **트랜잭션의 범위를 가능한 작게 하는 것**이 가장 중요한 포인트이다!

개발 편의성을 위한 OSIV 같은 옵션은 View 까지 세션 (트랜잭션) 을 유지한다는 것으로 대규모 트래픽 상황에서는 DB 커넥션을 빠르게 고갈 시키는 장애를 유발 시킬 수 있다.

{% hint style="info" %}
즉, 트랜잭션을 사용한다는 의미는 여러 오퍼레이션을 하나의 오퍼레이션으로 취급하겠다는 의미이고, 서비스 (비즈니스 로직) 레이어는 여러 오퍼레이션을 가지고 있다.&#x20;

트랜잭션이 필요하다면 가능한 한 작은 범위에서 걸어야 하며, 대부분 사용하려는 목적에 부합하는 곳은 서비스 레이어일 것이다. 그러나, 이것은 서비스에서는 무조건 트랜잭션을 걸어야 한다는 의미는 아니다.

트랜잭션을 어느 레이어에 걸어야 하느냐는 사실 잘못된 질문이다.\
**트랜잭션은 어느 레이어에 걸던지, 가능한 작게 유지할 수 있는 곳에 걸어야 한다.**
{% endhint %}

## 읽기 전용 트랜잭션의 의미


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://programmer-jjy.gitbook.io/second-brain/technical/technical-curiosity/undefined-1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
