2018-10-14 Json을 Object타입으로 만들기
{
"username":"jimmy",
"channel":"test",
"attachments":[
{
"color":"#CC0000",
"title":"<http://www.naver.com|삼성전자> : 10.0",
"fields":[
{
"title":"주가", "value":50000,"short":"true"
},
{
"title":"변동률", "value":2.0,"short":"true"
},
{
"title":"변동가격", "value":1000,"short":"true"
}
],
"footer":"MADE BY JIMMY"
}
]
}
- 위의 형태를 처음에는 StockJsonDto로 만들었다. 하지만 메서드 내부적으로 복잡했기때문에 리팩토링을 하기로 했다.
- Field객체, Attachemnt객체, Converter객체로 나누었다.
public class Field extends LinkedHashMap<String, Object> {
public Field(String title, Object value) {
put("title", title);
put("value", value);
put("short", true);
}
}
- Field객체에서는 title, value, sort라는 key값을 가지고 value값으로는 Stock객체에 있는 값들을 가지고 온다.
- Field객체에 HashMap을 상속을 받아서 Field객체가 위의 key값들을 가지고있다. key값들의 순서를 위해 LinkedHashMap을 상속을 받았다.
public class Attachment extends LinkedHashMap<String, Object> {
private static final Logger logger = LoggerFactory.getLogger(Attachment.class);
public Attachment(Stock stock, String color) {
put("color", color);
put("title", "<" + stock.getDetailUrl() + " |" + stock.getName() + "> 주가 : " + stock.getCost() + " 변동률 : " + stock.getRate() + " 변동가격 : " + stock.getUpdn());
put("text", "주가 : " + stock.getCost() + " 변동가 : " + stock.getUpdn());
}
}
- Attachemnt객체에도 각 Filed의 순서가 필요하므로 LinkedHashMap을 상속을 받아서 Filed의 순서를 유지했고, color와 footer, title의 속성을 가지고 있다.
public class Converter extends LinkedHashMap<String, Object> {
private static final Logger logger = LoggerFactory.getLogger(Converter.class);
private static final String red = "#CC0000";
private static final String blue = "#0000FF";
public Converter(Stock stock, String channel) {
put("username", "jimmy");
put("channel", channel);
List<Attachment> attachments = new ArrayList<>();
attachments.add(new Attachment(stock, checkColor(stock)));
put("attachments", attachments);
}
public Converter(List<Stock> stocks, String channel) {
put("username", "jimmy");
put("channel", channel);
List<Attachment> attachments = new ArrayList<>();
for (Stock stock : stocks)
attachments.add(new Attachment(stock, checkColor(stock)));
put("attachments", attachments);
}
public static String checkColor(Stock stock) {
if (stock.getRate() > 0.0)
return red;
return blue;
}
}
- Converter객체에서는 Stock객체를 생성자를 통해 전달을 받는데, Stock객체의 변동률을 통해서 등락률을 알 수 있게 색상을 전달해준다.
- attachments라는 리스트를 생성을 해서, 그 안에 attchment를 추가한다.
결론
- 위의 Json에서 각 계층별로 리팩토링을 진행을 했다. 이전에 했던 방법보다 훨씬 더 깔끔하고 유지보수가 쉬워졌다.
- Converter객체를 Gson.toJson(Converter)를 통해서 바로 Json형태로 변환을 했다.
Written on October 14, 2018