π§ λ¬Έμ λ°μ μν©
OAuth2 μμ λ‘κ·ΈμΈμ νλ©΄ μμΌ, μ±λ³, μ°λ½μ²μ λν μ 보λ κ°μ Έμ¬ μκ° μμ΄μ μΆκ° μ 보 κΈ°μ νΌμ λ§λ€μ΄μ λλΉμ μ μ₯λλλ‘ κ΅¬ννλ€.
κ·Έλμ μκ°νκ² μ΄λ λΈλ‘κ·Έμμ λ³Έκ±΄λ° Setterλ³΄λ€ @Builder ν¨ν΄μ μ¬μ©νλκ² μ’λ€ν΄μ μμ λ‘κ·ΈμΈ ν μΆκ° μ 보 μ λ ₯μ μ μ©ν΄λ³΄μλ€. κ·Έλμ μλμ κ°μ μ½λλ‘ μ€νμ νλλ
// entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Oauth2LoginDto {
private String phoneNumber; // μ°λ½μ²
private LocalDate birthdate; // μλ
μμΌ
private String gender; // μ±λ³
}
// service
/**
* Oauth2 λ‘κ·ΈμΈ μ μΆκ° μ 보 μ
λ ₯
*/
@Override
public Optional<User> updateOauth2(String username, Oauth2LoginDto oauth2LoginDto) {
User user = User.builder()
.phoneNumber(oauth2LoginDto.getPhoneNumber())
.gender(oauth2LoginDto.getGender())
.birthdate(oauth2LoginDto.getBirthdate())
.build();
userRepository.save(user);
return Optional.of(user);
}
μλμ κ°μ μ€λ₯κ° λ°μνλ€.
org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value : com.example.omg_project.domain.user.entity.User.nam
μ μ€λ₯μ λν΄μ κ²μνλ
DataIntegrityViolationException μμΈλ JPAκ° μν°ν°λ₯Ό μ μ₯νλ λμ€ User μν°ν°μ name νλκ° nullλ‘ μ€μ λμ΄ μλ κ²μ κ°μ§νκΈ° λλ¬Έμ λ°μν κ²μ΄λ€. name νλλ not-null μ μ½ μ‘°κ±΄μ΄ μ€μ λμ΄ μμ΄μ μ΄λ‘ μΈν΄ Hibernateκ° μν°ν°λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ₯ν μ μμλ€.
λΌκ³ νλ€.
DataIntegrityViolationException μμΈλ JPAκ° μν°ν°λ₯Ό μ μ₯νλ λμ€ User μν°ν°μ name νλκ° nullλ‘ μ€μ λμ΄ μλ κ²μ κ°μ§νκΈ° λλ¬Έμ λ°μν κ²μ΄λ€. name νλλ not-null μ μ½ μ‘°κ±΄μ΄ μ€μ λμ΄ μμ΄μ μ΄λ‘ μΈν΄ Hibernateκ° μν°ν°λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ₯ν μ μμλ€.
λΉλ ν¨ν΄μ μ¬μ©ν΄μ ꡬνν κ±°λ©΄ μλμ κ°μ΄ κΈ°μ‘΄ μ¬μ©μκ° notnullλ‘ κ°κ³ μλ νλλ€μ λν΄μ λ€ κ°μ 볡μ¬ν΄μ€μΌ νλ€λ κ²μ΄λ€.. κ·Έλμ μλ μΈν°λ³΄λ€ λΉλλ₯Ό μ¬μ©νλΌλ©΄μ μ μ λ κ² κ΅³μ΄ μ λμΌ νλ..? νλλ° μ΄μ¬ν ꡬκΈλ§μ ν΄μ λΉλμ μΈν°μ μ°¨μ΄μ λν΄μ νμ€ν μ΄ν΄κ° κ°λ€.
/**
* Oauth2 λ‘κ·ΈμΈ μ μΆκ° μ 보 μ
λ ₯
*/
@Override
public Optional<User> updateOauth2(String username, Oauth2LoginDto oauth2LoginDto) {
User user = User.builder()
.name(user.getName()) // κΈ°μ‘΄μ μλ κ° μΆκ°
.phoneNumber(oauth2LoginDto.getPhoneNumber())
.gender(oauth2LoginDto.getGender())
.birthdate(oauth2LoginDto.getBirthdate())
.build();
userRepository.save(user);
return Optional.of(user);
}
μ΄λ¬ν λ¬Έμ κ° λ°μλ μμΈμ λ΄κ° λΉλν¨ν΄μ μ ννκ² μ΄ν΄νμ§ λͺ»ν΄μ λ°μν λμ°Έμ¬μ΄λ€. λΉλλ κ°μ²΄λ₯Ό μμ νλ κ²μ΄ μλλΌ μμ±μμ²λΌ κ°μ²΄λ₯Ό μμ±νλ κΈ°λ₯μ μννλ€κ³ νλ€.
μ ννκ² μμμΌ ν κ°λ
- λΉλν¨ν΄μ κ°μ²΄μ μμ±μ λ΄λΉνλ ν¨ν΄μΌλ‘, μΌλ°μ μΌλ‘ λΉλλ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μλ‘ μμ±νλ€. λΉλλ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μμ±ν λ, μ΄μ κ°μ²΄μ κ°μ μμ νλ κ²μ΄ μλλΌ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νλ κ²μ΄λ€.
- μ΄κ²μ΄ λΉλ ν¨ν΄μ μ£Όμ νΉμ§ μ€ νλμ΄λ©°, μ΄λ₯Ό μ΄ν΄νλ κ²μ΄ μ€μνλ€.
- λΉλ ν¨ν΄μ κ°μ²΄ μμ± μμ μ¬λ¬ μμ±μ κ°μ§ κ°μ²΄λ₯Ό νΈλ¦¬νκ² μμ±νκΈ° μν΄ μ¬μ©λλ€. λ°λΌμ κ°μ²΄μ μμ±μ μΌλΆ λ³κ²½νκ±°λ ν΄λΉ μμ±μ μ§μ νμ¬ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν΄μΌνλ€κ³ νλ€.
- λ°λΌμ λ΄κ° dtoλ‘ λ°μμ¨ κ°μ User μν°ν°μ λΉλ ν¨ν΄μΌλ‘ μν°ν° κ°μ²΄λ‘ λ³ννλ €κ³ νλ νμ(?)λ μλͺ»λμλ€κ³ ν μ μλ€.
- νμ§λ§ λΉλ ν¨ν΄μ μ¬μ©ν΄μ κ°μ²΄μ λ°μ΄ν°λ₯Ό μμ νλ κ²μ΄ μμ λΆκ°λ₯ν κ²μ μλλΌκ³ νλ€.
κ·Έλ λ€λ©΄ λΉλ ν¨ν΄μΌλ‘ μ΄λ»κ² κ°μ μμ ν μ μλκ°?
// entity
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true) // κΈ°μ‘΄ μΈμ€ν΄μ€λ₯Ό κΈ°λ°μΌλ‘ μλ‘μ΄ κ°μ²΄λ₯Ό λΉλν μ μκ² ν¨
public class Oauth2LoginDto {
private String phoneNumber; // μ°λ½μ²
private LocalDate birthdate; // μλ
μμΌ
private String gender; // μ±λ³
}
μ΄μ²λΌ toBuilder μμ±μ true λ‘ μ€μ ν΄μ€ κ²½μ° toBuilder() λ©μλλ₯Ό μ¬μ©ν μ μκ²λλλ°
μ΄ λ©μλλ₯Ό μ¬μ©νλ©΄ μ΄λ―Έ μμ±λμ΄μλ κ°μ²΄μ κ°μ toBuilder() λ©μλλ₯Ό νμ©νμ¬ νΉμ νλμ κ°λ§μ λ³κ²½ν΄μ€ μ μλ€κ³ νλ€.
κ²°λ‘
toBuilder λ©μλλ₯Ό νμ©νλ©΄ κ°μ²΄μ κ°μ μΌλΆ μμ ν μλ μμ§λ§ λ΄κ° ꡬννλ €λ λ‘μ§μμλ μ¬μ©νκΈ°μ μ ν©νμ§ μμ κ² κ°λ€λ μκ°μ΄ λ€μλ€.
μ΄μ¨λ λΉλν¨ν΄μ΄λΌλ κ²μ΄ 맀κ°λ³μκ° λ§μ μμ±μμ μ μλ μμλλ‘ λ°μ΄ν°λ₯Ό λ£κΈ° μ΄λ €μ μ΄λ₯Ό νΈνκ² νκΈ° μν λμμΈν¨ν΄μΈ κ±΄λ° μ¦, κ°μ²΄λ₯Ό μμ±νλ κ²μ΄ μ£Όλ λͺ©μ μΈλ° λλ κ°μ²΄μ κ°μ μμ νλ λ‘μ§μ λ§λ€μ΄μΌ νλ―λ‘ κ°μ²΄μ κ°μ λΆλΆμ μΌλ‘ μμ νκΈ° μν΄μλ κ΅³μ΄ μν°ν° κ°μ²΄λ‘ λ°κΏ νμλ μμ κ² κ°κ³ , dtoμμ κ°μ κΊΌλ΄μ entityμ setter λ₯Ό μ¬μ©ν΄μ updateλ₯Ό ν΄μ£Όλ λ°©μμΌλ‘ ꡬννλ κ²μ΄ μ ν©ν κ² κ°λ€.
β μ 리
- μΈν° μ¬μ© λ°©λ²: κΈ°μ‘΄ μ¬μ©μ κ°μ²΄λ₯Ό μ λ°μ΄νΈνλ λ°©μμ΄λ―λ‘, μ½λκ° κ°κ²°νκ³ μ€λ₯ λ°μ κ°λ₯μ±μ΄ μ λ€. λν, νμμ μΌλ‘ μ€μ ν΄μΌ νλ νλλ₯Ό μ€μλ‘ λμΉ κ°λ₯μ±λ μ λ€.
- λΉλ μ¬μ© λ°©λ²: λ§μ½ κ°μ²΄μ λ€λ₯Έ νλλ₯Ό λ³κ²½νκ±°λ μλ‘μ΄ κ°μ²΄λ‘ κ΅μ²΄ν΄μΌ νλ μν©μ΄ μλλΌλ©΄, κ΅³μ΄ λΉλ ν¨ν΄μ μ¬μ©ν νμλ μλ€. μ΄ λ°©λ²μ νμ μ΄μμΌλ‘ 볡μ‘ν μ μμΌλ©°, μλͺ»λ νλ κ°μ 볡μ¬νκ±°λ λλ½ν μνμ΄ μλ€.
- μ¦, λΉλ ν¨ν΄μ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νκ±°λ κ°μ²΄μ λΆλ³μ±μ μ μ§ν΄μΌ ν λ λ μ μ©νλ€. νμ§λ§ μ¬κΈ°μλ κΈ°μ‘΄ κ°μ²΄μ OAuth2 μ μ μ μ±λ³, μμΌ, μ°λ½μ²μ μ λ§ μ λ°μ΄νΈνλ κ²μ΄λ―λ‘ μΈν°λ°©μμ μ¬μ©νλ κ²μ΄ λ μμ°μ€λ½κ³ μμ νλ€.
'Spring > Spring Boot' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Spring : N+1 λ¬Έμ ν΄κ²° 2νΈ - λ¬Έμ μμΈ λΆμκ³Ό ν΄κ²° λ°©λ² (0) | 2024.09.09 |
---|---|
Spring : N+1 λ¬Έμ ν΄κ²° 1νΈ - μ¦μ λ‘λ©(Eager Loading)κ³Ό μ§μ° λ‘λ©(Lazy Loading) (1) | 2024.09.09 |
Spring : @ModelAttribute & @RequestParam μ°¨μ΄ (0) | 2024.08.30 |
Spring : @Transactional μ΄λ? (μ¬μ©μ리) (0) | 2024.08.29 |
Spring : μλ¦Ό κΈ°λ₯ ꡬν (5) | 2024.08.28 |