veluxer62 / veluxer62.github.io

veluxer's blog
http://veluxer62.github.io
MIT License
1 stars 0 forks source link

8월 개발 이슈 #726

Open veluxer62 opened 1 month ago

veluxer62 commented 1 month ago
veluxer62 commented 3 weeks ago

JPA 이슈

Supplier 에 전화번호 목록을 저장하고 있음 오늘 이야기 나온것 중에 전화번호 검증을 추가하고 싶다는 이야기가 있었음 그래서 phoneNumbers를 아래와 같이 타입을 변경하였음

As-Is

@Type(JsonBinaryType::class)
@Column
var phoneNumbers: List<String>? = phoneNumbers
    protected set

To-Be

@Type(JsonBinaryType::class)
@Column
var phoneNumbers: List<PhoneNumber>? = phoneNumbers
    protected set

문제는 이렇게 하는 경우 데이터베이스에 아래와 같이 저장이 되어버림. 이러면 DB로 전화번호값을 보는데 불편함

[{"extension":"","numberOfLeadingZeros":1,"preferredDomesticCarrierCode":"","countryCode":82,"rawInput":"","nationalNumber":1011111111,"italianLeadingZero":false,"countryCodeSource":"UNSPECIFIED"},{"extension":"","numberOfLeadingZeros":1,"preferredDomesticCarrierCode":"","countryCode":82,"rawInput":"","nationalNumber":1011112222,"italianLeadingZero":false,"countryCodeSource":"UNSPECIFIED"}]

아쉽게도 JPA에서는 @Type(JasonBinaryType::class)에는 AttributeConverter랑 중복으로 적용될 수 없다고 함

그렇다면 2가지 선택을 할 수 있음

  1. List 타입으로 하고 DB에 ["[+821011112222](tel:+821011112222)"] 와 같이 저장함
  2. List 타입으로 하고 DB에 [{"extension":"","numberOfLeadingZeros":1,"preferredDomesticCarrierCode":"","countryCode":82,"rawInput":"","nationalNumber":1011111111,"italianLeadingZero":false,"countryCodeSource":"UNSPECIFIED"}] 와 같이 저장함

결국 아래와 같이 해결함

class Supplier {
    @Type(JsonBinaryType::class)
    @Column(name = "phone_numbers")
    protected var stringPhoneNumbers: List<String>? = phoneNumbers?.map { it.toE164String() }
    val phoneNumbers: List<PhoneNumber>? get() = stringPhoneNumbers?.map { it.toPhoneNumber() }
}
veluxer62 commented 3 weeks ago

현재 실시간으로 데이터를 받기위해 Graphql Subscription 구현 고민중인데 누군가 SSE를 구현한 블로그가 있어서 참고하면 좋을거 같다.

https://tussle.tistory.com/1118