Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@
import life.mosu.mosuserver.domain.user.entity.UserJpaEntity;
import life.mosu.mosuserver.domain.user.entity.UserRole;
import life.mosu.mosuserver.domain.user.repository.UserJpaRepository;
import life.mosu.mosuserver.global.exception.CustomRuntimeException;
import life.mosu.mosuserver.global.exception.ErrorCode;
import life.mosu.mosuserver.global.processor.StepProcessor;
import life.mosu.mosuserver.global.util.PhoneNumberUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -19,28 +22,32 @@ public class OAuthUserPersistenceProcessor implements StepProcessor<OAuthUserInf
@Override
@Transactional
public UserJpaEntity process(final OAuthUserInfo info) {
return userRepository.findByPhoneNumber(info.phoneNumber())
.map(existingUser -> {
existingUser.updateOAuthUser(
info.gender(),
info.name(),
PhoneNumberUtil.formatPhoneNumber(info.phoneNumber()),
info.birthDay(),
info.marketingAgreed());
return existingUser;
})
.orElseGet(() -> {
final UserJpaEntity newUser = UserJpaEntity.builder()
.loginId(info.email())
.gender(info.gender())
.name(info.name())
.birth(info.birthDay())
.phoneNumber(PhoneNumberUtil.formatPhoneNumber(info.phoneNumber()))
.userRole(UserRole.ROLE_PENDING)
.provider(AuthProvider.KAKAO)
.agreedToMarketing(info.marketingAgreed())
.build();
return userRepository.save(newUser);
});
try {
return userRepository.findByPhoneNumber(info.phoneNumber())

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

전화번호로 기존 사용자를 찾는 로직에 버그가 있을 수 있습니다. UserJpaEntity에는 PhoneNumberUtil.formatPhoneNumber()를 통해 'U' 접두사가 붙은 전화번호가 저장됩니다. 하지만 현재 코드는 접두사 없는 원본 전화번호로 조회하고 있어, 항상 기존 사용자를 찾지 못하고 신규 사용자 생성을 시도하게 됩니다. 이로 인해 의도치 않게 DataIntegrityViolationException이 발생하고 예외 처리 로직에 의존하게 될 수 있습니다.

findByPhoneNumber 호출 전에 전화번호를 포맷팅하여 이 문제를 해결하는 것이 좋습니다.

Suggested change
return userRepository.findByPhoneNumber(info.phoneNumber())
return userRepository.findByPhoneNumber(PhoneNumberUtil.formatPhoneNumber(info.phoneNumber()))

.map(existingUser -> {
existingUser.updateOAuthUser(
info.gender(),
info.name(),
PhoneNumberUtil.formatPhoneNumber(info.phoneNumber()),
info.birthDay(),
info.marketingAgreed());
return existingUser;
})
.orElseGet(() -> {
final UserJpaEntity newUser = UserJpaEntity.builder()
.loginId(info.email())
.gender(info.gender())
.name(info.name())
.birth(info.birthDay())
.phoneNumber(PhoneNumberUtil.formatPhoneNumber(info.phoneNumber()))
.userRole(UserRole.ROLE_PENDING)
.provider(AuthProvider.KAKAO)
.agreedToMarketing(info.marketingAgreed())
.build();
return userRepository.save(newUser);
});
} catch (DataIntegrityViolationException ex) {
throw new CustomRuntimeException(ErrorCode.USER_ALREADY_EXISTS);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
Expand Down Expand Up @@ -41,7 +43,7 @@ public class VirtualAccountLogJpaEntity {
@Column(name = "customer_email")
private String customerEmail;

@Column(name = "deposit_status")
@Enumerated(EnumType.STRING)
private DepositStatus depositStatus = DepositStatus.WAITING;

@Builder(access = AccessLevel.PRIVATE)
Expand Down
5 changes: 5 additions & 0 deletions src/main/resources/db/migration/V3__alter_deposit_status.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
ALTER TABLE virtual_account_log
DROP COLUMN deposit_status;

ALTER TABLE virtual_account_log
ADD deposit_status VARCHAR(255) NULL;
Comment on lines +1 to +5

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

현재 마이그레이션 스크립트는 deposit_status 컬럼을 삭제 후 재생성하므로, 기존의 모든 데이터가 손실될 위험이 있습니다. 또한, 컬럼이 NULL을 허용하도록 재생성되어 기존 행들의 해당 컬럼 값은 NULL이 됩니다. VirtualAccountLogJpaEntity에서는 이 필드가 DepositStatus.WAITING으로 초기화되므로, NULL 값은 NullPointerException 등 예기치 않은 동작을 유발할 수 있습니다.

데이터 손실을 방지하고 데이터 무결성을 지키기 위해, ALTER COLUMN을 사용해 컬럼 타입을 변경하거나, 데이터를 임시 컬럼으로 백업 후 복원하는 방식으로 마이그레이션 스크립트를 수정하는 것을 강력히 권장합니다.

Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ public static UserJpaEntity mosu_user() {
.phoneNumber(USER_PHONE_NUMBER)
.birth(LocalDate.of(2005, 12, 1))
.userRole(UserRole.ROLE_USER)
.agreedToTermsOfService(true)
.agreedToPrivacyPolicy(true)
.agreedToMarketing(true)
.provider(AuthProvider.MOSU)
.build();
Expand All @@ -39,8 +37,6 @@ public static UserJpaEntity kakao_user() {
.phoneNumber(USER_PHONE_NUMBER)
.birth(LocalDate.of(2005, 12, 1))
.userRole(UserRole.ROLE_USER)
.agreedToTermsOfService(true)
.agreedToPrivacyPolicy(true)
.agreedToMarketing(true)
.provider(AuthProvider.KAKAO)
.build();
Expand Down