TIL 2021.04.22 [구현/문제해결] [Spring Data JDBC]

Kyu·2021년 4월 22일
0

TIL

목록 보기
102/322

Null처리

DTO 몇몇 필드에 null이 들어왔을때 어떻게 할까?
예를 들어서 정상적으로 모든 값이 들어가면 Response는 다음과 같다

{
  "name": "Kyu",
  "age": 20,
  "region": "Korea",
  "favorite_food": [
    "Water",
    "Coffee"
    ]
}

근데 애초에 몇몇 정보가 빠진 데이터를 Response하면 아래처럼 나온다.

{
  "name": "Kyu",
  "age": 20,
  "region": null,
  "favorite_food": null
}

더군다나 저렇게 나오기라도 하면 다행인데, 디비에 String으로 "favorite_food 로 저장되어있기 때문에 배열로 바꿔주는 로직을 추가했는데 파라미터에 null이 들어오기 때문에 문제가 된다,

파라미터에 null이 들어오는건 상관이없는데 favorite_food 가 "Water,Coffee"로 들어가있기때문에 배열로받아서 split() 같은걸로 분리하는데 null이니까 분리할수없다고 떠서 에러가난다.

이 부분은 그냥 null처리해주면 되긴한데 내가아는 방법이 걍 null을 직접 처리하는 건데, 아마 리뷰어가 뭐라고 말씀하실것같지만 어쨋든 return (favorite_food = null) ? null : arrayConverted 이런식으로 해버렸다.

그러면 일단 null이면 null이 Response 되게 끔 할 수 있다.

근데 요구사항에도 그렇고, null이면 아예 그 데이터를 빼고 보내는게 좋은 방법이라고 생각한다.

다행히도 구글에 검색하니까 바로 최상단에 해결법이 나와서 어노테이션하나만 붙이면 해결된다는걸 알수있었다.


상세데이터 만들기

데이터를 이제 잘 Response 하는건 알겠다.
그러면 만약에 Github이라는 정보를 원래 가지고 있던 User에 포함시켜서 Response하려면 어떻게 해야할까?

{
  "name": "Kyu",
  "age": 20,
  "email": "iamscvv@gmail.com",
  "깃헙": {
    "나의깃헙아이디" : "kyu-kim-kr",
    "나의레포갯수" : 150,
    "나의커밋갯수" : 3829
  }
}

바로 디비에도 컬럼에 깃헙이라는 커스텀 객체가 데이터타입으로 지정될수있다면 아마 위에처럼 나올지도 모르겠다. 나의 깃헙정보는 여러데이터를 담고 있기 때문에 {}중괄호안에 각 정보들이 나올수도 있을것 같다.

근데 다른 디비는 모르겠는데 일단 MySQL 데이터타입에 저렇게할수없다. 아마 다른 디비들도 분명 똑같을거같긴하다. 심지어 간단하다고 생각했던 배열도 들어갈수가 없다. MySQL 5.7.8버전부터는 JSON 데이터가 들어갈 수 있다고 하는데, 이게 객체와 관계가 있을거 같다고 생각이 들긴하는데 아직 구체적으론 잘 모르겠다.

어쨋든 그래서 지금 바로 생각나는 것이 상속관계의 테이블일 것이다.
user라는 부모테이블이 있고 github이라는 자식테이블 관계를 떠올릴것이다. 그리고 이 둘의 테이블은 1:1관계이다. 한 유저에 한 깃헙정보만 매칭되기 때문이다.
email은 유니크한 정보이니까 email을 referenced column 으로 두면 될것이다.

문제점..

테이블은 저런식으로 만드는데, 어떻게 레포지토리랑 연결해야할까? 잘 몰겠다..ㅋㅋㅋ
호눅스가 1:1로하고 @Embedded 를 이용하는 걸 보여주셨는데, 이건 엄청 간단했다. 애초에 테이블을 두개로 안나누고 user 테이블에 Github관한 정보들을 컬럼으로 끝에 다 추가해준다. 클래스만 Github으로 필드에 추가해주고 Github에 추가해줬던 컬럼이랑 똑같이 필드만들고 생성자,게터만들면 자동으로 작동한다..👍

다른 문제는 email에 따라서 Github 데이터만 이렇게 가져와야하는데..

// Github 데이터를 꺼낼 때
{
  "email": "iamscvv@gmail.com",
  "data": {
    "나의깃헙아이디" : "kyu-kim-kr",
    "나의레포갯수" : 150,
    "나의커밋갯수" : 3829
  }
}

아직은 어떻게해야할지 잘 모르겠다.
내생각엔 결국에 이렇게하려면 email 을 참조하는 자식테이블을 가져야하는 것 같은데, 일단 먼저 시도해봐야곘다.

자식테이블..?

필요없었다.
이메일을 통해서 가져오든 아니든 그냥 @Embedded 를 또 활용하면됐다.
email에 따라서 가져오는게 아니라, @Embedded로 객체에 있는 필드를 가져오는형식으로 Github이라는 클래스에 email을 넣어서 관리하면 된다. 그럼 이렇게 되겠지?

public class Github {
     private String email;
     private Data data;
     
     // ... Constructor, getter
}

테이블은 한 테이블이지만 그림으로 표현하면 이처럼 될것이다.


그 외 맞닥뜨린 문제들..

1.

배열나타내는 문제 해결... DataDto 만들어서 처리...
빌드패턴으로 해결해볼까 뭔가 어어어엄청 복잡해짐

-> 빌드패턴이 문제가 아니라 조금 복잡해지니 정신을 놔서 흐름을 놓쳐버려서 포기하고 다른 방식으로 했었음

2.

애초에 문제였던 String[] 을 Set으로 바꿔보자
Set도 배열형식으로 나오나???? -> 그렇다.

-> String[]이 문제가 아니었다. Set 으로 바꾸면서 알게 된건데, String에 쉼표로 여러 데이터를 관리하던 것을 배열로 바꾸는 메서드를 변경하면서 깨달은건데 그냥 null처리를 잘못해서 계속 null이 떠서 문제였던거다.

-> 웹페이지에서 POST 요청을 하지 않는 이상, Collections를 쓸 필요가 없다고 판단해서 이번 프로젝트에서는 String[]을 써도 상관없을듯.

3.

JSON key 이름 변경, Jackson Annotations 로 할수있는 방법이없을까?

-> 검색결과 https://stackoverflow.com/questions/50963596/how-to-rename-json-object-name-with-java-annotation/50963656 나왔음
클래스이름으로 이름을 설정하는건줄알았는데 알고보니 변수이름으로 결정되는거였음.

profile
TIL 남기는 공간입니다

0개의 댓글