Apr 26, 2019 - baemin_seminar

의식적인 TDD, 리팩토링

4월 우아한 테크 세미나 “의식적인 TDD, 리팩토링” 세미나에 다녀왔습니다. clusternodeImg

규칙 1: 한 메서드에 오직 한 단계의 들여쓰기만 한다.
규칙 2: else 예약어를 쓰지 않는다.
규칙 3: 모든 원시값과 문자열을 포장한다.
규칙 4: 한 줄에 점을 하나만 찍는다.
규칙 5: 줄여쓰지 않는다(축약 금지).
규칙 6: 모든 엔티티를 작게 유지한다.
규칙 7: 2개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
규칙 8: 일급 콜렉션을 쓴다.
규칙 9: 게터/세터/프로퍼티를 쓰지 않는다.

에서, 1번부터 7번까지에 대해 기초적인 부분부터 자세히 설명해주셨습니다.

평생동안 연습하겠다는 마음가짐으로 시작하고, 결혼하지 않은 사람이라면, 조금더 공부하는 마음가짐을 가졌으면 좋겠다고 하였습니다.

가장 공감이 가던 것은,
회사 소스에 바로 적용하지 말고, 장난감 프로젝트를 찾아서 만들라는 점이었습니다.
회사에 소스를 적용해보고, 리팩토링한 후에 롤백을 한 경험이 몇번 있었기에 더욱더 동감이 되었습니다.

주변 환경에 영향을 받지 않고 꾸준히 연습할 수 있는 환경이라는 것이 매우 중요한거 같습니다.

결론부터 이야기하자면 의식적인 TDD, 리팩토링 세미나에서 요구하고자한 내용은,

1. ELSE 를 쓰지 않는 조건에 대한 논리를 최소화하여 다형성 유도  
2. 객체지향프로그램의 성배인 데이터의 캡슐화  

로 축약할 수 있을 거 같습니다.

결론 : 코드나 아이디어의 중복이 없는 코드를 만들자!

마틴 파울러 형님은 컴퓨터가 이해하는 코드는 어느 바보나 짤 수 있다. 좋은 프로그래머는 사람이 이해하는 코드를 짠다
(Any fool can write code that a computer can understand. Good programmers write code that humans can understand.)고 하셨습니다.

일을 하다보면, 우선순위에 따라 타협을 하게 됩니다.

제가 개발하고 있는 광고솔류션은 모든 응답을 100ms 안에 맞춰야합니다. 시간으로 따지면 0.1초 안에 응답을 해야합니다.

100ms의 대다수의 시간은 nio 관련된 이슈입니다. 데이터베이스나, nosql 등에서 데이터를 가져오는데 걸리는 시간입니다. 그렇기 때문에 제가 어떤 소스를 짜든 속도의 이슈는 없다고 봐도 무방합니다.

그러나, 하드웨어의 발젼으로 제가 짠 소스만 JUNIT으로 검증할 경우 0.00000001ms 안에 응답이 처리되는 경우가 많고, Source 상에 로직에 의해 100ms 가 걸리는 경우는 없습니다.

그러나, 그 소스를 10만번, 100만번 돌렸을 경우에, 리팩토링한 소스와 기존 레거시 코드를 비교했을 때,
레거시 코드의 성능이 더 나은 경우가 더 많아 리팩토링을 할지 그냥 둘지 고민하게 됩니다.

새로운 기술이 오면, 야근을 하든 철야를 하든 시간을 내서 적용해봅니다.

람다를 적용해보기도 하고, 일정을 맞추기 위해 급하게 만든 소스들을 패턴화하여 간결하게 바꾸는 작업등을 해서 사람이 보기 편한 소스를 짜보기도 합니다.

그렇게 해서 테스트한 속도가 조금더 기계적인, 혹은 원시적인 소스를 짠 속도보다는 당연할지 모르겠지만 더 느리게 나옵니다.
그 타협점을 잘 찾아서 회사에 적용해야합니다.

그전에 세미나에서 들은 데로, 개인적인 장난감 프로젝트를 빨리 진행해서 리팩토링에 대한 즐거움을 조금더 재미있게 즐겨야할 거 같습니다.

여담으로 “규칙 9: 게터/세터/프로퍼티를 쓰지 않는다”는 건 좀 어렵지 않을까 싶습니다.

강한 캡슐화를 의미하는 것으로 보이는데요!

인스턴스 변수는 한번 사용했을 경우 해당 클래스에서 전부 사용(동작)한 후 코드를 만질 다른 프로그래머를 위해 단절시키는 것을 원하는 것으로 보입니다.

누군가 해당 인스턴스 변수를 재사용함으로써 중복 오류 등의 문제를 최소화 하고,
캡슐화로 인해 완전 독립적인 객체지향프로그램으로써의 좋은 점이 있을 수 있겠지만,
개발자들의 편의성(?)과 다시금 사용해야하는 중복되는 인스턴스 변수를 다시 생성해야하는 문제가 있을 것으로 보여, 이미 구현된 회사소스에서 적용하기는 어렵고, 장난감 프로젝트에서나 고민해봐야겠습니다.

정확한 세미나에 대한 내용은 참조 주소에서 확인할 수 있습니다. (잘정리되어있습니다.)


참조


Mar 14, 2019 - 환율 API 내용 정리

한국수출입은행에서, 현재 환율을 실시간으로 제공합니다.

https://www.koreaexim.go.kr/site/program/financial/exchangeJSON?data=AP01&authkey=xxxxxxx&searchdate=20190314

인증키를 발급받아 요청을 할 경우, 해당 환율이 나오게 됩니다. 테스트 시 나오는 결과값입니다.

[{"result":1,"cur_unit":"AED","ttb":"305.77","tts":"311.94","deal_bas_r":"308.86","bkpr":"308","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"308","kftc_deal_bas_r":"308.86","cur_nm":"아랍에미리트 디르함"},{"result":1,"cur_unit":"AUD","ttb":"794.74","tts":"810.79","deal_bas_r":"802.77","bkpr":"802","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"802","kftc_deal_bas_r":"802.77","cur_nm":"호주 달러"},{"result":1,"cur_unit":"BHD","ttb":"2,979.02","tts":"3,039.21","deal_bas_r":"3,009.12","bkpr":"3,009","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"3,009","kftc_deal_bas_r":"3,009.12","cur_nm":"바레인 디나르"},{"result":1,"cur_unit":"CAD","ttb":"838.57","tts":"855.52","deal_bas_r":"847.05","bkpr":"847","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"847","kftc_deal_bas_r":"847.05","cur_nm":"캐나다 달러"},{"result":1,"cur_unit":"CHF","ttb":"1,112.36","tts":"1,134.83","deal_bas_r":"1,123.6","bkpr":"1,123","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,123","kftc_deal_bas_r":"1,123.6","cur_nm":"스위스 프랑"},{"result":1,"cur_unit":"CNH","ttb":"166.78","tts":"170.15","deal_bas_r":"168.47","bkpr":"168","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"168","kftc_deal_bas_r":"168.47","cur_nm":"위안화"},{"result":1,"cur_unit":"DKK","ttb":"169.62","tts":"173.05","deal_bas_r":"171.34","bkpr":"171","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"171","kftc_deal_bas_r":"171.34","cur_nm":"덴마아크 크로네"},{"result":1,"cur_unit":"EUR","ttb":"1,265.45","tts":"1,291.02","deal_bas_r":"1,278.24","bkpr":"1,278","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,278","kftc_deal_bas_r":"1,278.24","cur_nm":"유로"},{"result":1,"cur_unit":"GBP","ttb":"1,488.12","tts":"1,518.19","deal_bas_r":"1,503.16","bkpr":"1,503","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,503","kftc_deal_bas_r":"1,503.16","cur_nm":"영국 파운드"},{"result":1,"cur_unit":"HKD","ttb":"143.08","tts":"145.97","deal_bas_r":"144.53","bkpr":"144","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"144","kftc_deal_bas_r":"144.53","cur_nm":"홍콩 달러"},{"result":1,"cur_unit":"IDR(100)","ttb":"7.86","tts":"8.01","deal_bas_r":"7.94","bkpr":"7","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"7","kftc_deal_bas_r":"7.94","cur_nm":"인도네시아 루피아"},{"result":1,"cur_unit":"JPY(100)","ttb":"1,009.25","tts":"1,029.64","deal_bas_r":"1,019.45","bkpr":"1,019","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,019","kftc_deal_bas_r":"1,019.45","cur_nm":"일본 옌"},{"result":1,"cur_unit":"KRW","ttb":"0","tts":"0","deal_bas_r":"1","bkpr":"1","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1","kftc_deal_bas_r":"1","cur_nm":"한국 원"},{"result":1,"cur_unit":"KWD","ttb":"3,694.95","tts":"3,769.6","deal_bas_r":"3,732.28","bkpr":"3,732","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"3,732","kftc_deal_bas_r":"3,732.28","cur_nm":"쿠웨이트 디나르"},{"result":1,"cur_unit":"MYR","ttb":"274.64","tts":"280.19","deal_bas_r":"277.42","bkpr":"277","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"277","kftc_deal_bas_r":"277.42","cur_nm":"말레이지아 링기트"},{"result":1,"cur_unit":"NOK","ttb":"129.84","tts":"132.47","deal_bas_r":"131.16","bkpr":"131","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"131","kftc_deal_bas_r":"131.16","cur_nm":"노르웨이 크로네"},{"result":1,"cur_unit":"NZD","ttb":"768.01","tts":"783.52","deal_bas_r":"775.77","bkpr":"775","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"775","kftc_deal_bas_r":"775.77","cur_nm":"뉴질랜드 달러"},{"result":1,"cur_unit":"SAR","ttb":"299.48","tts":"305.53","deal_bas_r":"302.51","bkpr":"302","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"302","kftc_deal_bas_r":"302.51","cur_nm":"사우디 리얄"},{"result":1,"cur_unit":"SEK","ttb":"119.95","tts":"122.38","deal_bas_r":"121.17","bkpr":"121","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"121","kftc_deal_bas_r":"121.17","cur_nm":"스웨덴 크로나"},{"result":1,"cur_unit":"SGD","ttb":"827.49","tts":"844.2","deal_bas_r":"835.85","bkpr":"835","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"835","kftc_deal_bas_r":"835.85","cur_nm":"싱가포르 달러"},{"result":1,"cur_unit":"THB","ttb":"35.46","tts":"36.17","deal_bas_r":"35.82","bkpr":"35","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"35","kftc_deal_bas_r":"35.82","cur_nm":"태국 바트"},{"result":1,"cur_unit":"USD","ttb":"1,123.15","tts":"1,145.84","deal_bas_r":"1,134.5","bkpr":"1,134","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,134","kftc_deal_bas_r":"1,134.5","cur_nm":"미국 달러"}]

만약 미국 달러가 필요할 경우,

https://www.koreaexim.go.kr/site/program/financial/exchangeJSON?data=AP01&authkey=xxxx&searchdate=20190312&cur_unit=USD

USD를 요청하면됩니다. 정확한 스펙문서는,

https://www.koreaexim.go.kr/site/program/openapi/openApiList?menuid=001003002002001 에 정의되어있습니다.

추가적으로 네이버 환율 목차를 크롤링하거나, 하나은행 API를 사용할 수 있습니다.

호출 주소는 http://fx.kebhana.com/FER1101M.web 다음과 같습니다! https://quotation-api-cdn.dunamu.com/v1/forex/recent?codes=FRX.KRWUSD

 { "통화명": "미국 USD", "현찰사실때":"1194.03", "현찰파실때":"1152.97", "송금_전신환보내실때":"1185.00", "송금_전신환받으실때":"1162.00", "매매기준율":"1173.50" }, { "통화명": "일본 JPY 100", "현찰사실때":"1136.80", "현찰파실때":"1097.70", "송금_전신환보내실때":"1128.19", "송금_전신환받으실때":"1106.31", "매매기준율":"1117.25" }, { "통화명": "유로 EUR", "현찰사실때":"1408.45", "현찰파실때":"1353.49", "송금_전신환보내실때":"1394.77", "송금_전신환받으실때":"1367.17", "매매기준율":"1380.97" }, { "통화명": "중국 CNY", "현찰사실때":"182.00", "현찰파실때":"164.68", "송금_전신환보내실때":"175.07", "송금_전신환받으실때":"171.61", "매매기준율":"173.34" }, { "통화명": "홍콩 HKD", "현찰사실때":"154.40", "현찰파실때":"148.44", "송금_전신환보내실때":"152.93", "송금_전신환받으실때":"149.91", "매매기준율":"151.42" }, { "통화명": "태국 THB", "현찰사실때":"39.48", "현찰파실때":"35.35", "송금_전신환보내실때":"37.97", "송금_전신환받으실때":"37.23", "매매기준율":"37.60" }, { "통화명": "대만 TWD", "현찰사실때":"45.54", "현찰파실때":"37.46", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"40.27" }, { "통화명": "필리핀 PHP", "현찰사실때":"26.62", "현찰파실때":"22.22", "송금_전신환보내실때":"24.44", "송금_전신환받으실때":"23.96", "매매기준율":"24.20" }, { "통화명": "싱가포르 SGD", "현찰사실때":"879.10", "현찰파실때":"844.80", "송금_전신환보내실때":"870.56", "송금_전신환받으실때":"853.34", "매매기준율":"861.95" }, { "통화명": "호주 AUD", "현찰사실때":"870.36", "현찰파실때":"836.74", "송금_전신환보내실때":"862.08", "송금_전신환받으실때":"845.02", "매매기준율":"853.55" }, { "통화명": "베트남 VND 100", "현찰사실때":"5.65", "현찰파실때":"4.47", "송금_전신환보내실때":"5.11", "송금_전신환받으실때":"5.01", "매매기준율":"5.06" }, { "통화명": "영국 GBP", "현찰사실때":"1547.28", "현찰파실때":"1487.50", "송금_전신환보내실때":"1532.56", "송금_전신환받으실때":"1502.22", "매매기준율":"1517.39" }, { "통화명": "캐나다 CAD", "현찰사실때":"904.57", "현찰파실때":"869.63", "송금_전신환보내실때":"895.97", "송금_전신환받으실때":"878.23", "매매기준율":"887.10" }, { "통화명": "말레이시아 MYR", "현찰사실때":"300.91", "현찰파실때":"262.14", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"280.25", "매매기준율":"283.08" }, { "통화명": "러시아 RUB", "현찰사실때":"16.71", "현찰파실때":"13.91", "송금_전신환보내실때":"15.77", "송금_전신환받으실때":"15.47", "매매기준율":"15.62" }, { "통화명": "남아공화국 ZAR", "현찰사실때":"75.86", "현찰파실때":"65.85", "송금_전신환보내실때":"72.42", "송금_전신환받으실때":"70.72", "매매기준율":"71.57" }, { "통화명": "노르웨이 NOK", "현찰사실때":"132.05", "현찰파실때":"125.75", "송금_전신환보내실때":"130.18", "송금_전신환받으실때":"127.62", "매매기준율":"128.90" }, { "통화명": "뉴질랜드 NZD", "현찰사실때":"800.95", "현찰파실때":"770.01", "송금_전신환보내실때":"793.33", "송금_전신환받으실때":"777.63", "매매기준율":"785.48" }, { "통화명": "덴마크 DKK", "현찰사실때":"190.18", "현찰파실때":"181.10", "송금_전신환보내실때":"187.49", "송금_전신환받으실때":"183.79", "매매기준율":"185.64" }, { "통화명": "멕시코 MXN", "현찰사실때":"61.18", "현찰파실때":"50.95", "송금_전신환보내실때":"56.17", "송금_전신환받으실때":"55.07", "매매기준율":"55.62" }, { "통화명": "몽골 MNT", "현찰사실때":"0.00", "현찰파실때":"0.00", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"0.41" }, { "통화명": "바레인 BHD", "현찰사실때":"3311.59", "현찰파실때":"2863.41", "송금_전신환보내실때":"3143.52", "송금_전신환받으실때":"3081.28", "매매기준율":"3112.40" }, { "통화명": "방글라데시 BDT", "현찰사실때":"0.00", "현찰파실때":"0.00", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"13.84" }, { "통화명": "브라질 BRL", "현찰사실때":"246.89", "현찰파실때":"206.12", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"221.36", "매매기준율":"224.04" }, { "통화명": "브루나이 BND", "현찰사실때":"896.42", "현찰파실때":"810.24", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"861.95" }, { "통화명": "사우디아라비아 SAR", "현찰사실때":"332.58", "현찰파실때":"291.29", "송금_전신환보내실때":"315.99", "송금_전신환받으실때":"309.75", "매매기준율":"312.87" }, { "통화명": "스리랑카 LKR", "현찰사실때":"0.00", "현찰파실때":"0.00", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"6.35" }, { "통화명": "스웨덴 SEK", "현찰사실때":"135.95", "현찰파실때":"129.45", "송금_전신환보내실때":"134.02", "송금_전신환받으실때":"131.38", "매매기준율":"132.70" }, { "통화명": "스위스 CHF", "현찰사실때":"1311.50", "현찰파실때":"1260.84", "송금_전신환보내실때":"1299.03", "송금_전신환받으실때":"1273.31", "매매기준율":"1286.17" }, { "통화명": "아랍에미리트공화국 AED", "현찰사실때":"337.05", "현찰파실때":"297.44", "송금_전신환보내실때":"322.67", "송금_전신환받으실때":"316.29", "매매기준율":"319.48" }, { "통화명": "알제리 DZD", "현찰사실때":"0.00", "현찰파실때":"0.00", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"9.10" }, { "통화명": "오만 OMR", "현찰사실때":"3319.32", "현찰파실때":"2865.17", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"3048.05" }, { "통화명": "요르단 JOD", "현찰사실때":"1802.45", "현찰파실때":"1522.74", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"1655.15" }, { "통화명": "이스라엘 ILS", "현찰사실때":"376.78", "현찰파실때":"315.13", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"342.53" }, { "통화명": "이집트 EGP", "현찰사실때":"0.00", "현찰파실때":"0.00", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"74.46" }, { "통화명": "인도 INR", "현찰사실때":"0.00", "현찰파실때":"0.00", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"15.93" }, { "통화명": "인도네시아 IDR 100", "현찰사실때":"8.48", "현찰파실때":"7.14", "송금_전신환보내실때":"8.00", "송금_전신환받으실때":"7.86", "매매기준율":"7.93" }, { "통화명": "체코 CZK", "현찰사실때":"56.00", "현찰파실때":"46.98", "송금_전신환보내실때":"52.18", "송금_전신환받으실때":"51.06", "매매기준율":"51.62" }, { "통화명": "칠레 CLP", "현찰사실때":"1.66", "현찰파실때":"1.42", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"1.54" }, { "통화명": "카자흐스탄 KZT", "현찰사실때":"0.00", "현찰파실때":"0.00", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"2.77" }, { "통화명": "카타르 QAR", "현찰사실때":"0.00", "현찰파실때":"0.00", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"322.30" }, { "통화명": "케냐 KES", "현찰사실때":"0.00", "현찰파실때":"0.00", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"10.84" }, { "통화명": "콜롬비아 COP", "현찰사실때":"0.00", "현찰파실때":"0.00", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"0.32" }, { "통화명": "쿠웨이트 KWD", "현찰사실때":"4086.24", "현찰파실때":"3529.91", "송금_전신환보내실때":"3875.21", "송금_전신환받으실때":"3798.49", "매매기준율":"3836.85" }, { "통화명": "탄자니아 TZS", "현찰사실때":"0.00", "현찰파실때":"0.00", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"0.51" }, { "통화명": "터키 TRY", "현찰사실때":"0.00", "현찰파실때":"0.00", "송금_전신환보내실때":"158.21", "송금_전신환받으실때":"154.77", "매매기준율":"156.49" }, { "통화명": "파키스탄 PKR", "현찰사실때":"0.00", "현찰파실때":"0.00", "송금_전신환보내실때":"0.00", "송금_전신환받으실때":"0.00", "매매기준율":"7.06" }, { "통화명": "폴란드 PLN", "현찰사실때":"334.85", "현찰파실때":"285.25", "송금_전신환보내실때":"313.46", "송금_전신환받으실때":"306.64", "매매기준율":"310.05" }, { "통화명": "헝가리 HUF", "현찰사실때":"4.19", "현찰파실때":"3.54", "송금_전신환보내실때":"3.88", "송금_전신환받으실때":"3.80", "매매기준율":"3.84" }

네이버의 환율 관련 크롤링 주소는 다음과 같습니다.

{'미국 USD':'http://finance.naver.com/marketindex/exchangeDailyQuote.nhn?marketindexCd=FX_USDKRW',
'일본 JPY':'http://finance.naver.com/marketindex/exchangeDailyQuote.nhn?marketindexCd=FX_JPYKRW',
'유럽연합 EUR':'http://finance.naver.com/marketindex/exchangeDailyQuote.nhn?marketindexCd=FX_EURKRW',
'중국 CNY':'http://finance.naver.com/marketindex/exchangeDailyQuote.nhn?marketindexCd=FX_CNYKRW'}

페이지를 크롤링합니다.

      Document doc = Jsoup.connect(url)
              .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36")
              .ignoreContentType(true).get();


      Elements list = doc.getElementsByClass("section_exchange").get(0).getElementsByTag("tr");

      for (Element element : list) {
        if (element.text().contains(yyyyMMdd.format(new Date()))) { // yyyyMMdd.format(new Date());
          Elements tdList = element.getElementsByTag("td");
          System.out.println(tdList.get(6).text().replace(",", ""));
          break;
        }
      }

참조


Mar 13, 2019 - assets_Response

타불라 네이비트 광고의 Response 요청 처리안 스펙정의값

The native ad markup object is the top level JSON object which identifies a native response. Each asset within the asset array corresponds to the Asset Object in the request. The main container object for each asset requested or supported by Exchange on behalf of the rendering client. Out of the six possible assets only title and img are mandatory. The Taboola Open RTB supports this either as a JSON-encoded string, or a formal object. For video, the inline VAST document in the adm attribute constitute the ad markup

adm object

“link” -> “{“url”:”https://partneradvertiser.com/url/data/com”,”clicktrackers”:[]}”

“imptrackers” -> “[“http://partnerimptrackerurl.com/imp/trackers/{AUCTION_PRICE}”]”

assets : List of native ad’s assets link : Destination Link. This is the link object for the ad. imptrackers : Array of impression tracking URLs, expected to return a 1x1 image or 204 response - This is one of the possible means for conveying win notifications to the exchange partner. Taboola Open RTB Exchange will replace macros defined within the URL as specified under table 4.2.5 in this specification, or with an empty string if unavailable. Up to 4 tracking URLs will be allowed. The impression tracker is limited to 3000 characters

URL : Landing URL of the clickable link. clicktrackers : List of third-party tracker URLs to be fired on click of the URL. - Taboola Open RTB Exchange will replace macros defined within the URL as specified under table 4.2.5 in this specification, or with an empty string if unavailable. Up to 3 tracking URLs will be allowed. If more than three exist, only the first 3 will be fired.

landing url 에 대한 유효 클릭에 대한 대응 처리에 대한 방안이 고려되어야함.

Native asset object - title

{“id”:1,”title”:{“text”:”Some site title - Some site titile”},”img”:null,”data”:null,”video”:null}

id : the asset IDs in request - 1 title : Contains a single (string typed) field, named ‘text’ which contains the text associated with the title element - 40 characters, after which “…” are added

Native asset object - img

{“id”:2,”title”:null,”img”:{“url”:”http://somesitename.com/images/img.jpg”,”w”:600,”h”:500},”data”:null,”video”:null}

id : the asset IDs in request - 2 img : url : URL of the image asset - The image URL is limited to 1024 characters w : Optional h : Optional

Since the Taboola network’s supply consists of native placements the use of h,w parameters are highly recommended. They allow the Taboola algorithm to optimize the the processing of the source image so that it optimally fits into the (possibly varying) placement dimensions. In some cases, we might also choose to reject the bid, if we suspect that the difference between source and target dimension would inevitably create a bad user experience and low engagement chances, which would be inefficient both for the Publisher hosting that placement and the Taboola exchange partner.

Native asset object - brand name

{“id”:3,”title”:null,”img”:null,”data”:{“value”:”Some site name”},”video”:null}

id : the asset IDs in request - 3 data : Contains a single (string typed) field, named ‘value’ which contains the text associated with the brand name element

Native asset object - description

{“id”:4,”title”:null,”img”:null,”data”:{“value”:”site description and other information provided”},”video”:null}

id : the asset IDs in request - 4 data : Contains a single (string typed) field, named ‘value’ which contains the text associated with the description element

Native asset object - price

id : the asset IDs in request - 5 data : Contains a single (string typed) field, named ‘value’ which contains the text associated with the price element - As stated above, value should include currency symbol in localised format. Limited to 40 characters.

id : the asset IDs in request - 6 data : Contains a single (string typed) field, named ‘value’ which contains the text to be concatenated to the partner domain. Combined, they create the privacy link URL which will be incorporated in the widget opt-out AdChoices icon

Native asset object - video

vasttag : vast xml - 7