Skip to content

Commit a1da790

Browse files
committed
feat/ #33 코드 리뷰 반영
1 parent 66ef59e commit a1da790

2 files changed

Lines changed: 15 additions & 3 deletions

File tree

src/main/java/com/closetnangam/be/domain/user/repository/UserRepository.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.closetnangam.be.domain.user.repository;
22

33
import com.closetnangam.be.domain.user.entity.User;
4+
import jakarta.persistence.LockModeType;
45
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.data.jpa.repository.Lock;
7+
import org.springframework.data.jpa.repository.Query;
8+
import org.springframework.data.repository.query.Param;
59

610
import java.util.Optional;
711

@@ -10,4 +14,8 @@ public interface UserRepository extends JpaRepository<User, Long> {
1014
Optional<User> findByEmail(String email);
1115

1216
boolean existsByNickname(String nickname);
17+
18+
@Lock(LockModeType.PESSIMISTIC_WRITE)
19+
@Query("SELECT u FROM User u WHERE u.id = :userId")
20+
Optional<User> findByIdForUpdate(@Param("userId") Long userId);
1321
}

src/main/java/com/closetnangam/be/domain/wardrobe/service/WardrobeService.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,13 @@ public WardrobeResponse createWardrobe(Long userId) {
3333

3434
@Transactional
3535
public Wardrobe getOrCreateWardrobe(Long userId) {
36-
// FOR UPDATE: 동일 userId로 동시 요청이 들어올 때 중복 INSERT → DataIntegrityViolationException 방지
37-
return wardrobeRepository.findByUser_IdForUpdate(userId)
38-
.orElseGet(() -> createWardrobeEntity(userId));
36+
// User row에 FOR UPDATE lock: User는 항상 존재하므로 신규 사용자에게도 lock이 보장됨.
37+
// 같은 userId로 동시 요청이 들어올 때 두 트랜잭션이 직렬화되어
38+
// 중복 INSERT → DataIntegrityViolationException을 방지함.
39+
User user = userRepository.findByIdForUpdate(userId)
40+
.orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다."));
41+
return wardrobeRepository.findByUser_Id(userId)
42+
.orElseGet(() -> wardrobeRepository.save(Wardrobe.create(user)));
3943
}
4044

4145
private Wardrobe createWardrobeEntity(Long userId) {

0 commit comments

Comments
 (0)