From 6a0b7819882f7d2b6456c886d0f933b498724bad Mon Sep 17 00:00:00 2001 From: Gyeongho Yang Date: Thu, 19 Sep 2024 00:05:11 +0900 Subject: [PATCH] :recycle: divide transactions readonly and readwrite for methods --- .../net/pengcook/authentication/service/LoginService.java | 4 ++++ .../java/net/pengcook/category/service/CategoryService.java | 2 ++ .../java/net/pengcook/comment/service/CommentService.java | 3 ++- .../pengcook/ingredient/service/IngredientRecipeService.java | 2 ++ .../net/pengcook/ingredient/service/IngredientService.java | 4 ++-- .../ingredient/service/IngredientSubstitutionService.java | 2 ++ .../java/net/pengcook/like/service/RecipeLikeService.java | 3 ++- .../java/net/pengcook/recipe/service/RecipeStepService.java | 3 ++- .../src/main/java/net/pengcook/user/service/UserService.java | 5 ++++- 9 files changed, 22 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/net/pengcook/authentication/service/LoginService.java b/backend/src/main/java/net/pengcook/authentication/service/LoginService.java index 59e89d75..5abddebe 100644 --- a/backend/src/main/java/net/pengcook/authentication/service/LoginService.java +++ b/backend/src/main/java/net/pengcook/authentication/service/LoginService.java @@ -19,6 +19,7 @@ import net.pengcook.user.domain.User; import net.pengcook.user.repository.UserRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -29,6 +30,7 @@ public class LoginService { private final JwtTokenManager jwtTokenManager; private final S3ClientService s3ClientService; + @Transactional(readOnly = true) public GoogleLoginResponse loginWithGoogle(GoogleLoginRequest googleLoginRequest) { FirebaseToken decodedToken = decodeIdToken(googleLoginRequest.idToken()); String email = decodedToken.getEmail(); @@ -46,6 +48,7 @@ public GoogleLoginResponse loginWithGoogle(GoogleLoginRequest googleLoginRequest return new GoogleLoginResponse(true, accessToken, refreshToken); } + @Transactional public GoogleSignUpResponse signUpWithGoogle(GoogleSignUpRequest googleSignUpRequest) { User user = createUser(googleSignUpRequest); @@ -101,6 +104,7 @@ private FirebaseToken decodeIdToken(String idToken) { } } + @Transactional(readOnly = true) public void checkToken(long userId) { userRepository.findById(userId) .orElseThrow(() -> new NoSuchUserException("존재하지 않는 사용자입니다.")); diff --git a/backend/src/main/java/net/pengcook/category/service/CategoryService.java b/backend/src/main/java/net/pengcook/category/service/CategoryService.java index 729cfb2a..d5923d8b 100644 --- a/backend/src/main/java/net/pengcook/category/service/CategoryService.java +++ b/backend/src/main/java/net/pengcook/category/service/CategoryService.java @@ -8,6 +8,7 @@ import net.pengcook.category.repository.CategoryRepository; import net.pengcook.recipe.domain.Recipe; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -16,6 +17,7 @@ public class CategoryService { private final CategoryRepository categoryRepository; private final CategoryRecipeRepository categoryRecipeRepository; + @Transactional public void saveCategories(Recipe recipe, List categories) { categories.forEach(category -> saveCategoryRecipe(recipe, category)); } diff --git a/backend/src/main/java/net/pengcook/comment/service/CommentService.java b/backend/src/main/java/net/pengcook/comment/service/CommentService.java index d140873c..6863b644 100644 --- a/backend/src/main/java/net/pengcook/comment/service/CommentService.java +++ b/backend/src/main/java/net/pengcook/comment/service/CommentService.java @@ -1,6 +1,5 @@ package net.pengcook.comment.service; -import jakarta.transaction.Transactional; import java.time.LocalDateTime; import java.util.List; import lombok.RequiredArgsConstructor; @@ -16,6 +15,7 @@ import net.pengcook.user.domain.User; import net.pengcook.user.repository.UserRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -25,6 +25,7 @@ public class CommentService { private final RecipeRepository recipeRepository; private final UserRepository userRepository; + @Transactional(readOnly = true) public List readComments(Long recipeId, UserInfo userInfo) { List comments = commentRepository.findByRecipeId(recipeId); diff --git a/backend/src/main/java/net/pengcook/ingredient/service/IngredientRecipeService.java b/backend/src/main/java/net/pengcook/ingredient/service/IngredientRecipeService.java index 46e1b488..3732174b 100644 --- a/backend/src/main/java/net/pengcook/ingredient/service/IngredientRecipeService.java +++ b/backend/src/main/java/net/pengcook/ingredient/service/IngredientRecipeService.java @@ -8,6 +8,7 @@ import net.pengcook.ingredient.repository.IngredientRecipeRepository; import net.pengcook.recipe.domain.Recipe; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -21,6 +22,7 @@ public IngredientRecipe save(Ingredient ingredient, Recipe recipe, Requirement r return ingredientRecipeRepository.save(ingredientRecipe); } + @Transactional public void deleteIngredientRecipe(long recipeId) { List ingredientRecipes = ingredientRecipeRepository.findAllByRecipeId(recipeId); for (IngredientRecipe ingredientRecipe : ingredientRecipes) { diff --git a/backend/src/main/java/net/pengcook/ingredient/service/IngredientService.java b/backend/src/main/java/net/pengcook/ingredient/service/IngredientService.java index 53e0a66c..63918ed1 100644 --- a/backend/src/main/java/net/pengcook/ingredient/service/IngredientService.java +++ b/backend/src/main/java/net/pengcook/ingredient/service/IngredientService.java @@ -1,7 +1,6 @@ package net.pengcook.ingredient.service; -import jakarta.transaction.Transactional; import java.util.HashSet; import java.util.List; import lombok.Getter; @@ -14,9 +13,9 @@ import net.pengcook.ingredient.repository.IngredientRepository; import net.pengcook.recipe.domain.Recipe; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service -@Transactional @RequiredArgsConstructor @Getter public class IngredientService { @@ -25,6 +24,7 @@ public class IngredientService { private final IngredientRecipeService ingredientRecipeService; private final IngredientSubstitutionService ingredientSubstitutionService; + @Transactional public void register(List requests, Recipe recipe) { validateDuplicateNames(getIngredientNames(requests)); for (IngredientCreateRequest request : requests) { diff --git a/backend/src/main/java/net/pengcook/ingredient/service/IngredientSubstitutionService.java b/backend/src/main/java/net/pengcook/ingredient/service/IngredientSubstitutionService.java index 4217fe77..76d39077 100644 --- a/backend/src/main/java/net/pengcook/ingredient/service/IngredientSubstitutionService.java +++ b/backend/src/main/java/net/pengcook/ingredient/service/IngredientSubstitutionService.java @@ -8,6 +8,7 @@ import net.pengcook.ingredient.domain.Requirement; import net.pengcook.ingredient.repository.IngredientSubstitutionRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -20,6 +21,7 @@ public void save(IngredientRecipe ingredientRecipe, Ingredient substitution) { ingredientSubstitutionRepository.save(ingredientSubstitution); } + @Transactional public void delete(IngredientRecipe ingredientRecipe) { if (ingredientRecipe.getRequirement() == Requirement.ALTERNATIVE) { List substitutions = diff --git a/backend/src/main/java/net/pengcook/like/service/RecipeLikeService.java b/backend/src/main/java/net/pengcook/like/service/RecipeLikeService.java index 54875022..e98ef3b2 100644 --- a/backend/src/main/java/net/pengcook/like/service/RecipeLikeService.java +++ b/backend/src/main/java/net/pengcook/like/service/RecipeLikeService.java @@ -1,6 +1,5 @@ package net.pengcook.like.service; -import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import net.pengcook.authentication.domain.UserInfo; import net.pengcook.like.domain.RecipeLike; @@ -13,6 +12,7 @@ import net.pengcook.user.domain.User; import net.pengcook.user.repository.UserRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -22,6 +22,7 @@ public class RecipeLikeService { private final UserRepository userRepository; private final RecipeRepository recipeRepository; + @Transactional(readOnly = true) public RecipeLikeResponse readLike(UserInfo userInfo, long recipeId) { boolean isLike = likeRepository.existsByUserIdAndRecipeId(userInfo.getId(), recipeId); diff --git a/backend/src/main/java/net/pengcook/recipe/service/RecipeStepService.java b/backend/src/main/java/net/pengcook/recipe/service/RecipeStepService.java index 80d85f36..a42ea5f8 100644 --- a/backend/src/main/java/net/pengcook/recipe/service/RecipeStepService.java +++ b/backend/src/main/java/net/pengcook/recipe/service/RecipeStepService.java @@ -18,7 +18,6 @@ import org.springframework.transaction.annotation.Transactional; @Service -@Transactional @RequiredArgsConstructor public class RecipeStepService { @@ -26,11 +25,13 @@ public class RecipeStepService { private final RecipeRepository recipeRepository; private final S3ClientService s3ClientService; + @Transactional(readOnly = true) public List readRecipeSteps(long recipeId) { List recipeSteps = recipeStepRepository.findAllByRecipeIdOrderBySequence(recipeId); return convertToRecipeStepResponses(recipeSteps); } + @Transactional public void saveRecipeSteps(Long savedRecipeId, List recipeStepRequests) { Recipe savedRecipe = recipeRepository.findById(savedRecipeId) .orElseThrow(() -> new NotFoundException("해당되는 레시피가 없습니다.")); diff --git a/backend/src/main/java/net/pengcook/user/service/UserService.java b/backend/src/main/java/net/pengcook/user/service/UserService.java index 9c70d645..5d7f2137 100644 --- a/backend/src/main/java/net/pengcook/user/service/UserService.java +++ b/backend/src/main/java/net/pengcook/user/service/UserService.java @@ -1,6 +1,5 @@ package net.pengcook.user.service; -import jakarta.transaction.Transactional; import java.util.List; import java.util.stream.Collectors; import lombok.AllArgsConstructor; @@ -28,6 +27,7 @@ import net.pengcook.user.repository.UserReportRepository; import net.pengcook.user.repository.UserRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @AllArgsConstructor @@ -43,6 +43,7 @@ public class UserService { private final UserReportRepository userReportRepository; private final S3ClientService s3ClientService; + @Transactional(readOnly = true) public ProfileResponse getUserById(long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> new UserNotFoundException("사용자를 찾을 수 없습니다.")); @@ -50,6 +51,7 @@ public ProfileResponse getUserById(long userId) { return new ProfileResponse(user, recipeCount); } + @Transactional(readOnly = true) public UsernameCheckResponse checkUsername(String username) { boolean userExists = userRepository.existsByUsername(username); return new UsernameCheckResponse(!userExists); @@ -104,6 +106,7 @@ public ReportResponse report(long reporterId, ReportRequest reportRequest) { return new ReportResponse(savedUserReport); } + @Transactional(readOnly = true) public BlockedUserGroup getBlockedUserGroup(long blockerId) { return userBlockRepository.findAllByBlockerId(blockerId).stream()