Home
>
Spring
>
π[Spring] `@Transactional`μ΄ read λ©μλμ λΆμ΄μμ§ μμ μ΄μ λ 무μμΌκΉμ?
Spring
Framework
π[Spring] @Transactional
μ΄ read λ©μλμ λΆμ΄μμ§ μμ μ΄μ λ 무μμΌκΉμ?
π Intro λ° μ½λ μκ°.
package kobe.board.article.service;
import kobe.board.article.entity.Article;
import kobe.board.article.repository.ArticleRepository;
import kobe.board.article.service.request.ArticleCreateRequest;
import kobe.board.article.service.request.ArticleUpdateRequest;
import kobe.board.article.service.response.ArticleResponse;
import kobe.board.common.exception.CustomException;
import kobe.board.common.responsecode.ResponseCode;
import kuke.board.common.snowflake.Snowflake;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@RequiredArgsConstructor
public class ArticleService {
private final Snowflake snowflake = new Snowflake();
private final ArticleRepository articleRepository;
@Transactional
public ArticleResponse create(ArticleCreateRequest request) {
ArticleResponse article = createArticle(request);
return article;
}
private ArticleResponse createArticle(ArticleCreateRequest request) {
// 1. κ²μκΈ μμ± λ° μ μ₯
articleRepository.save(
Article.create(snowflake.nextId(), request.getTitle(), request.getContent(), request.getBoardId(), request.getWriterId())
);
// 2. κ²μλ¬Ό μ¬/λΆ κ²μ¦.
Article article1 = articleRepository.findById(snowflake.nextId()).orElseThrow(() -> new CustomException(ResponseCode.NOT_FOUND_ARTICLE));
// 3. ArticleResponse 리ν΄
return ArticleResponse.from(article1, ResponseCode.SUCCESS_CREATE_ARTICLE);
}
@Transactional
public ArticleResponse update(Long articleId, ArticleUpdateRequest request) {
// 1. κ²μλ¬Ό μ¬/λΆ κ²μ¦.
Article article = articleRepository.findById(articleId).orElseThrow(() -> new CustomException(ResponseCode.NOT_FOUND_ARTICLE));
// 2. κ²μλ¬Ό μ
λ°μ΄νΈ.
article.update(request.getTitle(), request.getContent());
// 3. ArticleResponse 리ν΄.
return ArticleResponse.from(article, ResponseCode.SUCCESS_UPDATE_ARTICLE);
}
public ArticleResponse read(Long articleId) {
return ArticleResponse.from(articleRepository.findById(articleId).orElseThrow(), ResponseCode.SUCCESS_READ_ARTICLE);
}
@Transactional
public void delete(Long articleId) {
articleRepository.deleteById(articleId);
}
}
- βοΈ μ ν΄λμ€λ κ²μλ¬Ό μλΉμ€ ν΄λμ€μ.
- βοΈ κ²μλ¬Ό μμ±, μ
λ°μ΄νΈ, μμ κ΄λ ¨ λ©μλμλ
@Transactional
μ΄ λΆμ΄μλλ° read
λ©μλμλ λΆμ΄μμ§ μμ.
β
1οΈβ£ @Transactional
μ΄ read
λ©μλμ λΆμ΄μμ§ μμ μ΄μ .
β
1οΈβ£ @Transactional
κΈ°λ³Έ κ°λ
.
- βοΈ
@Transactional
: νΈλμμ
κ΄λ¦¬λ₯Ό μν΄ μ¬μ©λλ©°, μ£Όλ‘ λ°μ΄ν°λ² μ΄μ€μ μΌκ΄μ±μ μ μ§νκΈ° μν΄ μ¬μ©λ¨.
- βοΈ μ½κΈ° μ μ©(read-only) νΈλμμ
:
readOnly = true
λ‘ μ€μ νλ©΄ λ°μ΄ν° λ³κ²½ μμ΄ μ‘°νλ§ μννκ² λ¨.
β
2οΈβ£ read
λ©μλμ @Transactional
μ΄ νμνμ§ μμ μ΄μ
1οΈβ£ λ°μ΄ν° λ³κ²½ μμ.
- βοΈ read λ©μλλ λ¨μν λ°μ΄ν°λ₯Ό μ½κΈ°λ§ νκ³ λ³κ²½νμ§ μλλ€.
- βοΈ λ°μ΄ν°λ² μ΄μ€μ μ°κΈ° μμ
(INSERT, UPDATE, DELETE)μ΄ μκΈ° λλ¬Έμ νΈλμμ
μ΄ νμνμ§ μλ€.
2οΈβ£ μ±λ₯ μ΅μ ν
- βοΈ νΈλμμ
μ 리μμ€λ₯Ό μλͺ¨ν¨.
- βοΈ λΆνμν νΈλμμ
μ μ¬μ©νλ©΄ μ€λ²ν€λκ° λ°μν μ μμ.
- βοΈ read λ©μλλ νΈλμμ
μ μ¬μ©ν νμκ° μμ΄, λ κ°λ³κ³ λΉ λ₯΄κ² μλν¨.
3οΈβ£ κΈ°λ³Έμ μΌλ‘ JPAλ μ½κΈ° μμ
μμ νΈλμμ
μ΄ νμ μμ
- βοΈ JPAλ μ½κΈ° μμ
λ§ μνν κ²½μ° κΈ°λ³Έμ μΌλ‘ νΈλμμ
μ νμλ‘ νμ§ μμ.
- βοΈ
findById
λ μ½κΈ° μ μ© μμ
μ΄κΈ° λλ¬Έμ λ³λμ νΈλμμ
μ€μ μ΄ νμ μμ.
β
3οΈβ£ @Transactional(readOnly = true)
λ₯Ό μ¬μ©ν κ²½μ°.
- βοΈ
@Transactional(readOnly = true)
λ₯Ό μ¬μ©νλ©΄ μμμ± μ»¨ν
μ€νΈλ μ½κΈ° μ μ©μΌλ‘ μ€μ λλ€.
- βοΈ read λ©μλλ λͺ
μμ μΌλ‘
@Transactional(readOnly = true)
λ₯Ό μΆκ°ν κ²½μ°, λ€μκ³Ό κ°μ μ΄μ μ΄ μλ€.
- βοΈ μ±λ₯ μ΅μ ν : μ°κΈ° μ°μ°μ μ°¨λ¨νκ³ , μ½κΈ° μ μ©μΌλ‘ μ΅μ νλλ€.
- βοΈ μμ μ± : μλͺ»λ μ°κΈ° μ°μ°μ΄ λ°μνλ κ²μ λ°©μ§νλ€.
π― μμ: read λ©μλμ @Transactional(readOnly = true)
μ μ©
@Transactional(readOnly = true)
public ArticleResponse read(Long articleId) {
return Articleresponse.from(
articleRepository.findById(articleId)
.orElseThrow(
() -> new CustomException(ResponseCode.NOT_FOUND_ARTICLE)
),
ResponseCode.SUCCESS_READ_ARTICLE
);
}
β
4οΈβ£ μν©λ³ @Transactional
μ¬μ© μ¬λΆ.
λ©μλ μ ν |
@Transactional νμ μ¬λΆ |
μ΄μ |
Create |
νμν¨ |
λ°μ΄ν° λ³κ²½ λ°μ(INSERT) |
Update |
νμν¨ |
λ°μ΄ν° λ³κ²½ λ°μ(UPDATE) |
Delete |
νμν¨ |
λ°μ΄ν° λ³κ²½ λ°μ(DELETE) |
Read(μ‘°νλ§) |
λΆνμ |
λ°μ΄ν° λ³κ²½ μμ(SELECT) |
Read(볡μ‘ν μ‘°ν) |
@Transactional(readOnly = true) κΆμ₯ |
μ½κΈ° μ μ© μ΅μ ν λ° μμ μ± |
π κ²°λ‘ .
- βοΈ read λ©μλμλ κΈ°λ³Έμ μΌλ‘
@Transactional
μ΄ νμνμ§ μμ.
- βοΈ νμ§λ§ μ½κΈ° μ μ©μΌλ‘ μμ μ±μ λμ΄κ³ μ΅μ νλ₯Ό μνλ€λ©΄
@Transactional(readOnly = true)
λ₯Ό μ¬μ©ν΄λ λ¨.
π κΆμ₯ μ κ·Όλ².
- βοΈ λ¨μ μ‘°νλΌλ©΄
@Transactional
μ μλ΅ν΄λ 무방ν¨.
- βοΈ μ½κΈ° μ΅μ νλ μΆκ° μμ μ±μ΄ νμνλ€λ©΄
@Transactional(readOnly = true)
λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ.