99import com .taba .user .dto .UserMapper ;
1010import com .taba .user .entity .User ;
1111import com .taba .user .repository .UserRepository ;
12+ import jakarta .persistence .EntityManager ;
13+ import jakarta .persistence .PersistenceContext ;
1214import lombok .RequiredArgsConstructor ;
1315import lombok .extern .slf4j .Slf4j ;
1416import org .springframework .stereotype .Service ;
@@ -25,6 +27,9 @@ public class UserService {
2527 private final FriendshipRepository friendshipRepository ;
2628 private final LetterRepository letterRepository ;
2729 private final FileService fileService ;
30+
31+ @ PersistenceContext
32+ private EntityManager entityManager ;
2833
2934 @ Transactional (readOnly = true )
3035 public UserDto getProfile (String userId ) {
@@ -48,12 +53,21 @@ public UserDto getProfile(String userId) {
4853 /**
4954 * User 엔티티를 최신 데이터로 새로고침하여 반환합니다.
5055 * 닉네임이나 프로필 변경사항이 즉시 반영됩니다.
56+ *
57+ * JPA 1차 캐시에서 엔티티를 detach하고 DB에서 새로 로드하여
58+ * 항상 최신 데이터를 반환합니다.
5159 */
5260 @ Transactional (readOnly = true )
5361 public User refreshUser (User user ) {
5462 if (user == null || user .getId () == null ) {
5563 return user ;
5664 }
65+
66+ // 1차 캐시에서 기존 엔티티 제거 (캐시된 오래된 데이터 방지)
67+ if (entityManager .contains (user )) {
68+ entityManager .detach (user );
69+ }
70+
5771 return userRepository .findActiveUserById (user .getId ())
5872 .orElse (user );
5973 }
0 commit comments