diff --git a/src/main/java/com/ikdaman/domain/member/deserializer/BirthDateDeserializer.java b/src/main/java/com/ikdaman/domain/member/deserializer/BirthDateDeserializer.java new file mode 100644 index 0000000..6521a05 --- /dev/null +++ b/src/main/java/com/ikdaman/domain/member/deserializer/BirthDateDeserializer.java @@ -0,0 +1,25 @@ +package com.ikdaman.domain.member.deserializer; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import java.io.IOException; +import java.time.LocalDate; + +public class BirthDateDeserializer extends JsonDeserializer { + @Override + public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) + throws IOException { + String value = p.getValueAsString(); + if (value == null) { + // 실제 null인 경우 + return null; + } + if (value.trim().isEmpty()) { + // 빈 문자열인 경우 + return LocalDate.MIN; + } + return LocalDate.parse(value); + } +} diff --git a/src/main/java/com/ikdaman/domain/member/deserializer/GenderDeserializer.java b/src/main/java/com/ikdaman/domain/member/deserializer/GenderDeserializer.java new file mode 100644 index 0000000..526d6f3 --- /dev/null +++ b/src/main/java/com/ikdaman/domain/member/deserializer/GenderDeserializer.java @@ -0,0 +1,25 @@ +package com.ikdaman.domain.member.deserializer; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.ikdaman.domain.member.entity.Member; + +import java.io.IOException; + +public class GenderDeserializer extends JsonDeserializer { + @Override + public Member.Gender deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + String value = p.getValueAsString(); + + if (value == null) { + // 실제 null인 경우 + return null; + } + if (value.trim().isEmpty()) { + // 빈 문자열인 경우 + return Member.Gender.BLANK; + } + return Member.Gender.valueOf(value.toUpperCase()); + } +} \ No newline at end of file diff --git a/src/main/java/com/ikdaman/domain/member/entity/Member.java b/src/main/java/com/ikdaman/domain/member/entity/Member.java index 2b2b6c1..0329e21 100644 --- a/src/main/java/com/ikdaman/domain/member/entity/Member.java +++ b/src/main/java/com/ikdaman/domain/member/entity/Member.java @@ -59,7 +59,7 @@ public class Member extends BaseTime { // 성별 ENUM public enum Gender { - FEMALE, MALE + FEMALE, MALE, BLANK } // 소셜 로그인 제공자 ENUM diff --git a/src/main/java/com/ikdaman/domain/member/model/MemberReq.java b/src/main/java/com/ikdaman/domain/member/model/MemberReq.java index 103b514..ed5285f 100644 --- a/src/main/java/com/ikdaman/domain/member/model/MemberReq.java +++ b/src/main/java/com/ikdaman/domain/member/model/MemberReq.java @@ -1,5 +1,8 @@ package com.ikdaman.domain.member.model; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.ikdaman.domain.member.deserializer.BirthDateDeserializer; +import com.ikdaman.domain.member.deserializer.GenderDeserializer; import com.ikdaman.domain.member.entity.Member; import jakarta.validation.constraints.Pattern; import lombok.AccessLevel; @@ -7,7 +10,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; import org.springframework.format.annotation.DateTimeFormat; @@ -24,7 +26,9 @@ public class MemberReq { @Size(min=2, max=15, message = "닉네임은 최소 2자, 최대 15자만 가능합니다.") @Pattern(regexp = "^[a-zA-Z0-9가-힣\\s]+$", message = "닉네임은 한글, 영어, 숫자, 공백만을 포함합니다.") private String nickname; + @JsonDeserialize(using = GenderDeserializer.class) private Member.Gender gender; + @JsonDeserialize(using = BirthDateDeserializer.class) @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate birthdate; diff --git a/src/main/java/com/ikdaman/domain/member/service/MemberServiceImpl.java b/src/main/java/com/ikdaman/domain/member/service/MemberServiceImpl.java index 0e59adc..a0d3d38 100644 --- a/src/main/java/com/ikdaman/domain/member/service/MemberServiceImpl.java +++ b/src/main/java/com/ikdaman/domain/member/service/MemberServiceImpl.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; import java.util.Optional; import java.util.UUID; @@ -77,8 +78,12 @@ public MemberRes editMember(UUID memberId, MemberReq memberReq) { } member.updateNickname(Optional.ofNullable(memberReq.getNickname()).orElse(member.getNickname())); - member.updateBirthdate(Optional.ofNullable(memberReq.getBirthdate()).orElse(member.getBirthdate())); - member.updateGender(Optional.ofNullable(memberReq.getGender()).orElse(member.getGender())); + // birthdate 필드를 null인 채로 보냈다면 갱신하지 않음, 빈 문자열로 보낸다면 null 처리 (빈 문자열은 Deserializer에서 LocalDate.MIN 처리 됨) + LocalDate birthDate = Optional.ofNullable(memberReq.getBirthdate()).orElse(member.getBirthdate()); + member.updateBirthdate((birthDate != LocalDate.MIN) ? birthDate : null); + // gender 필드를 null인 채로 보냈다면 갱신 하지 않음, 빈 문자열로 보낸다면 null 처리 + Member.Gender gender = Optional.ofNullable(memberReq.getGender()).orElse(member.getGender()); + member.updateGender((gender != Member.Gender.BLANK) ? gender : null); memberRepository.save(member);