TIL-211104

박건희·2021년 11월 4일
0

1. Patch update 오류와 해결

  • 오류 : Map<String, Object>로 요청을 받아 Java의 reflection을 이용하여 동적으로 필드에 접근하여 Object를 대입하는 방식은 primitive와 String type에는 적용이 되었으나 User-Defined Class Type은 mapping되지 않았다

  • 시도

    • 시도 1 : Embeddable Class들을 Interface를 구현하게 하여 해당 Interface의 instance인지 판단
      -> 동적으로 해당 필드명에 해당하는 객체를 생성해야 하는데 실패했고, 낭비이기도 함
    • 시도 2,3,...,n-1 : ObjectMapper와 JSONObject를 사용하여 시도
      -> Embeddable type인 경우는 key는 RequestParm으로 받고, value는 Embeddable Class의 필드로만 구성된 1차원(?) Json으로 받으면 objectMapper로 변환됨
      문제 : primitive는 이렇게 하지 못함
    • 기타 : reflection field로부터 객체 생성, java.lang.Class의 isPrimitive(), isAnnotationPresent(), isMemberClass()등의 다양한 시도
  • 해결 : java.lang.Class의 isAnnotationPresent()로 성공

    • isAnnotationPresent(Embeddable.class) 는 실패
    • isAnnotationPresent(Embedded.class) 성공!
  • 한계 : 값 검증을 하지 못함

    • Request를 Dto로 받으면 Dto 필드에 선언한 annotaion으로 validation 할 수 있지만, 내가 구현한 방식으로는 단순히 Json을 대입해주는 한계가 있음
  • '오류'를 파악한 뒤 약 5시간은 쓴 것 같다. 사용한 메소드 모두 처음 사용하는 것이고, 처음 이런 것을 구현해봐서 많은 시간이 필요했다. Java 공부를 좀 더 해보고 싶다.

2. 테스트를 꼼곰히 하자

  • 어렵다고 생각한 것이 실행되면 완벽히 구현된 것으로 착각하기 쉽다
  • 분명히 완벽히 구현한게 아닐 확률이 높으니 테스트를 꼼꼼히 하자

3. Json (de)serialization

  • Json mapping시
    • Jackson의 objectMapping
    • org.json(maven에서 설치)의 JSONObject

4. java.time.LocalDate <-> String 변환 에러

  • objectMapper.read~ 로 하는데 변환이 안된다
  • 원인은 아직 모르겠다

0개의 댓글