<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Archives-2017 on</title><link>https://taetaetae.github.io/tags/archives-2017/</link><description>Recent content in Archives-2017 on</description><generator>Hugo</generator><language>en</language><lastBuildDate>Thu, 14 Dec 2017 12:02:45 +0000</lastBuildDate><atom:link href="https://taetaetae.github.io/tags/archives-2017/index.xml" rel="self" type="application/rss+xml"/><item><title>Elastic{ON}Tour</title><link>https://taetaetae.github.io/2017/12/14/elastic-on-tour/</link><pubDate>Thu, 14 Dec 2017 12:02:45 +0000</pubDate><guid>https://taetaetae.github.io/2017/12/14/elastic-on-tour/</guid><description>&lt;p>작년에 팀을 옮기면서 &lt;code>로깅&lt;/code>에 대해서 관심을 갖기 시작 하였고 찾아보다 ElasticStack 이 적합하다고 판단, 팀 내에서 나홀로 삽질해가며 지금의 로그 모니터링 시스템을 구축하였다. 그에 ElasticStack 에 관심을 갖던 찰나 지난 화요일(12월 12일)에 있었던 Elastic On Tour에 참석을 하였고 다양한 기술적 인사이트를 얻을수 있었는데 그 감동(?)을 잃기 싫어 정리해보고자 한다.&lt;/p>
&lt;!-- more -->
&lt;h2 id="registration--partner-showcase">Registration + Partner Showcase&lt;/h2>
&lt;p>코엑스 인터컨티넨탈 호텔에서 진행되었다. 역시 외국계 기업이여서 그런지 행사 규모가 어마어마 했다. 이정표를 따라 지하로 가서 등록을 하고, ElasticStack 을 이용해서 서비스를 하고 있는 파트너사들의 부스를 기웃거리며 ElasticStack의 저력(?)을 다시한번 실감을 할수 있었다. 특히 Elatic 본사에서 나온듯한 외국인들이 Q&amp;amp;A 같은걸 해줬는데 답변을 해주는 외국인도 대단해 보였는데 질문을 하는 한국사람(?)들이 더 대단하게 보였다. 과연 난 저렇게 아무렇지 않고 프로페셔널(?)하게 질문을 할수 있을까?
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/elastic-on-tour/people.jpg" title="/images/elastic-on-tour/people.jpg" data-thumbnail="/images/elastic-on-tour/people.jpg" data-sub-html="&lt;h2>Registration &amp;#43; Partner Showcase&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/elastic-on-tour/people.jpg"
 data-srcset="https://taetaetae.github.io/images/elastic-on-tour/people.jpg, https://taetaetae.github.io/images/elastic-on-tour/people.jpg 1.5x, https://taetaetae.github.io/images/elastic-on-tour/people.jpg 2x"
 data-sizes="auto"
 alt="/images/elastic-on-tour/people.jpg" />
 &lt;/a>&lt;figcaption class="image-caption">Registration + Partner Showcase&lt;/figcaption>
 &lt;/figure>&lt;/p>
&lt;h2 id="track-1--partner-sessions">Track 1 : Partner Sessions&lt;/h2>
&lt;p>Track 1 과 2로 나뉘였는데 2는 Elastic Stack 을 경험하지 못해봤거나 소개하는 자리같아서 Track 1를 듣기로 하였다. 내가 도입을 할때만 해도 관련 자료가 잘 없었고, 정말 특이 케이스가 아닌 이상엔 잘 사용하지 않겠구나 하는 느낌이였는데 발표하시는 분들을 보고서는 생각이 180도 바뀌었다. 너무 활용들을 잘 하며 서비스를 하고 있었고 단순하게 &lt;code>검색엔진&lt;/code>이 아닌 상황에 맞는 커스터 마이징이나 다른 기술 스택을 함께 사용함으로써 시너지 효과를 내고 있었다.&lt;/p>
&lt;ul>
&lt;li>Microsoft
&lt;ul>
&lt;li>OpenSource 에 안좋은 이미지가 있으나 오래전부터 투자를 많이 해왔다고 설명을 하며 Azure라는 서비스에서 Elastic Stack 을 어떤식으로 활용하는지 발표를 하였다.&lt;/li>
&lt;li>상당히 심플하고 처음 접하는 사람도 클릭 몇번으로 ES Cluster를 구성할수 있다는게 장점이였으나, 유료 + 커스터마이징 제한 이 아쉬웠다.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>S-Core : 에스코어 경험에 기반한 Elastic 활용법&lt;/li>
&lt;li>EZFarm
&lt;ul>
&lt;li>(외모 비하는 아니지만)농부 처럼 생기신 분이 나와서 기술에 대해 말씀하시는게 신기한 발표였다.&lt;/li>
&lt;li>간단히 말하면 돼지가 물 먹는 량 등 농업/축산업의 데이터를 ES에 담고 머신러닝을 통하여 효율화 하는 방안 이였던것 같다.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>MEGAZONE
&lt;ul>
&lt;li>파트너 부스에서 티셔츠를 준(?) 곳이였는데 Elastic Cloud Seoul 을 발표하였다. (드디어 한국에도 이런 서비스가!)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>OpenBase
&lt;ul>
&lt;li>키바나 플러그인을 직접 개발하고 커스텀 UI의 사례를 보여주었다.&lt;/li>
&lt;li>키바나 소스중에 엑셀 다운로드가 한글로 안되어 고쳐본것 말곤 플러그인을 개발할 생각은 없었는데 정말 개발자 스러운 발표였다.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>DIREA
&lt;ul>
&lt;li>결제 관련 장애추적 및 예측 시스템을 발표하였다.&lt;/li>
&lt;li>마침 내가 하고있는 서비스와 비슷하고, 내가 구현해보려고 했던 부분과 거의 일맥상통한 부분이 있어서 소름이였다.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/elastic-on-tour/parter_Session.jpg" title="/images/elastic-on-tour/parter_Session.jpg" data-thumbnail="/images/elastic-on-tour/parter_Session.jpg" data-sub-html="&lt;h2>Track 1 : Partner Sessions&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/elastic-on-tour/parter_Session.jpg"
 data-srcset="https://taetaetae.github.io/images/elastic-on-tour/parter_Session.jpg, https://taetaetae.github.io/images/elastic-on-tour/parter_Session.jpg 1.5x, https://taetaetae.github.io/images/elastic-on-tour/parter_Session.jpg 2x"
 data-sizes="auto"
 alt="/images/elastic-on-tour/parter_Session.jpg" />
 &lt;/a>&lt;figcaption class="image-caption">Track 1 : Partner Sessions&lt;/figcaption>
 &lt;/figure>
&lt;h2 id="opening-keynote">Opening Keynote&lt;/h2>
&lt;p>앞서 어떤 발표에서 ElasticSearch가 탄생하게된 계기가 어떤 분이 요리사가 되려는 아내를 위해 조리법을 더 빨리 검색할수 있는 엔진을 만들었다고 하는데 그 어떤분이 내눈앞에 나타나 발표를 하셨다. 현 Elastic CEO 이신 Shay Banon 이였다. (어색한 동시 통역으로 이해하였지만) 그분이 강조하신 Elastic 회사 정신인 &amp;ldquo;간단한건 간단하게 만들어야 하며 쉬워야 한다.&amp;rdquo; 가 연설중에 가장 인상적이였고, 통역하신 아주머님(?)때문이였는지 전달하시는 의도를 정확히 파악하긴 어려웠으나 일단 CEO를 포함한 전체 회사 분위기가 젊어보인다는걸 느낄수 있었다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/elastic-on-tour/key_note.jpg" title="/images/elastic-on-tour/key_note.jpg" data-thumbnail="/images/elastic-on-tour/key_note.jpg" data-sub-html="&lt;h2>Shay Banon key note&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/elastic-on-tour/key_note.jpg"
 data-srcset="https://taetaetae.github.io/images/elastic-on-tour/key_note.jpg, https://taetaetae.github.io/images/elastic-on-tour/key_note.jpg 1.5x, https://taetaetae.github.io/images/elastic-on-tour/key_note.jpg 2x"
 data-sizes="auto"
 alt="/images/elastic-on-tour/key_note.jpg" />
 &lt;/a>&lt;figcaption class="image-caption">Shay Banon key note&lt;/figcaption>
 &lt;/figure>
&lt;h2 id="break-식사시간">Break (식사시간)&lt;/h2>
&lt;p>이런 세미나? 컨퍼런스? 를 많이 다녀본건 아니지만 역대급으로 좋았던 점심식사였다. ;)
사실 혼자와서 밥을 어떻게 해결하나 했는데 우르르르 호텔 직원분들이 각 자리에 도시락을 대령(?)해주셔서 맛있게 먹을수 있었다.
참 사람이 간사한게, 아침에 졸린눈 비벼가며 지옥철 고생을 뚫고 와서 힘들었지만 밥을 먹으면서 아침의 그 고생은 눈녹듯 사라졌다.&lt;/p>
&lt;figure>&lt;a class="lightgallery" href="https://taetaetae.github.io/images/elastic-on-tour/lunch.jpg" title="/images/elastic-on-tour/lunch.jpg" data-thumbnail="/images/elastic-on-tour/lunch.jpg" data-sub-html="&lt;h2>호텔 도시락!!&lt;/h2>">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/elastic-on-tour/lunch.jpg"
 data-srcset="https://taetaetae.github.io/images/elastic-on-tour/lunch.jpg, https://taetaetae.github.io/images/elastic-on-tour/lunch.jpg 1.5x, https://taetaetae.github.io/images/elastic-on-tour/lunch.jpg 2x"
 data-sizes="auto"
 alt="/images/elastic-on-tour/lunch.jpg" />
 &lt;/a>&lt;figcaption class="image-caption">호텔 도시락!!&lt;/figcaption>
 &lt;/figure>
&lt;h2 id="deep-dive-elasticsearch-ingest-kibana-machine-learning">Deep Dive (Elasticsearch, Ingest, Kibana, Machine Learning)&lt;/h2>
&lt;p>각 스택(?)에 대해서 변화된 부분, 그리고 활용가능성과 최근 출시한 6.X 버전에 대해서 소개하는 시간이였다. 사실 아직 2.4 버전을 운영중이라서인지 6.X의 변화된 부분, 그리고 5.x 버전에서의 차이를 설명해주는데 확 와닿지는 못하였다. 아직 5.x 버전의 필요성을 못느껴서 버전업을 안하고 있었는데 발표를 듣고 꼭 유료 라이센스를 구매하지 않아도 용량 단축이나 안정성, 추가 기능등 5.X로의 버전업은 해서 나쁠것도 없을듯 하다는 생각이 들었다. (단, 무조건 신버전이 좋은것은 아닌듯 잘 알아보고 해야겠지&amp;hellip;)
특히 키바나를 활용해 머신러닝을 눈앞에서 보여준건 너무 좋았다. 성능이 좋아서인지 데모시연 하는데 전혀 막힘이 없었으니&amp;hellip;&lt;/p></description></item><item><title>What is Kafka?</title><link>https://taetaetae.github.io/2017/11/02/what-is-kafka/</link><pubDate>Thu, 02 Nov 2017 21:30:13 +0000</pubDate><guid>https://taetaetae.github.io/2017/11/02/what-is-kafka/</guid><description>&lt;p>필자가 맡고있는 서비스에 Elastic Stack 을 도입하면서 중간에 버퍼가 필요하여 Message-Queue 시스템들을 알아보던 중 Kafka 에 대해 알아보고, 정리를 해보게 된다.&lt;/p>
&lt;h2 id="기본설명-및-기존-메세징-시스템과-다른점">기본설명 및 기존 메세징 시스템과 다른점&lt;/h2>
&lt;ul>
&lt;li>메세징 큐의 일종&lt;/li>
&lt;li>말 그대로 &lt;code>분산형 스트리밍 플랫폼&lt;/code>, LinkedIn에서 여러 구직 + 채용 정보들을 한곳에서 처리(발행/구독)할수 있는 플랫폼으로 개발이 시작&lt;/li>
&lt;li>대용량의 실시간 로그 처리에 특화되어 설계된 메시징 시스템, 기존 범용 메시징 시스템대비 TPS가 매우 우수&lt;/li>
&lt;li>메시지를 기본적으로 메모리에 저장하는 기존 메시징 시스템과는 달리 메시지를 파일 시스템에 저장 → 카프카 재시작으로 인한 메세지 유실 우려 감소&lt;/li>
&lt;li>기존의 메시징 시스템에서는 broker가 consumer에게 메시지를 push해 주는 방식인데 반해, Kafka는 consumer가 broker로부터 직접 메시지를 가지고 가는 pull 방식으로 동작하기 때문에 consumer는 자신의 처리능력만큼의 메시지만 broker로부터 가져오기 때문에 최적의 성능을 낼 수 있다.&lt;/li>
&lt;/ul>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/what-is-kafka/kafka2.png" title="/images/what-is-kafka/kafka2.png" data-thumbnail="/images/what-is-kafka/kafka2.png">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/what-is-kafka/kafka2.png"
 data-srcset="https://taetaetae.github.io/images/what-is-kafka/kafka2.png, https://taetaetae.github.io/images/what-is-kafka/kafka2.png 1.5x, https://taetaetae.github.io/images/what-is-kafka/kafka2.png 2x"
 data-sizes="auto"
 alt="/images/what-is-kafka/kafka2.png" />
 &lt;/a>
&lt;h2 id="카프카-주요-개념">카프카 주요 개념&lt;/h2>
&lt;ul>
&lt;li>producer : 메세지 생산(발행)자.&lt;/li>
&lt;li>consumer : 메세지 소비자
&lt;ul>
&lt;li>consumer group : consumer 들끼리 메세지를 나눠서 가져간다.offset 을 공유하여 중복으로 가져가지 않는다.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>broker : 카프카 서버를 가리킴&lt;/li>
&lt;li>zookeeper : 카프카 서버 (+클러스터) 상태를 관리하고&lt;/li>
&lt;li>cluster : 브로커들의 묶음&lt;/li>
&lt;li>topic : 메세지 종류&lt;/li>
&lt;li>partitions : topic 이 나눠지는 단위&lt;/li>
&lt;li>Log : 1개의 메세지&lt;/li>
&lt;li>offset : 파티션 내에서 각 메시지가 가지는 unique id&lt;/li>
&lt;/ul>
&lt;h2 id="카프카는-어떤식으로-돌아가는가">카프카는 어떤식으로 돌아가는가&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>zookeeper 가 kafka 의 상태와 클러스터 관리를 해준다.
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/what-is-kafka/kafka#.png" title="/images/what-is-kafka/kafka3.png" data-thumbnail="/images/what-is-kafka/kafka3.png">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/what-is-kafka/kafka3.png"
 data-srcset="https://taetaetae.github.io/images/what-is-kafka/kafka3.png, https://taetaetae.github.io/images/what-is-kafka/kafka3.png 1.5x, https://taetaetae.github.io/images/what-is-kafka/kafka#.png 2x"
 data-sizes="auto"
 alt="/images/what-is-kafka/kafka3.png" />
 &lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>정해진 topic 에 producer 가 메세지를 발행해놓으면 consumer 가 필요할때 해당 메세지를 가져간다. (여기서 카프카로 발행된 메세지들은 consumer가 메세지를 소비한다고 해서 없어지는게 아니라 카프카 설정&lt;code> log.retention.hours(default : 168[7일])&lt;/code>에 의해 삭제된다.)&lt;/p>
&lt;/li>
&lt;/ul>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/what-is-kafka/kafka4.png" title="/images/what-is-kafka/kafka4.png" data-thumbnail="/images/what-is-kafka/kafka4.png">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/what-is-kafka/kafka4.png"
 data-srcset="https://taetaetae.github.io/images/what-is-kafka/kafka4.png, https://taetaetae.github.io/images/what-is-kafka/kafka4.png 1.5x, https://taetaetae.github.io/images/what-is-kafka/kafka4.png 2x"
 data-sizes="auto"
 alt="/images/what-is-kafka/kafka4.png" />
 &lt;/a>
&lt;ul>
&lt;li>partition 개수와 consumer group 개념&lt;/li>
&lt;/ul>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/what-is-kafka/kafka5.png" title="/images/what-is-kafka/kafka5.png" data-thumbnail="/images/what-is-kafka/kafka5.png">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/what-is-kafka/kafka5.png"
 data-srcset="https://taetaetae.github.io/images/what-is-kafka/kafka5.png, https://taetaetae.github.io/images/what-is-kafka/kafka5.png 1.5x, https://taetaetae.github.io/images/what-is-kafka/kafka5.png 2x"
 data-sizes="auto"
 alt="/images/what-is-kafka/kafka5.png" />
 &lt;/a>
&lt;ul>
&lt;li>하얀색(consumer-01) : 파티션 개수가 4개인데 비해 컨슈머가 3개, 이렇게 되면 어느 컨슈머가 두개의 파티션을 담당해야하는 상황이 생긴다.&lt;/li>
&lt;li>주황색(consumer-02) : 파티션 개수가 4개인데 비해 컨슈머가 5개, 이렇게 되면 하나의 노는(?) 컨슈머가 생기는 상황이 생긴다.&lt;/li>
&lt;li>가장 적절한 개수는 정해지지 않았지만 통상 컨슈머그룹의 컨슈머 개수와 파티션 개수를 동일하게 가져가곤 한다.&lt;/li>
&lt;/ul>
&lt;h2 id="참고-url">참고 url&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="http://kafka.apache.org/" target="_blank" rel="noopener noreffer ">http://kafka.apache.org/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.popit.kr/author/peter5236/" target="_blank" rel="noopener noreffer ">http://www.popit.kr/author/peter5236/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://jinhokwon.tistory.com/168" target="_blank" rel="noopener noreffer ">http://jinhokwon.tistory.com/168&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://programist.tistory.com/entry/Apache-Kafka-" target="_blank" rel="noopener noreffer ">http://programist.tistory.com/entry/Apache-Kafka-&lt;/a>클러스터링-구축-및-테스트&lt;/li>
&lt;li>&lt;a href="https://www.elastic.co/kr/blog/just-enough-kafka-for-the-elastic-stack-part1" target="_blank" rel="noopener noreffer ">https://www.elastic.co/kr/blog/just-enough-kafka-for-the-elastic-stack-part1&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.slideshare.net/springloops/apache-kafka-intro20150313springloops-46067669" target="_blank" rel="noopener noreffer ">https://www.slideshare.net/springloops/apache-kafka-intro20150313springloops-46067669&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Deview-2017 Day1 리뷰</title><link>https://taetaetae.github.io/2017/10/16/deview-2017-review/</link><pubDate>Mon, 16 Oct 2017 17:29:55 +0000</pubDate><guid>https://taetaetae.github.io/2017/10/16/deview-2017-review/</guid><description>&lt;p>벌써 10번째 Naver에서 주최하는 Deview. 올해도 어김없이 참석을 하게 되었고, 이번엔 보고 듣고 느꼈던 부분들을 조금이라도 간직하고 싶은 마음에 바로 블로깅을 하려고 한다. (오랜만에 블로깅이긴 하지만&amp;hellip;)&lt;!-- more -->
항상 Deview에 올때마다 느끼는 부분인데 &lt;code>이번참석이 3번째 되는듯 하다&lt;/code> 세상은 좁고 능력자는 많으며 내가 한번쯤 본것들은 이미 지나간 기술들이라는것, 더불어 단상위에 올라가 발표하는 사람들도 예전엔 나와 똑같이 발표를 듣는 일반 사람이였다는것. 이번에도 많은 생각을 하게 되었다. 구구절절 개인적으로 느낀점을 적는것에 앞서 강한 기억이 남았던 몇몇 세션들에 대해서 간략하게 리뷰를 먼저 하는게 맞는 순서같다.&lt;/p>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/deview-2017-review/10th.jpg" title="" data-thumbnail="">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src=""
 data-srcset=", 1.5x, /images/deview-2017-review/10th.jpg 2x"
 data-sizes="auto"
 alt="" />
 &lt;/a>
&lt;h2 id="책-읽어주는-딥러닝--김태훈--데브시스터즈-">책 읽어주는 딥러닝 ( 김태훈 / 데브시스터즈 )&lt;/h2>
&lt;p>&lt;a href="https://www.slideshare.net/carpedm20/deview-2017-80824162" target="_blank" rel="noopener noreffer ">슬라이드 자료&lt;/a>&lt;/p>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/deview-2017-review/session_1.jpg" title="" data-thumbnail="">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src=""
 data-srcset=", 1.5x, /images/deview-2017-review/session_1.jpg 2x"
 data-sizes="auto"
 alt="" />
 &lt;/a>
&lt;p>네이버에서 유인나의 목소리로 책을 읽어주는것을 보고 흥미를 얻어 개발하기 시작했다고 한다.
음성합성은 데이터가 많아야 머신러닝이나 딥러닝 기술을 접목시키는데 도움이 되는데 &lt;code>박근혜 전 대통령&lt;/code>, &lt;code>문재인 대통령&lt;/code>, &lt;code>손석희 아나운서&lt;/code>의 영상에서 데이터를 추출하여 문장별로 텍스트-음성을 맞추고(pair) 머신러닝 + 딥러닝 기술을 이용해서 만들수 있었다고 한다. 추후 누구나 사용할 수 있도록 파이썬 모듈로 제공한다고 하니, 감사할 따름이다.
사실 머신러닝에 관심&lt;code>만&lt;/code>있었지 이렇다할 공부나 직접 구현은 단한번도 안해보고 해당 세션을 들어보니 그냥 &lt;code>우와 신기하다&lt;/code>정도였는데. 이번기회에 작은것부터 하나씩 시작하면서 요즈음 핫한(?) 트랜드를 따라가는 것도 괜찮은 방법같아 보인다. (앗, 우선 파이썬부터&amp;hellip;)&lt;/p>
&lt;h2 id="그런-rest-api로-괜찮은가--이응준--비바리퍼블리카-">그런 REST API로 괜찮은가 ( 이응준 / 비바리퍼블리카 )&lt;/h2>
&lt;p>&lt;a href="http://slides.com/eungjun/rest" target="_blank" rel="noopener noreffer ">슬라이드 자료&lt;/a>&lt;/p>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/deview-2017-review/session_2.jpg" title="" data-thumbnail="">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src=""
 data-srcset=", 1.5x, /images/deview-2017-review/session_2.jpg 2x"
 data-sizes="auto"
 alt="" />
 &lt;/a>
&lt;p>발표자분을 어디서 많이 봤다 했더니만 예전에 우리 회사 사람이였다. 수업도 들어봤고, 같이 알고리즘 스터디도 했고(한번 나갔지만&amp;hellip;). 발표 첫 부분에 자신이 10년전에 데뷰 staff 를 시작했는데 10년을 다 못채우고 퇴사를 했다고 ㅎㅎ.. 아무튼 개인적으로 나름 반가운 분이라 더 관심갖고 듣게 되었다.
&lt;code>REST 가 무엇인가?&lt;/code>에 대한 발표다. 결론부터 말하자면 아래 3가지중 하나를 사용하면 될것이라고 한다.&lt;/p>
&lt;ul>
&lt;li>REST API 를 구현하고 REST API라고 부른다.&lt;/li>
&lt;li>REST API 구현을 포기하고 HTTP API 라고 부른다.&lt;/li>
&lt;li>REST API 가 아니지만 REST API 라고 부른다. (현재 대부분의 API들의 상태)&lt;/li>
&lt;/ul>
&lt;p>REST API를 구성하는 스타일중 눈여겨 볼만한 부분은 크게 두가지가 있다고 한다. &lt;code>(uniform interface)&lt;/code>&lt;/p>
&lt;ul>
&lt;li>self-descriptive messages : 메시지는 스스로 설명이 되어야 한다.&lt;/li>
&lt;li>hypermedia as the engine of application state (HATEOAS) : 전이(상태의 이동)가 될수있는 정보가 있어야 한다.&lt;/li>
&lt;/ul>
&lt;p>정리를 해보면 &lt;code>REST API로 만들려면 제대로 알고 만들어라&lt;/code> 라는 메시지가 강한 발표내용같다. 나도 이제까지는 그냥 json 으로 내려준다는 것, GETㆍPOST 등 HTTP Method 사용하는 것으로만 알고있었는데 개인적으로는 발표자분이 말씀하신 두가지 내용은 지키는게 맞다고 생각한다. 즉, 정말 REST 하게 만들꺼면 정확한 사용법을 알고 만드는게 좋아보인다.&lt;/p>
&lt;h2 id="동네-커피샵도-사이렌오더를-쓸-수-있을까--허형-나동진--삼성전자lunch-class-">동네 커피샵도 사이렌오더를 쓸 수 있을까? ( 허형, 나동진 / 삼성전자[Lunch class] )&lt;/h2>
&lt;p>&lt;a href="https://www.slideshare.net/deview/123-80843907" target="_blank" rel="noopener noreffer ">슬라이드 자료&lt;/a>&lt;/p>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/deview-2017-review/session_3.jpg" title="" data-thumbnail="">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src=""
 data-srcset=", 1.5x, /images/deview-2017-review/session_3.jpg 2x"
 data-sizes="auto"
 alt="" />
 &lt;/a>
&lt;p>오늘 발표중에 가장 들어보고 싶었던 세션. 예전부터 사이렌오더가 어떤식으로 동작하는지 + 우리회사 커피숍도 사내 앱을 활용해서 만들어 볼순 없을지(아이디어) 이런저런 생각이 많았었는데 딱! 원하던 발표가 있어 듣게 되었다.
삼성전자 소속이신 분들이 따로 그룹을 만들어 진행하면서 만난 부분들을 발표해주셨는데 신기한 기술들이 많아 듣는 내내 흥미진진 했다.&lt;/p>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/deview-2017-review/session_3_1.jpg" title="" data-thumbnail="">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src=""
 data-srcset=", 1.5x, /images/deview-2017-review/session_3_1.jpg 2x"
 data-sizes="auto"
 alt="" />
 &lt;/a>
&lt;ul>
&lt;li>PWA(Progressive Web App) : PWA 로 모바일 청첩장을 만들었다고 한다. (결혼식 전날입니다. 오늘 결혼합니다. 이벤트[추첨]를 진행합니다. 등등..)&lt;/li>
&lt;li>Physical Web(Beacon), NFC &amp;hellip;&lt;/li>
&lt;li>Browser Fingerprint (Device 구분)&lt;/li>
&lt;li>Push Nofification&lt;/li>
&lt;li>Web Payment&lt;/li>
&lt;/ul>
&lt;p>결국 정리를 해보면 동네 커피샵에서 사이렌 오더를 사용하기위해 이러저러한 기술들을 시도해봤다~인데. 각 기술들에 있어 현실적인 상황에 한계점이 있고, 그래서 결국 처음에 이야기 된 &lt;code>동네 커피샵에서 사이렌 오더를 사용&lt;/code>에 대한 결과물이 없어서 아쉬웠다. 엄청 기대했는데 말이다.
하지만 PWA를 이용해서 모바일 청접장을 만든 부분은 정말 찬사를 보내주고 싶은 아이디어 같다.&lt;code>나도 나중에 해야지~&lt;/code>
예전 &amp;ldquo;날씨&amp;quot;라는 웹서비스를 만들면서 &lt;code>웹&lt;/code>이라는 환경에서 기상속보나 갑작스러운 눈/비 알림을 단순히 화면에 뿌려주는것이 아니라 사용자 기기에 노티(푸시)해줄수는 없을까하며 잠깐 본 기술이 PWA 였는데 난 프로토타이핑만 해본 수준이지만 이분들은 실제로 본업과는 별개로 구현을 해보는 노력을 했다는것에 내 자신이 부끄러워 진다.&lt;/p></description></item><item><title>Apache keepAlive</title><link>https://taetaetae.github.io/2017/08/28/apache-keep-alive/</link><pubDate>Mon, 28 Aug 2017 19:56:40 +0000</pubDate><guid>https://taetaetae.github.io/2017/08/28/apache-keep-alive/</guid><description>&lt;p>서버를 운영하다보면 간혹 문제가 발생하곤 한다. 이를테면 메모리가 다른이유없이 올라간다거나, 사용자 입장에서 응답속도가 간헐적으로 느린다거나. 그럴때마다 선배개발자분들께서 가장먼저 입에 오르내리는 단어. &lt;code>keepAlive&lt;/code>.&lt;/p></description></item><item><title>hexo 블로그에 tranquilpeak 테마 적용하기</title><link>https://taetaetae.github.io/2017/08/27/hexo-themes-tranquilpeak/</link><pubDate>Sun, 27 Aug 2017 17:52:56 +0000</pubDate><guid>https://taetaetae.github.io/2017/08/27/hexo-themes-tranquilpeak/</guid><description>&lt;p>여러가지 hexo 테마중에 그나마(?) 영어로 된 문서가 있어서 적용해보게 된 tranquilpeak 라는 테마. 오늘은 해당 테마를 적용하면서 겪은 문제, 그리고 적용 방법에 대해서 간략하게나마 정리해보고자 한다. (다른 테마들은 거의다 중국쪽이나 일본&amp;hellip;)&lt;!-- more -->
먼저 hexo 공식사이트에서 알려주는 테마들은 다음 사이트에서 확인해 볼수 있다.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://hexo.io/themes/index.html" target="_blank" rel="noopener noreffer ">https://hexo.io/themes/index.html&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>기존에는 &lt;code>hueman&lt;/code>이라는 테마를 사용하고 있었는데 (&lt;a href="https://github.com/ppoffice/hexo-theme-hueman" target="_blank" rel="noopener noreffer ">링크&lt;/a>), 오랜만에 블로그를 다시(?) 시작하는 느낌을 내보고 싶었고 보다 더 심플하고 유행에 안탈것 같은(순전히 필자 생각) 테마를 찾아보다 &lt;code>tranquilpeak&lt;/code>이라는 테마를 선택하게 되었다.&lt;/p>
&lt;ul>
&lt;li>공식홈페이지 : &lt;a href="https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak" target="_blank" rel="noopener noreffer ">https://github.com/LouisBarranqueiro/hexo-theme-tranquilpeak&lt;/a>&lt;/li>
&lt;li>샘플사이트 : &lt;a href="http://louisbarranqueiro.github.io/hexo-theme-tranquilpeak/" target="_blank" rel="noopener noreffer ">http://louisbarranqueiro.github.io/hexo-theme-tranquilpeak/&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>우선 간략하게 설치과정을 나열해보면 다음과 같다.&lt;/p>
&lt;ol>
&lt;li>themes 폴더내에 테마파일을 받은후 압축 해제&lt;/li>
&lt;li>테마 폴더 이름을 변경&lt;/li>
&lt;li>_config.yml 파일 내에 테마 설정 부분 변경 ( theme: tranquilpeak )&lt;/li>
&lt;li>hexo clean → hexo generate → hexo server(or hexo deploy)&lt;/li>
&lt;/ol>
&lt;p>이렇게 하면 아주 간단하게 테마가 변경이 된다. 혹여나(필자처럼) 기존 테마를 커스터마이징 하고 싶을 경우는 별도의 과정이 추가로 필요하다. 기존에는 css나 js만 변경하면 간단히 수정되었는데 이 테마는 약간의 빌드(?)를 필요로 한다. 따라서 css나 js등 html 요소들을 수정하였다면 다음과 같은 과정이 필요하다.(테마폴더 최상위에서)&lt;/p>
&lt;ol>
&lt;li>npm install&lt;/li>
&lt;li>bower install&lt;/li>
&lt;li>css 나 js 변경&lt;/li>
&lt;li>grunt build&lt;/li>
&lt;li>hexo clean → hexo generate → hexo server(or hexo deploy)&lt;/li>
&lt;/ol>
&lt;p>나같은 경우는 테마에 적용된 폰트를 바꾸기 위해 &lt;a href="http://blog.lattecom.xyz/2016/05/08/tranquilpeak-theme-web-font" target="_blank" rel="noopener noreffer ">블로그&lt;/a> 를 참조하였다. (해당 아티클에다 댓글폭탄을 ㅎㅎ;;)&lt;/p></description></item><item><title>다시 시작하자</title><link>https://taetaetae.github.io/2017/07/09/refresh/</link><pubDate>Sun, 09 Jul 2017 17:16:23 +0000</pubDate><guid>https://taetaetae.github.io/2017/07/09/refresh/</guid><description>&lt;p>마지막 포스팅을 한지 벌써 3개월이 지났다. 그렇게 바빴던것도 아니고 블로그포스팅을 할 시간이 안난것도 아닌데 어느덧 다시 정신차리고 블로그를 포스팅 하려고보니 3개월이라는 시간이 흘러버렸네&lt;!-- more -->
챗바퀴같은 일상, 느즈막히 일어나서 회사출근하고 정신없이 일하다가 퇴근, 그리고 늦게까지 잠못이루다 또 다음날이면 느즈막히 일어나고&amp;hellip; 뭔가 변화가 필요하다.&lt;/p>
&lt;ul>
&lt;li>매일 일기쓰기 : 일기라고 해봤자 거창한건 아니고 딱 3개월만 써보자. 오늘 뭐했는지. 자기전에 딱 10분이면 좋을듯&lt;/li>
&lt;li>아침에 일찍 일어나기 : 월수금 수영에 화목 배드민턴. 주말에도 일찍일어나고. 일찍일어나면 먹이도 더 먹는다고 하지 않았던가&lt;/li>
&lt;li>달력활용하기 : 운동하는것도 그렇지만, 달력을 자주 보면서 빼먹지 말아야 할 중요한 날들은 반드시 메모하고 기억하자&lt;/li>
&lt;li>기타 : 책좀 많이 읽고 운동도 꾸준히 해야겠다. 물론 기술블로그 포스팅도 잊지말고.&lt;/li>
&lt;/ul>
&lt;p>첫술에 배부르랴. 하나둘씩 퍼즐 맞춰나가듯 해보다보면 내 자신이 바뀌어 있겠지.&lt;/p></description></item><item><title>mybatis insert/update 쿼리실행후 결과 가져오기</title><link>https://taetaetae.github.io/2017/04/04/mybatis-use-generated-keys/</link><pubDate>Tue, 04 Apr 2017 11:41:28 +0000</pubDate><guid>https://taetaetae.github.io/2017/04/04/mybatis-use-generated-keys/</guid><description>&lt;p>&lt;code>Select&lt;/code>문이 아닌 다른 &lt;code>SQL Query&lt;/code>(insert, update 등) 를 실행하고서 결과를 봐야하는 상황이 생긴다. 정확히 잘 수행되었나에 대한 확인. 어떻게 쿼리가 잘 수행되었나를 확인하는 방법은 다음과 같다.
※ 참고 url : &lt;a href="http://www.mybatis.org/mybatis-3/ko/sqlmap-xml.html" target="_blank" rel="noopener noreffer ">http://www.mybatis.org/mybatis-3/ko/sqlmap-xml.html&lt;/a>&lt;/p>
&lt;h2 id="usegeneratedkeys-keyproperty-옵션">useGeneratedKeys, keyProperty 옵션&lt;/h2>
&lt;p>사용하는 데이터베이스가 자동생성키를 지원한다면(mySql 같은) 해당옵션을 이용해 결과를 리턴 받을수 있다.
예로들어 파라미터로 아래 모델객체를 넘긴다고 가정하고&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Student&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">email&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">Date&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">regist_date&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>아래 mybatis 구문으로 insert를 시도하게되면, 파라미터로 넘긴 Student 객체의 id값에 insert 했을때의 key값(id)이 들어오게 된다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Student&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">student&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">new&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Student&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">student&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">setName&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="err">&amp;#39;&lt;/span>&lt;span class="n">bla&lt;/span>&lt;span class="err">&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">student&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">setEmail&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="err">&amp;#39;&lt;/span>&lt;span class="n">bla&lt;/span>&lt;span class="nd">@naver.com&lt;/span>&lt;span class="err">&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">mapper&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">insertStudents&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">student&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// 쿼리실행&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">student&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">getId&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// 추출 가능&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;insert&lt;/span> &lt;span class="na">id=&lt;/span>&lt;span class="s">&amp;#34;insertStudents&amp;#34;&lt;/span> &lt;span class="na">useGeneratedKeys=&lt;/span>&lt;span class="s">&amp;#34;true&amp;#34;&lt;/span> &lt;span class="na">keyProperty=&lt;/span>&lt;span class="s">&amp;#34;id&amp;#34;&lt;/span> &lt;span class="na">parameterType=&lt;/span>&lt;span class="s">&amp;#34;Student&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> insert into Students ( name, email )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> values ( #{name}, #{email} )
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/insert&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="selectkey-옵션">selectKey 옵션&lt;/h2>
&lt;p>Oracle 같은 경우는 Auto Increment 가 없고 Sequence를 사용해야만 하기 때문에 위 옵션을 사용할수가 없다. 하지만 다른 우회적인(?) 방법으로 위와같은 효과를 볼수가 있다.
파라미터의 모델이나 java구문은 위와 동일하고 xml 쿼리 부분만 아래와 같이 설정해주면 된다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;insert&lt;/span> &lt;span class="na">id=&lt;/span>&lt;span class="s">&amp;#34;insertStudents&amp;#34;&lt;/span> &lt;span class="na">parameterType=&lt;/span>&lt;span class="s">&amp;#34;Student&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;selectKey&lt;/span> &lt;span class="na">keyProperty=&lt;/span>&lt;span class="s">&amp;#34;id&amp;#34;&lt;/span> &lt;span class="na">resultType=&lt;/span>&lt;span class="s">&amp;#34;int&amp;#34;&lt;/span> &lt;span class="na">order=&lt;/span>&lt;span class="s">&amp;#34;BEFORE&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> select SEQ_ID.nexyval FROM DUAL
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/selectKey&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> insert into Students
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (id, name , email)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> values
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (#{id}, #{name}, #{email})
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/insert&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>위와같은 코드에서 쿼리가 실행되기 전에 id값에 Sequence에 의해 값을 셋팅하게 되고, 자동적으로 해당 값을 Student의 id에 set하게 되서 동일한 결과를 볼수가 있다.&lt;/p>
&lt;p>항상 테이블의 key값에만 해당하는것이 아니다. key값과는 전혀 상관없는 값도 &lt;code>selectKey&lt;/code> 구문으로 리턴할수가 있는데 &lt;code>order&lt;/code>옵션을 &lt;code>AFTER&lt;/code>로 주고 리턴하고자 하는 값을 명시해주면 된다.
아래 코드에서는 입력할시 id값을 Sequence에서 가져오는게 아니라 수동으로 넣어주고, 입력했던 id에 맞는 regist_date 값을 리턴받아 위에서처럼 동일하게 값를 가져올수 있다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;insert&lt;/span> &lt;span class="na">id=&lt;/span>&lt;span class="s">&amp;#34;insertStudents&amp;#34;&lt;/span> &lt;span class="na">parameterType=&lt;/span>&lt;span class="s">&amp;#34;Student&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;selectKey&lt;/span> &lt;span class="na">keyProperty=&lt;/span>&lt;span class="s">&amp;#34;regist_date&amp;#34;&lt;/span> &lt;span class="na">resultType=&lt;/span>&lt;span class="s">&amp;#34;java.util.Date&amp;#34;&lt;/span> &lt;span class="na">order=&lt;/span>&lt;span class="s">&amp;#34;AFTER&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> select regist_date FROM students WHERE id = #{id}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/selectKey&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> insert into Students
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (id, name , email, regist_date)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> values
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (#{id}, #{name}, #{email}, syadate)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/insert&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Oracle + Mybatis 환경에서의 Date 다루기</title><link>https://taetaetae.github.io/2017/03/23/oracle-mybatis-date/</link><pubDate>Thu, 23 Mar 2017 11:16:05 +0000</pubDate><guid>https://taetaetae.github.io/2017/03/23/oracle-mybatis-date/</guid><description>&lt;h2 id="상황">상황&lt;/h2>
&lt;ul>
&lt;li>Oracle, Java 8, mybatis3 환경&lt;/li>
&lt;li>Date컬럼에 데이터가 있는데 이를 select query로 조회하여 Model에 바인딩 시키고자 함.&lt;/li>
&lt;/ul>
&lt;!-- more -->
&lt;ul>
&lt;li>쿼리에 아무 기능을 추가하지 않고 Date 형태로 Model에 바인딩을 하면 시분초가 없어진 &lt;code>2017-01-01 00:00:00&lt;/code> 형태로 남게됨&lt;/li>
&lt;li>그래서 아래처럼 쿼리 작성할 때마다 TO_CHAR를 사용해서 포맷에 맞추어 형변환을 시키고 Date 또는 String으로 Model에 바인딩 하곤 했음.&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">SELECT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">TO_CHAR&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">reg_ymdt&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH24:MI:SS&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">registDate&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>이렇게 하다보니 query 만들때마다 형변환하는 쿼리를 만들어줘야하고, 자칫 포맷형식을 다르게 적으면 엉뚱한 결과를 초래하거나, Date형을 그대로 받아 사용해야하는 상황에서는 다시 형변환하는 과정(&lt;code>String to Date&lt;/code>)을 해줘야만 함. .. &lt;code>귀차니즘의 시작 : 삽질&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="1-삽질의-시작">1. 삽질의 시작&lt;/h2>
&lt;h3 id="1-1-오라클의-date형--javasqldate-의-경우">1-1. &lt;code>오라클의 DATE형&lt;/code> → &lt;code>java.sql.Date&lt;/code> 의 경우&lt;/h3>
&lt;ul>
&lt;li>mybatis에서는 자동적으로 &lt;code>org.apache.ibatis.type.SqlDateTypeHandler&lt;/code>를 호출하게됨 &lt;a href="http://www.mybatis.org/mybatis-3/ko/configuration.html#typeHandlers" target="_blank" rel="noopener noreffer ">mybatis 3 문서 참고&lt;/a>&lt;/li>
&lt;li>해당 핸들러의 내부 데이터 변환 코드는 다음과 같음&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@Override&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Date&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">getNullableResult&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ResultSet&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rs&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">columnName&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">throws&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SQLException&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">	&lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rs&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">getDate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">columnName&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>java.sql.ResultSet.getDate()&lt;/code>메소드를 호출하면 실제 &amp;lsquo;yyyy-mm-dd&amp;rsquo; 만 가져와 리턴하게됨 (여기서 디버깅 해보면 rs.getTimestamp(columnName)값은 시분초까지 다 들어가 있음)&lt;/li>
&lt;li>따라서 시간값이 없는 &lt;code>yyyy-mm-dd&lt;/code> 형태로 리턴이 됨&lt;/li>
&lt;/ul>
&lt;h3 id="1-2-오라클의-date형--javautildate-의-경우">1-2. &lt;code>오라클의 DATE형&lt;/code> → &lt;code>java.util.Date&lt;/code> 의 경우&lt;/h3>
&lt;ul>
&lt;li>mybatis에서는 자동적으로 &lt;code>org.apache.ibatis.type.DateOnlyTypeHandler&lt;/code>를 호출하게됨 &lt;a href="http://www.mybatis.org/mybatis-3/ko/configuration.html#typeHandlers" target="_blank" rel="noopener noreffer ">mybatis 3 문서 참고&lt;/a>&lt;/li>
&lt;li>해당 핸들러의 내부 데이터 변환 코드는 다음과 같음&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@Override&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Date&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">getNullableResult&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ResultSet&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rs&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">columnName&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">throws&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SQLException&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">	&lt;/span>&lt;span class="n">java&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">sql&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">Date&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sqlDate&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rs&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">getDate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">columnName&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">	&lt;/span>&lt;span class="k">if&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sqlDate&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">!=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">null&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">		&lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">new&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">java&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">util&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">Date&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sqlDate&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">getTime&lt;/span>&lt;span class="p">());&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">	&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">	&lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">null&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>위의 &lt;code>org.apache.ibatis.type.SqlDateTypeHandler&lt;/code> 변환코드에서 발생한 문제점과 같이 &lt;code>yyyy-mm-dd&lt;/code> 만 가져와서 java.sql.Date 객체를 만들고, 이 정보를 토대로 java.util.Date 객체를 만들게 되는데 앞서 시간값을 뺀 정보로 만들어졌기 때문에 결국 동일하게 &lt;code>yyyy-mm-dd&lt;/code> 형태로 리턴이 됨&lt;/li>
&lt;/ul>
&lt;h2 id="2-삽질완료-해결의-시작">2. 삽질완료, 해결의 시작&lt;/h2>
&lt;ul>
&lt;li>오라클 + mybatis 환경에서 Date타입을 다루기 위해서는 타입핸들러를 명시적으로 만들어줘야 한다는걸 알게됨.&lt;/li>
&lt;/ul>
&lt;h4 id="2-1-오라클의-date형--javasqldate-의-경우">2-1. &lt;code>오라클의 DATE형&lt;/code> → &lt;code>java.sql.Date&lt;/code> 의 경우&lt;/h4>
&lt;ul>
&lt;li>아래처럼 코드를 작성하여 커스텀 핸들러를 만들어 등록을 시켜준다.&lt;/li>
&lt;li>mybatis-config.xml&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;typeHandlers&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nt">&amp;lt;typeHandler&lt;/span> &lt;span class="na">handler=&lt;/span>&lt;span class="s">&amp;#34;com.naver.dbill.admin.common.handler.CustomDateHandler&amp;#34;&lt;/span>&lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/typeHandlers&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>CustomDateHandler.java&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="p">...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kn">import&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">java.sql.Date&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">CustomDateHandler&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">extends&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">BaseTypeHandler&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Date&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">	&lt;/span>&lt;span class="p">...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">	&lt;/span>&lt;span class="nd">@Override&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">	&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Date&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">getNullableResult&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ResultSet&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rs&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">columnName&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">throws&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SQLException&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">		&lt;/span>&lt;span class="n">Timestamp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sqlTimestamp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">rs&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">getTimestamp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">columnName&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">		&lt;/span>&lt;span class="k">if&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sqlTimestamp&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">!=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">null&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">			&lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">new&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Date&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sqlTimestamp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">getTime&lt;/span>&lt;span class="p">());&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">		&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">		&lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">null&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">	&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">	&lt;/span>&lt;span class="p">...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>위 코드를 작성하고 실행해보면 정상적으로 시분초 값이 있는 완전한 Date 형태를 볼수 있다.&lt;/li>
&lt;/ul>
&lt;h4 id="2-2-오라클의-date형--javautildate-의-경우">2-2. &lt;code>오라클의 DATE형&lt;/code> → &lt;code>java.util.Date&lt;/code> 의 경우&lt;/h4>
&lt;ul>
&lt;li>아래처럼 코드를 작성하여 커스텀 핸들러를 만들어 등록을 시켜준다.&lt;/li>
&lt;li>단, &lt;a href="http://www.mybatis.org/mybatis-3/ko/configuration.html#typeHandlers" target="_blank" rel="noopener noreffer ">mybatis 3 문서&lt;/a>를 보면 &lt;code>java.sql.Date&lt;/code> 와는 다르게 기본으로 설정된 typeHandler가 JDBC에 따라 3가지가 있다.&lt;/li>
&lt;li>따라서 작성한 커스텀 핸들러를 적용하기 위해서는 명시적으로 &lt;code>자바타입&lt;/code> 과 &lt;code>JDBC타입&lt;/code> 을 적어줘야 정상적으로 오버라이딩이 되어 해당 핸들러를 사용하게 된다.&lt;/li>
&lt;li>mybatis-config.xml&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;typeHandlers&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="nt">&amp;lt;typeHandler&lt;/span> &lt;span class="na">handler=&lt;/span>&lt;span class="s">&amp;#34;com.naver.dbill.admin.common.handler.CustomDateHandler&amp;#34;&lt;/span> &lt;span class="na">javaType=&lt;/span>&lt;span class="s">&amp;#34;java.util.Date&amp;#34;&lt;/span> &lt;span class="na">jdbcType=&lt;/span>&lt;span class="s">&amp;#34;DATE&amp;#34;&lt;/span>&lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/typeHandlers&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>CustomDateHandler.java 는 위와 동일하다. ( import java.util.Date; 사용으로 변경 )&lt;/li>
&lt;/ul>
&lt;h3 id="삽질하며-알게된-보너스-지식">삽질하며 알게된 보너스 지식&lt;/h3>
&lt;ul>
&lt;li>&lt;code>java.sql.Date&lt;/code> 는 &lt;code>java.util.Date&lt;/code> 을 상속받았다.&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">Date&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">extends&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">java&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">util&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">Date&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>검색을 하다보면 알수있겠지만 &lt;code>java.sql.Date&lt;/code> 는 JDBC등을 이용해서 데이터베이스의 데이터를 사용하는데 적합하고, &lt;code>java.util.Date&lt;/code> 은 보다 범용적인 날짜나 시각정보를 다룰때 적합하다고 한다.&lt;/li>
&lt;li>toString 메소드의 리턴 Format 형태
&lt;ul>
&lt;li>&lt;code>java.sql.Date&lt;/code> : yyyy-mm-dd&lt;/li>
&lt;li>&lt;code>java.util.Date&lt;/code> : EEE MMM dd HH:mm:ss zzz yyyy&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>mybatis 에서 형변환은 &lt;a href="http://www.mybatis.org/mybatis-3/ko/configuration.html#typeHandlers" target="_blank" rel="noopener noreffer ">mybatis 3 문서&lt;/a>에 나와있는 자바타입과 JDBC타입이 일치할 경우에 해당 타입 핸들러를 기본으로 사용하게 된다.&lt;/li>
&lt;/ul>
&lt;h3 id="정상혁-님-조언---작성하신분-">정상혁 님 조언 ( &lt;a href="http://d2.naver.com/helloworld/645609" target="_blank" rel="noopener noreffer ">http://d2.naver.com/helloworld/645609&lt;/a> 작성하신분 )&lt;/h3>
&lt;ul>
&lt;li>Oracle의 JDBC 드라이버가 예상 밖으로 동작하네요. Oracle의 DATE 타입도 문서를 보니 시분초까지 저장하게 되어 있는데, Oracle JDBC 구현체가 DATE 타입의 철학을 오해한게 아닌가하는 생각도 듭니다.&lt;/li>
&lt;li>참고로 java.sql.Date, java.sql.TimeStamp는 잘못된 설계라는 비판이 많습니다.&lt;/li>
&lt;li>저도 Java의 날짜와 시간 API 라는 글에서 아래와 같이 적은 적이 있습니다.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>java.sql.Date 클래스는 상위 클래스인 java.util.Date 클래스와 이름이 같다. 이 클래스를 두고 Java 플랫폼 설계자는 클래스 이름을 지으면서 깜빡 존 듯하다는 조롱까지 나왔다.[24]&lt;/p></description></item><item><title>스프링환경에서의 파라미터 관련 정리</title><link>https://taetaetae.github.io/2017/03/12/spring-parameter/</link><pubDate>Sun, 12 Mar 2017 18:03:01 +0000</pubDate><guid>https://taetaetae.github.io/2017/03/12/spring-parameter/</guid><description>&lt;p>일반적인 웹 프로젝트 구성에서는 &lt;code>Controller&lt;/code>레벨에서 응답을 받고 비지니스 로직을 처리 후에 다시 &lt;code>View&lt;/code>레벨로 넘어가는게 통상적인 흐름이다. 이 부분에서 파라미터 관련한 여러가지 부분에 대해 정리해보고자 한다.&lt;/p>
&lt;!-- more -->
&lt;h2 id="httpservletrequestgetparameter">httpServletRequest.getParameter()&lt;/h2>
&lt;p>아래소스처럼 &lt;code>HttpServletRequest&lt;/code>의 getParameter() 메서드를 이용하여 파라미터값을 가져올 수 있다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@RequestMapping&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;/&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">home&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">HttpServletRequest&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">httpServletRequest&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">httpServletRequest&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">getParameter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;home&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="requestparam">@RequestParam&lt;/h2>
&lt;p>또다른 방법으로는 &lt;code>@RequestParam&lt;/code> 어노테이션을 이용하면 간단하게 파라미터값을 가져올수 있다. 우선, 해당 어노테이션의 옵션값들에 대해 간략하게 확인하고 넘어가는게 좋을듯 싶다. &lt;a href="https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestParam.html" target="_blank" rel="noopener noreffer ">API문서 4.3.6 기준&lt;/a>&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>이름&lt;/th>
 &lt;th>타입&lt;/th>
 &lt;th>설명&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>name, value (Alias for name)&lt;/td>
 &lt;td>String&lt;/td>
 &lt;td>파라미터 이름&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>required&lt;/td>
 &lt;td>boolean&lt;/td>
 &lt;td>해당 파라미터가 반드시 필수인지 여부, 기본값은 true&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>defaultValue&lt;/td>
 &lt;td>String&lt;/td>
 &lt;td>해당 파라미터의 기본값&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>위 옵션값들을 조합하여 컨트롤러 메소드에 적용해보면 아래 소스와 같이 만들어지고, 이렇게 reqeust에서 파라미터값을 가져올수 있다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@RequestMapping&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;/&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">home&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nd">@RequestParam&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">defaultValue&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;false&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;home&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>이 어노테이션을 이용하게되면 자칫 잘못하다간 에러를 만날수가 있는데 &lt;code>required&lt;/code>값을 true로 해놓고 (필수 파라미터 설정) 해당 파라미터를 사용하지 않고 요청을 보내게 되면 HTTP 400 에러를 받게 되니 각 옵션들을 정확히 확인하고 사용해야 할 것 같다.
물론 컨트롤러의 메소드에서 해당 어노테이션을 사용하지 않고도 아래 코드처럼 바로 받을수 있다. 이렇게 바로 받을 경우는 필수 파라미터값이 false로 설정이 되고 변수명과 동일한 파라미터만 받을수 있게 되며 기본값 설정을 할수는 없다. 방법의 차이라서 상황에 따라 맞춰 사용하면 될듯 하다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@RequestMapping&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;/&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">home&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;home&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="requestbody">@RequestBody&lt;/h2>
&lt;p>&lt;code>@RequestBody&lt;/code>어노테이션을 사용할 경우 반드시 POST형식으로 응답을 받는 구조여야만 한다. 이를테면 JSON 이나 XML같은 데이터를 적절한 messageConverter로 읽을때 사용하거나, POJO형태의 데이터 전체로 받을경우에 사용된다. 단, 이 어노테이션을 사용하여 파라미터를 받을 경우 별도의 추가 설정(POJO 의 get/set 이나 json/xml 등의 messageConverter 등)을 해줘야 적절하게 데이터를 받을수가 있다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@PostMapping&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;/&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">home&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nd">@ReqeustBody&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Student&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">student&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;home&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="modelattribute">@ModelAttribute&lt;/h2>
&lt;p>&lt;code>@RequestParam&lt;/code>과 비슷한데 1:1로 파라미터를 받을경우는 &lt;code>@RequestParam&lt;/code>를 사용하고, 도메인이나 오브젝트로 파라미터를 받을 경우는 &lt;code>@ModelAttribute&lt;/code>으로 받을수 있다. 또한 이 어노테이션을 사용하면 검증(Validation)작업을 추가로 할수 있는데 예로들어 null이라던지, 각 멤버변수마다 valid옵션을 줄수가 있고 여기서 에러가 날 경우 BindException 이 발생한다.&lt;/p>
&lt;h2 id="spring-command-객체">Spring command 객체&lt;/h2>
&lt;p>컨트롤러에서 파라미터로 받은 정보에 대해서는 view 에서 바로 사용이 가능하다. 예로 들어 아래그림처럼 이렇게 컨트롤러가 구성되어있고&lt;/p>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/spring-parameter/spring-parameter-1.jpg" title="/images/spring-parameter/spring-parameter-1.jpg" data-thumbnail="/images/spring-parameter/spring-parameter-1.jpg">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/spring-parameter/spring-parameter-1.jpg"
 data-srcset="https://taetaetae.github.io/images/spring-parameter/spring-parameter-1.jpg, https://taetaetae.github.io/images/spring-parameter/spring-parameter-1.jpg 1.5x, https://taetaetae.github.io/images/spring-parameter/spring-parameter-1.jpg 2x"
 data-sizes="auto"
 alt="/images/spring-parameter/spring-parameter-1.jpg" />
 &lt;/a>
&lt;p>이렇게 모델이 구성되어있을때&lt;/p>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/spring-parameter/spring-parameter-2.jpg" title="/images/spring-parameter/spring-parameter-2.jpg" data-thumbnail="/images/spring-parameter/spring-parameter-2.jpg">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/spring-parameter/spring-parameter-2.jpg"
 data-srcset="https://taetaetae.github.io/images/spring-parameter/spring-parameter-2.jpg, https://taetaetae.github.io/images/spring-parameter/spring-parameter-2.jpg 1.5x, https://taetaetae.github.io/images/spring-parameter/spring-parameter-2.jpg 2x"
 data-sizes="auto"
 alt="/images/spring-parameter/spring-parameter-2.jpg" />
 &lt;/a>
&lt;p>view 에서 이런식으로 구성되어있다고 가정해보자.&lt;/p>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/spring-parameter/spring-parameter-3.jpg" title="/images/spring-parameter/spring-parameter-3.jpg" data-thumbnail="/images/spring-parameter/spring-parameter-3.jpg">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/spring-parameter/spring-parameter-3.jpg"
 data-srcset="https://taetaetae.github.io/images/spring-parameter/spring-parameter-3.jpg, https://taetaetae.github.io/images/spring-parameter/spring-parameter-3.jpg 1.5x, https://taetaetae.github.io/images/spring-parameter/spring-parameter-3.jpg 2x"
 data-sizes="auto"
 alt="/images/spring-parameter/spring-parameter-3.jpg" />
 &lt;/a>
&lt;p>이때 &lt;code>/student?name=taetaetae&amp;amp;age=32&amp;amp;address=green-factory&lt;/code>로 호출을 해보면 구지 Model에 값을 셋팅해주지 않아도 다음과 같이 정보를 읽을수 있게 된다.&lt;/p>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/spring-parameter/spring-parameter-4.jpg" title="/images/spring-parameter/spring-parameter-4.jpg" data-thumbnail="/images/spring-parameter/spring-parameter-4.jpg">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/spring-parameter/spring-parameter-4.jpg"
 data-srcset="https://taetaetae.github.io/images/spring-parameter/spring-parameter-4.jpg, https://taetaetae.github.io/images/spring-parameter/spring-parameter-4.jpg 1.5x, https://taetaetae.github.io/images/spring-parameter/spring-parameter-4.jpg 2x"
 data-sizes="auto"
 alt="/images/spring-parameter/spring-parameter-4.jpg" />
 &lt;/a>
&lt;h2 id="마치며">마치며&lt;/h2>
&lt;p>스프링에서 파라미터를 받는 방법은 상당히 다양하다. 이게 정답이다 정의할수 없을정도로. 상황에 따라 맞는 방법으로 파라미터를 받아야 하겠고, 각 방법에 장/단점을 최대한 살려서 좀더 깔끔한 코드를 작성할수 있어야 하겠다.&lt;/p></description></item><item><title>벌써 3월, 다시 일어서야할 때</title><link>https://taetaetae.github.io/2017/03/08/a-quarter-of-this-year/</link><pubDate>Wed, 08 Mar 2017 13:44:21 +0000</pubDate><guid>https://taetaetae.github.io/2017/03/08/a-quarter-of-this-year/</guid><description>&lt;p>벌써 3월이다. 뭐하나 제대로 한것도 없는데 시간은 야속하게도 멈추지 않고 지나가고 있다.
오랜만에 동기형을 만났다. &lt;!-- more -->신입사원이 되기 전 연습생(?)시절 동거동락하며 개발에 대해 고군분투 하던 사이인지라. 오랜만에 만나도 서로 이야기 하고자 하는 주제는 언제나 동일하다. &lt;code>개발자로서의 삶&lt;/code>
이런저런 이야기를 하며 다시 나를 돌아보게 되었다. 내 노력에 의해, 아니면 운이 좋아 지금 다니고있는 회사에 들어온 이후로 예전만큼의 열정은 온데간데 없으며, 그만큼 간절하지도 않고 치열하지도 않는 내 자신이 너무 미안하고 쪽팔릴정도로 한심하기 그지 없었다. 무엇때문일까, 도대체 왜 이렇게 안일해졌고 적극적이지 못하게 되었을까.
그 질문에 대한 정답은 이것이다 라고 정의를 할수는 없겠지만 확실한건, 현재 내 상황에 안주하고 타협하려하는 마음가짐이 생겼다는건 회피할수 없을정도로 나도 정말 많이 변해버린것 같다. 물론 지금 상황이 잘못되었다는건 아니지만 내 직업 특성상 끊임없이 노력하고 도전하며 배워야 하는 상황인데 지금 난 퇴근하고 집에가면 쉬고싶고 자기 바쁘고 다음날 늦잠자고&amp;hellip; 계속된 생활패턴에 젖어 사는것 같다.
일단 독서좀 많이 해야겟다. 회사에, 집에 쌓인 책만 벌써 몇권인지&amp;hellip; 기본이 되는 전공서적 하나 정하고 끝까지 완독해보자. 그게 자바든 스프링이든, 최신 신기술보다 기본이 탄탄해져야 하는건 백번 천번 말해도 당연하기에.&lt;/p>
&lt;p>다시 정신차리자. 오늘 걷지 않으면 내일은 달려야 한다고 누군가 그랬듯..&lt;/p></description></item><item><title>github api 사용방법</title><link>https://taetaetae.github.io/2017/03/02/github-api/</link><pubDate>Thu, 02 Mar 2017 11:18:05 +0000</pubDate><guid>https://taetaetae.github.io/2017/03/02/github-api/</guid><description>&lt;p>github 에서는 레파지토리의 전반적인 상황에 대해 다양한 API를 제공해주고 있다. 이번에는 그 API를 사용하는 방법에 대해 알아보고자 한다.&lt;/p>
&lt;h2 id="personal-access-tokens-발급">Personal access tokens 발급&lt;/h2>
&lt;p>우선 정상적인 API를 사용하기 위해 &lt;code>Personal access tokens&lt;/code>를 발급받아야 한다. github 초기화면 &amp;gt; 우측상단 프로필사진 클릭 &amp;gt; setting &amp;gt; Personal access tokens 에 들어가 토큰을 생성을 한다.
해당 토큰의 허용범위를 설정한뒤 생성을 하면 만들어 지는데 여기서 발급되는 문자열은 따로 보관하는게 좋다. (나중에 다시 확인하려면 새로 재 생성하는 방법말고는 없기 때문에 한번 만들때 메모해 두는게 좋다.)
아래와 같이 생성완료.
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-api/github_access_tokens.png" title="/images/github-api/github_access_tokens.png" data-thumbnail="/images/github-api/github_access_tokens.png">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-api/github_access_tokens.png"
 data-srcset="https://taetaetae.github.io/images/github-api/github_access_tokens.png, https://taetaetae.github.io/images/github-api/github_access_tokens.png 1.5x, https://taetaetae.github.io/images/github-api/github_access_tokens.png 2x"
 data-sizes="auto"
 alt="/images/github-api/github_access_tokens.png" width="80%" />
 &lt;/a>&lt;/p>
&lt;h2 id="api-사용방법">API 사용방법&lt;/h2>
&lt;p>권한이 없는 Repository 의 내용을 확인할수 없듯이 github에서 제공하는 API또한 권한이 있는 Repository에 대해서만 API를 제공한다. 위에서 발급한 token 을 권한 체크할때 사용하는데 다양한 방법이 있을수 있겠으나 나는 간단하게 헤더에 포함시켜서 일반 GET 호출을 하는 방식으로 하였다. 윈도우 환경에서는 헤더 셋팅하고 호출하는게 조금 어려울수 있으니 이러한 부분을 설정할수 있는 &lt;code>Postman&lt;/code>이라는 프로그램으로 호출을 해본다.
아래처럼 url은 &lt;code>https://api.github.com/&lt;/code>으로 설정하고 &lt;code>Headers&lt;/code>파라미터에 &lt;code>Authorization&lt;/code>라는 key에 value를 위에서 발급받았던 token을 이용하여 &lt;code>token abcd~~&lt;/code>식으로 입력해준다음 &lt;code>send&lt;/code>버튼을 눌러주면 응답을 받을수가 있는데, 아래 그림은 제공하는 api의 모든 url을 확인하는 방법이다.&lt;/p>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-api/github_api_call_1.png" title="/images/github-api/github_api_call_1.png" data-thumbnail="/images/github-api/github_api_call_1.png">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-api/github_api_call_1.png"
 data-srcset="https://taetaetae.github.io/images/github-api/github_api_call_1.png, https://taetaetae.github.io/images/github-api/github_api_call_1.png 1.5x, https://taetaetae.github.io/images/github-api/github_api_call_1.png 2x"
 data-sizes="auto"
 alt="/images/github-api/github_api_call_1.png" />
 &lt;/a>
&lt;p>아래애서는 위에서 확인된 api url을 활용하여 내가 권한이 있는 레파지토리 내에서 확인할수있는 정보에 대한 API를 호출해보았다.&lt;/p>
&lt;a class="lightgallery" href="https://taetaetae.github.io/images/github-api/github_api_call_2.png" title="/images/github-api/github_api_call_2.png" data-thumbnail="/images/github-api/github_api_call_2.png">
 &lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/github-api/github_api_call_2.png"
 data-srcset="https://taetaetae.github.io/images/github-api/github_api_call_2.png, https://taetaetae.github.io/images/github-api/github_api_call_2.png 1.5x, https://taetaetae.github.io/images/github-api/github_api_call_2.png 2x"
 data-sizes="auto"
 alt="/images/github-api/github_api_call_2.png" />
 &lt;/a>
&lt;p>API 호출시 가장 보편화되어있는(?) 스팩인 &lt;code>JSON&lt;/code>으로 응답이 내려오기때문에 어떠한 환경에서도 충분히 활용할수 있을것이라 생각한다.
나는 개인적으로 팀 내에서 하나의 &lt;code>Organizations&lt;/code>내에 여러 &lt;code>Repository&lt;/code>가 있는데 각각의 &lt;code>PullRequest&lt;/code>에 대해 코드리뷰를 해야하는 상황에서 일일히 다 찾아보기 귀찮아 github-api를 활용해 open된 &lt;code>PullRequest&lt;/code>가 있으면 알림을 주는 걸 만들어 보았다.&lt;/p></description></item><item><title>리눅스상에서 json 파싱</title><link>https://taetaetae.github.io/2017/02/28/shell-script-json/</link><pubDate>Tue, 28 Feb 2017 17:50:44 +0000</pubDate><guid>https://taetaetae.github.io/2017/02/28/shell-script-json/</guid><description>&lt;p>리눅스 상에서 json형태의 String 을 파싱해야하는 상황이라면 아래 라이브러리를 사용해보는것을 추천해본다.&lt;/p>
&lt;!-- more -->
&lt;h2 id="jq">jq&lt;/h2>
&lt;p>사용방법은 너무너무 간단하다.&lt;/p>
&lt;ul>
&lt;li>자신의 시스템에 맞는 라이브러리를 다운받고&lt;/li>
&lt;/ul>
&lt;pre tabindex="0">&lt;code>(32-bit system)
$ wget http://stedolan.github.io/jq/download/linux32/jq
(64-bit system)
$ wget http://stedolan.github.io/jq/download/linux64/jq
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>실행 권한을 설정해 준 뒤&lt;/li>
&lt;/ul>
&lt;pre tabindex="0">&lt;code>chmod +x ./jq
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>root 권한으로 해당 파일을 이동시킨다.&lt;/li>
&lt;/ul>
&lt;pre tabindex="0">&lt;code>sudo cp jq /usr/bin
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>실행은 다음과 같이 한다.
Json String 이 아래와 같이 있다고 가정했을때&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Google&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;#34;location&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;street&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;1600 Amphitheatre Parkway&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;city&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Mountain View&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;state&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;California&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;country&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;US&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;#34;employees&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Michael&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;division&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Engineering&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Laura&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;division&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;HR&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Elise&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;division&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Marketing&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>실제 사용과 결과는 다음과 같이 이루어 진다.&lt;/p>
&lt;pre tabindex="0">&lt;code>$ cat json.txt | jq &amp;#39;.name&amp;#39;
&amp;#34;Google&amp;#34;

$ cat json.txt | jq &amp;#39;.location.city&amp;#39;
&amp;#34;Mountain View&amp;#34;

$ cat json.txt | jq &amp;#39;.employees[0].name&amp;#39;
&amp;#34;Michael&amp;#34;

$ cat json.txt | jq &amp;#39;.location | {street, city}&amp;#39;
{
 &amp;#34;city&amp;#34;: &amp;#34;Mountain View&amp;#34;,
 &amp;#34;street&amp;#34;: &amp;#34;1600 Amphitheatre Parkway&amp;#34;
}
&lt;/code>&lt;/pre>&lt;p>보다 자세한 사용방법은 공식홈페이지( &lt;a href="https://stedolan.github.io/jq/" target="_blank" rel="noopener noreffer ">https://stedolan.github.io/jq/&lt;/a> )를 참조하면 좋을듯 하다.&lt;/p></description></item><item><title>eclipse에서 spring-boot로 web 만들기</title><link>https://taetaetae.github.io/2017/02/27/spring-boot-eclipse/</link><pubDate>Mon, 27 Feb 2017 14:37:27 +0000</pubDate><guid>https://taetaetae.github.io/2017/02/27/spring-boot-eclipse/</guid><description>&lt;p>Spring 환경에서 웹 어플리케이션을 만들어야 한다면 pom.xml 에 이런저런 설정들을 적어줘야 했다. 하지만 이런 수고(?)를 덜어줄수 있는 방법중에 한가지가 바로 Spring Boot로 만드는 방법인데, 이클립스 환경에서 만드는 법을 정리하고자 한다.&lt;/p>
&lt;!-- more -->
&lt;h2 id="new--maven-project">new &amp;gt; Maven Project&lt;/h2>
&lt;p>빈 Maven Project 를 만드는 방법은 아주 간단하니 생략하고&amp;hellip; 만들게 되면 pom.xml 은 아래처럼 아주 깔끔한(?)상태로 만들어지게 된다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;project&lt;/span> &lt;span class="na">xmlns=&lt;/span>&lt;span class="s">&amp;#34;http://maven.apache.org/POM/4.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xmlns:xsi=&lt;/span>&lt;span class="s">&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xsi:schemaLocation=&lt;/span>&lt;span class="s">&amp;#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;modelVersion&amp;gt;&lt;/span>4.0.0&lt;span class="nt">&amp;lt;/modelVersion&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;groupId&amp;gt;&lt;/span>com.example&lt;span class="nt">&amp;lt;/groupId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;artifactId&amp;gt;&lt;/span>boot&lt;span class="nt">&amp;lt;/artifactId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;version&amp;gt;&lt;/span>0.0.1-SNAPSHOT&lt;span class="nt">&amp;lt;/version&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/project&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>그러면 이 비어있는 pom.xml 에 Spring-Boot 에 필요한 설정들을 추가해주기로 한다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;parent&amp;gt;&lt;/span> &lt;span class="c">&amp;lt;!--boot의 스타터를 사용하겠다고 명시적으로 설정--&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;groupId&amp;gt;&lt;/span>org.springframework.boot&lt;span class="nt">&amp;lt;/groupId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;artifactId&amp;gt;&lt;/span>spring-boot-starter-parent&lt;span class="nt">&amp;lt;/artifactId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;version&amp;gt;&lt;/span>1.5.1.RELEASE&lt;span class="nt">&amp;lt;/version&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;relativePath&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/parent&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;dependencies&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;dependency&amp;gt;&lt;/span> &lt;span class="c">&amp;lt;!--boot에서 스타터패키지로 제공해주는 것들중에 web 설정 부분 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;groupId&amp;gt;&lt;/span>org.springframework.boot&lt;span class="nt">&amp;lt;/groupId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;artifactId&amp;gt;&lt;/span>spring-boot-starter-web&lt;span class="nt">&amp;lt;/artifactId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/dependency&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/dependencies&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;build&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;plugins&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;plugin&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;groupId&amp;gt;&lt;/span>org.springframework.boot&lt;span class="nt">&amp;lt;/groupId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;artifactId&amp;gt;&lt;/span>spring-boot-maven-plugin&lt;span class="nt">&amp;lt;/artifactId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/plugin&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/plugins&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/build&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>그다음 임의의 java 클래스를 하나 만들고 거기에 아래처럼 설정하면 끝&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@SpringBootApplication&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// @Configuration + @EnableAutoConfiguration + @ComponentScan 들의 종합 어노테이션&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">TestApplication&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">static&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">main&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="o">[]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">throws&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Exception&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">SpringApplication&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TestApplication&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">class&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Spring Boot 에서는 내장WAS를 가지고 있기 때문에 main 메소드에서 우클릭후 &lt;code>run AS → Spring Boot App&lt;/code> 을 선택해주면 8080포트로 띄워지게 된다.&lt;/p>
&lt;h2 id="new--spring-starter-project">new &amp;gt; Spring Starter project&lt;/h2>
&lt;p>(STS가 설치되어있다는 가정하에)이 메뉴를 사용하면 위에서 했던 일련의 설정들을 자동으로 해주게 된다. 간단한 내용이니 next를 해주다 마지막에 &lt;code>Dependencies&lt;/code> 설정하는 부분에서 Web 을 체크해주고 &lt;code>Finish 버튼&lt;/code>을 누르면 끝&lt;/p>
&lt;h2 id="spring-initializr-startspringio">Spring Initializr (start.spring.io)&lt;/h2>
&lt;p>&lt;a href="http://start.spring.io/" target="_blank" rel="noopener noreffer ">http://start.spring.io/&lt;/a> 에 들어가보면 구지 설명하지 않아도 친절하게 Generate 해주는 페이지가 보인다. 여기서 web 을 &lt;code>Dependencies&lt;/code>에 추가하고 Generate를 하면 해당 프로젝트가 압축된 상태로 다운이 받아지게 되고 이를 IDE 에서 열어보면 위에서 했던 일련의 과정들이 설정되어 있는것을 확인해볼수가 있다.&lt;/p>
&lt;h2 id="내장톰켓을-사용안하고-별도-톰켓을-사용해야-하는-경우">내장톰켓을 사용안하고 별도 톰켓을 사용해야 하는 경우&lt;/h2>
&lt;p>Spring boot는 자체적으로 내장 WAS를 가지고 있다. 하지만 관리포인트나 이런저런 이유로 내장톰켓을 사용하지 못하는 환경이라면 다음과 같은 설정을 해주면 된다.&lt;/p>
&lt;ul>
&lt;li>일반적으로 빌드가 되면 &lt;code>jar&lt;/code>로 만들어 질텐데 &lt;code>war&lt;/code>로 빌드 되도록 수정을 해야한다. (was가 WAR를 물고 떠야하기 때문..)&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;packaging&amp;gt;&lt;/span>war&lt;span class="nt">&amp;lt;/packaging&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>dependency 에 tomcat을 추가해준다.&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;dependency&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;groupId&amp;gt;&lt;/span>org.springframework.boot&lt;span class="nt">&amp;lt;/groupId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;artifactId&amp;gt;&lt;/span>spring-boot-starter-tomcat&lt;span class="nt">&amp;lt;/artifactId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;scope&amp;gt;&lt;/span>provided&lt;span class="nt">&amp;lt;/scope&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/dependency&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>아래처럼 main 메소드가 있는 클래스에 &lt;code>SpringBootServletInitializer&lt;/code>를 상속받게 한 후 &lt;code>configure&lt;/code>메소드를 오버라이딩 해준다.&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@SpringBootApplication&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">TestApplication&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">extends&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SpringBootServletInitializer&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Override&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">protected&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">SpringApplicationBuilder&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">configure&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SpringApplicationBuilder&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">builder&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">builder&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">sources&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TestApplication&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">class&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">static&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">main&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="o">[]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">throws&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Exception&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">SpringApplication&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TestApplication&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">class&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>톰켓에 띄우기 위하여 프로젝트 설정(Project Facets)에서 &lt;code>Dynamic Web Module&lt;/code>을 체크해준다.&lt;/li>
&lt;/ul>
&lt;p>참고 URL&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.donnert.net/86" target="_blank" rel="noopener noreffer ">http://www.donnert.net/86&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://opennote46.tistory.com/124" target="_blank" rel="noopener noreffer ">http://opennote46.tistory.com/124&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>lombok(롬복)소개 및 설치</title><link>https://taetaetae.github.io/2017/02/22/lombok/</link><pubDate>Wed, 22 Feb 2017 17:48:42 +0000</pubDate><guid>https://taetaetae.github.io/2017/02/22/lombok/</guid><description>&lt;p>일반적으로 자바개발을 하다보면 &lt;code>Model&lt;/code> 을 만들고 각 멤버변수를 접근할수 있는 (각 요소들이 private 접근권한을 가지고 있을때) method 를 만들게 된다. IDE에서 제공하는 아래처럼&amp;hellip; (윈도우/이클립스 기준)&lt;!-- more -->&lt;/p>
&lt;ul>
&lt;li>get/set 메소드 : &lt;code>Alt&lt;/code> + &lt;code>Shift&lt;/code> + &lt;code>S&lt;/code> + &lt;code>R&lt;/code>&lt;/li>
&lt;li>toString 메소드 : &lt;code>Alt&lt;/code> + &lt;code>Shift&lt;/code> + &lt;code>S&lt;/code> + &lt;code>S&lt;/code>&lt;/li>
&lt;li>기타 등등&amp;hellip;&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">Student&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">private&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">private&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">private&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">grade&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">private&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">department&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">getId&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">setId&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">getName&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">setName&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">getGrade&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">grade&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">setGrade&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">grade&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">grade&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">grade&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">getDepartment&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">department&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">setDepartment&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">department&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">department&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">department&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Override&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">toString&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;Student [id=&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;, name=&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;, grade=&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">grade&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;, department=&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">department&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;]&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w"> 
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>이렇게 하는 방법도 있지만 어노테이션 설정으로 적용할수 있는 간단한 라이브러리를 소개하고자 한다.
바로 &lt;code>lombok&lt;/code>, 공식 홈페이지 : &lt;a href="https://projectlombok.org" target="_blank" rel="noopener noreffer ">https://projectlombok.org&lt;/a>
설치 및 사용방법은 아주 간단하다. 공식 홈페이지에서 jar를 다운받고 실행, 아래처럼 이클립스 실행파일 경로를 설정해준다음에 인스톨을 누르면 된다.
&lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/lombok/lombok.png"
 data-srcset="https://taetaetae.github.io/images/lombok/lombok.png, https://taetaetae.github.io/images/lombok/lombok.png 1.5x, https://taetaetae.github.io/images/lombok/lombok.png 2x"
 data-sizes="auto"
 alt="/images/lombok/lombok.png"
 title="/images/lombok/lombok.png" />
maven 환경에서 dependency를 가져오기 위해서는 당연히 추가설정을 해줘야 한다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;dependency&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;groupId&amp;gt;&lt;/span>org.projectlombok&lt;span class="nt">&amp;lt;/groupId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;artifactId&amp;gt;&lt;/span>lombok&lt;span class="nt">&amp;lt;/artifactId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;version&amp;gt;&lt;/span>1.16.10&lt;span class="nt">&amp;lt;/version&amp;gt;&lt;/span> &lt;span class="c">&amp;lt;!--버전은 그때 맞춰서--&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/dependency&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>실제로 코드상에서 사용방법은 다음과 같다. 정말 간단히, 어노테이션만 적용해주면 끝!&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">lombok.Data&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nd">@Data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">Student&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">private&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">private&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">private&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">grade&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">private&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">department&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>그럼 이렇게 기본적인 method들이 생성된다.
&lt;img
 class="lazyload"
 src="https://taetaetae.github.io/svg/loading.min.svg"
 data-src="https://taetaetae.github.io/images/lombok/lombok-annotation.png"
 data-srcset="https://taetaetae.github.io/images/lombok/lombok-annotation.png, https://taetaetae.github.io/images/lombok/lombok-annotation.png 1.5x, https://taetaetae.github.io/images/lombok/lombok-annotation.png 2x"
 data-sizes="auto"
 alt="/images/lombok/lombok-annotation.png"
 title="/images/lombok/lombok-annotation.png" />
일반적으로 &lt;code>@Data&lt;/code>를 사용하고 상황에 따라 필요한 어노테이션만 지정도 가능하다고 한다.&lt;/p>
&lt;ul>
&lt;li>@Getter and @Setter&lt;/li>
&lt;li>@NonNull&lt;/li>
&lt;li>@ToString&lt;/li>
&lt;li>@EqualsAndHashCode&lt;/li>
&lt;li>@Data&lt;/li>
&lt;li>@Cleanup&lt;/li>
&lt;li>@Synchronized&lt;/li>
&lt;li>@SneakyThrows
참고 URL : &lt;a href="http://jnb.ociweb.com/jnb/jnbJan2010.html" target="_blank" rel="noopener noreffer ">http://jnb.ociweb.com/jnb/jnbJan2010.html&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>logback 설정하기</title><link>https://taetaetae.github.io/2017/02/19/logback/</link><pubDate>Sun, 19 Feb 2017 15:10:45 +0000</pubDate><guid>https://taetaetae.github.io/2017/02/19/logback/</guid><description>&lt;p>자바 개발자라면 한번쯤은 들어봤고, 한번쯤은 사용했을법한 logger 로 &lt;code>log4j&lt;/code>가 있을것이다. 하지만 최근들어 &lt;code>logback&lt;/code>이라는것을 알게되었고, 왜 &lt;code>logback&lt;/code>을 사용해야 하는 이유라는 글이 있을정도로 여러 측면에서 개선이 된듯 하다. &lt;!-- more -->(&lt;a href="https://beyondj2ee.wordpress.com/2012/11/09/logback-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0-reasons-to-prefer-logback-over-log4j" target="_blank" rel="noopener noreffer ">링크&lt;/a>)
이번에 작성할 글의 목적은 &lt;code>logback&lt;/code>을 설정하고 어떻게 사용하는지에 대해 작성해 보고자 한다.
※ 공식사이트 : &lt;a href="https://logback.qos.ch/" target="_blank" rel="noopener noreffer ">https://logback.qos.ch/&lt;/a>&lt;/p>
&lt;h2 id="pomxml">pom.xml&lt;/h2>
&lt;p>maven구조라고 가정했을때 &lt;code>logback Dependency&lt;/code>를 가져오기 위해서는 아래와 같이 pom.xml 에 설정해 주면 된다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;dependency&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;groupId&amp;gt;&lt;/span>ch.qos.logback&lt;span class="nt">&amp;lt;/groupId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;artifactId&amp;gt;&lt;/span>logback-classic&lt;span class="nt">&amp;lt;/artifactId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;version&amp;gt;&lt;/span>1.1.7&lt;span class="nt">&amp;lt;/version&amp;gt;&lt;/span> &lt;span class="c">&amp;lt;!--버전은 상황에 따라 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/dependency&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="로그레벨">로그레벨&lt;/h2>
&lt;p>&lt;code>ERROR&lt;/code>, &lt;code>WARN&lt;/code>, &lt;code>INFO&lt;/code>, &lt;code>DEBUG&lt;/code> or &lt;code>TRACE&lt;/code>&lt;/p>
&lt;h4 id="-logback-설정파일"># logback 설정파일&lt;/h4>
&lt;p>일반적으로 &lt;code>logback.xml&lt;/code> 이라는 이름으로 만들어 &lt;code>src/main/resources/&lt;/code>아래에 위치하게 된다. Spring-Boot 환경에서는 &lt;code>logback-spring.xml&lt;/code> 이라는 이름으로 설정해야 하는데 &lt;code>logback.xml&lt;/code>로 설정하면 스프링부트가 설정하기 전에 로그백 관련한 설정을 하기 때문에 제어할 수가 없게 된다.
( 공식사이트 메뉴얼 : &lt;a href="https://logback.qos.ch/documentation.html" target="_blank" rel="noopener noreffer ">https://logback.qos.ch/documentation.html&lt;/a> )&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;configuration&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;include&lt;/span> &lt;span class="na">resource=&lt;/span>&lt;span class="s">&amp;#34;org/springframework/boot/logging/logback/defaults.xml&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;include&lt;/span> &lt;span class="na">resource=&lt;/span>&lt;span class="s">&amp;#34;org/springframework/boot/logging/logback/console-appender.xml&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span> 
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- 변수 지정 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;property&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;LOG_DIR&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;/logs&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;property&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;LOG_PATH_NAME&amp;#34;&lt;/span> &lt;span class="na">value=&lt;/span>&lt;span class="s">&amp;#34;${LOG_DIR}/data.log&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- FILE Appender --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;appender&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;FILE&amp;#34;&lt;/span> &lt;span class="na">class=&lt;/span>&lt;span class="s">&amp;#34;ch.qos.logback.core.rolling.RollingFileAppender&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;file&amp;gt;&lt;/span>${LOG_PATH_NAME}&lt;span class="nt">&amp;lt;/file&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- 일자별로 로그파일 적용하기 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;rollingPolicy&lt;/span> &lt;span class="na">class=&lt;/span>&lt;span class="s">&amp;#34;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;fileNamePattern&amp;gt;&lt;/span>${LOG_PATH_NAME}.%d{yyyyMMdd}&lt;span class="nt">&amp;lt;/fileNamePattern&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;maxHistory&amp;gt;&lt;/span>60&lt;span class="nt">&amp;lt;/maxHistory&amp;gt;&lt;/span> &lt;span class="c">&amp;lt;!-- 일자별 백업파일의 보관기간 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/rollingPolicy&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;encoder&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;pattern&amp;gt;&lt;/span>%d{yyyy-MM-dd HH:mm:ss} [%-5p] [%F]%M\(%L\) : %m%n&lt;span class="nt">&amp;lt;/pattern&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/encoder&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/appender&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;appender&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;STDOUT&amp;#34;&lt;/span> &lt;span class="na">class=&lt;/span>&lt;span class="s">&amp;#34;ch.qos.logback.core.ConsoleAppender&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;layout&lt;/span> &lt;span class="na">class=&lt;/span>&lt;span class="s">&amp;#34;ch.qos.logback.classic.PatternLayout&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;pattern&amp;gt;&lt;/span>%d{yyyy-MM-dd HH:mm:ss} [%-5p] [%F]%M\(%L\) : %m%n&lt;span class="nt">&amp;lt;/pattern&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/layout&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/appender&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- TRACE &amp;gt; DEBUG &amp;gt; INFO &amp;gt; WARN &amp;gt; ERROR, 대소문자 구분 안함 --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- profile 을 읽어서 appender 을 설정할수 있다.(phase별 파일을 안만들어도 되는 좋은 기능) --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;springProfile&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;local&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;root&lt;/span> &lt;span class="na">level=&lt;/span>&lt;span class="s">&amp;#34;DEBUG&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;appender-ref&lt;/span> &lt;span class="na">ref=&lt;/span>&lt;span class="s">&amp;#34;FILE&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;appender-ref&lt;/span> &lt;span class="na">ref=&lt;/span>&lt;span class="s">&amp;#34;STDOUT&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/root&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/springProfile&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;springProfile&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;real&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;root&lt;/span> &lt;span class="na">level=&lt;/span>&lt;span class="s">&amp;#34;INFO&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;appender-ref&lt;/span> &lt;span class="na">ref=&lt;/span>&lt;span class="s">&amp;#34;FILE&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;appender-ref&lt;/span> &lt;span class="na">ref=&lt;/span>&lt;span class="s">&amp;#34;STDOUT&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/root&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/springProfile&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/configuration&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="java-코딩에서의-로깅">java 코딩에서의 로깅&lt;/h2>
&lt;p>실제 사용은 다음과 같이 &lt;code>LoggerFactory&lt;/code>를 이용해서 사용하거나 &lt;code>Lombok&lt;/code>어노테이션을 활용하면 심플하게 사용이 가능하다.&lt;/p>
&lt;ul>
&lt;li>LoggerFactory 사용&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.slf4j.Logger&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kn">import&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">org.slf4j.LoggerFactory&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">Foo&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">static&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">final&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Logger&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">logger&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LoggerFactory&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">getLogger&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Foo&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">class&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">test&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">logger&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">debug&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;ID : {}&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;foo&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Lombok 어노테이션 사용&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nn">lombok.extern.slf4j.Slf4j&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nd">@Slf4j&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">Foo&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">test&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">log&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">debug&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;ID : {}&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;foo&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="마치며">마치며&lt;/h2>
&lt;p>일반적인 웹 어플리케이션에서는 WAS에서 로깅을 따로 관리하고 있기 때문에 file 로 로깅을 할 필요는 없을것 같다.(일반 jar 형태에서는 파일 로깅이 필요 할수도&amp;hellip;)&lt;/p>
&lt;h2 id="참고사이트">참고사이트&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="http://yookeun.github.io/java/2015/11/10/log4jtologback/" target="_blank" rel="noopener noreffer ">http://yookeun.github.io/java/2015/11/10/log4jtologback/&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://java.ihoney.pe.kr/397" target="_blank" rel="noopener noreffer ">http://java.ihoney.pe.kr/397&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://logback.qos.ch/" target="_blank" rel="noopener noreffer ">https://logback.qos.ch/&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>자바 8 Date</title><link>https://taetaetae.github.io/2017/01/10/java8-date/</link><pubDate>Tue, 10 Jan 2017 20:55:33 +0000</pubDate><guid>https://taetaetae.github.io/2017/01/10/java8-date/</guid><description>&lt;p>이제까지 내 기억으로는 Date 관련 클래스를 아래처럼 점차 바꿔써온걸로 기억이 난다.
&lt;code>java.util.Date&lt;/code> &amp;gt; &lt;code>java.util.Calendar&lt;/code> &amp;gt; &lt;code>org.joda.time&lt;/code>
그런데 java 8 버전에서 기존에 있었던 문제들을 개선해서 나왔다고 한다. (&lt;a href="http://d2.naver.com/helloworld/645609" target="_blank" rel="noopener noreffer ">네이버 HellowWorld 포스팅 참고&lt;/a>) &lt;code>JSR-310&lt;/code> 이라는 표준명세로.&lt;/p>
&lt;!-- more -->
&lt;p>지금부터는 JAVA 8 에서 제공하는 API로 날짜 연산을 어떻게 하는지에 대해 알아보고자 한다. (물론 수많은 날짜 연산 방법을이 있지만 자주 쓰이는 부분들 위주로 정리해보자.)&lt;/p>
&lt;ul>
&lt;li>Date &amp;gt; String (format)&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="n">LocalDateTime&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">now&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="na">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">DateTimeFormatter&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">ofPattern&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;yyyy-MM-dd&amp;#34;&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>String &amp;gt; Date (format)&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="n">LocalDateTime&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">parse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;2017-01-01 12:30:00&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">DateTimeFormatter&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">ofPattern&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;yyyy-MM-dd HH:mm:ss&amp;#34;&lt;/span>&lt;span class="p">));&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>날짜/시간 증감&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="n">LocalDateTime&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">localDateTime&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">LocalDateTime&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">2017&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">10&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">0&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">localDateTime&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">plusDays&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">1&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// 일&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">localDateTime&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">plusMonths&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">1&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// 월&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">localDateTime&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">plusHours&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">1&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// 시간&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">localDateTime&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">plusWeeks&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">1&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// 주&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">localDateTime&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">minusYears&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">1&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// 년&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">localDateTime&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">minusMinutes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">1&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c1">// 분&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>더 다양한 내용들은 아래 URL 에서 확인이 가능하다.
&lt;a href="https://docs.oracle.com/javase/tutorial/datetime/iso/overview.html" target="_blank" rel="noopener noreffer ">https://docs.oracle.com/javase/tutorial/datetime/iso/overview.html&lt;/a>&lt;/p></description></item><item><title>Spring Transactional 설정 및 주요속성</title><link>https://taetaetae.github.io/2017/01/08/transactional-setting-and-property/</link><pubDate>Sun, 08 Jan 2017 17:19:30 +0000</pubDate><guid>https://taetaetae.github.io/2017/01/08/transactional-setting-and-property/</guid><description>&lt;p>지난번에는 트랜잭션의 설정값에 대해 알아본 바 있다. [ &lt;a href="https://taetaetae.github.io/2016/10/08/20161008" rel="">Spring Transaction 옵션&lt;/a> ]
이번 포스팅에서는 실제로 스프링 환경에서 어떤식으로 설정해야 &lt;code>@Transactional&lt;/code> 어노테이션을 사용할수 있는지, 그리고 어떤 속성들이 있는지에 대해 알아보고자 한다.&lt;!-- more -->&lt;/p>
&lt;h2 id="설정">설정&lt;/h2>
&lt;p>기존 xml방식에서는 다음과 같이 설정을 한다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;bean&lt;/span> &lt;span class="na">id=&lt;/span>&lt;span class="s">&amp;#34;transactionManager&amp;#34;&lt;/span> &lt;span class="na">class=&lt;/span>&lt;span class="s">&amp;#34;org.springframework.jdbc.datasource.DataSourceTransactionManager&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;property&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;dataSource&amp;#34;&lt;/span> &lt;span class="na">ref=&lt;/span>&lt;span class="s">&amp;#34;dataSource&amp;#34;&lt;/span>&lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/bean&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;tx:annotation-driven&lt;/span> &lt;span class="na">transaction-manager=&lt;/span>&lt;span class="s">&amp;#34;transactionManager&amp;#34;&lt;/span> &lt;span class="na">proxy-target-class=&lt;/span>&lt;span class="s">&amp;#34;true&amp;#34;&lt;/span>&lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>혹, JavaConfig 방식으로 설정하기 위해서는 다음과 같이 설정한다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@EnableTransactionManagement&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">AppConfig&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Bean&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">PlatformTransactionManager&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">transactionManager&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">throws&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">URISyntaxException&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">GeneralSecurityException&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ParseException&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">IOException&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">new&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">DataSourceTransactionManager&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dataSource&lt;/span>&lt;span class="p">());&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>위와같이 설정을 해주면 트랜잭션을 설정하고자 하는 곳 어디서든 &lt;code>@Transactional&lt;/code> 어노테이션을 지정해서 적용이 가능하다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">UserService&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nd">@Transactional&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">boolean&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">insertUser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">User&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">user&lt;/span>&lt;span class="p">){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="주요속성">주요속성&lt;/h2>
&lt;p>&lt;code>@Transactional&lt;/code> 어노테이션의 주요속성은 다음과 같다.&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>속성&lt;/th>
 &lt;th>설 명&lt;/th>
 &lt;th>사용 예&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>isolation&lt;/td>
 &lt;td>Transaction의 isolation Level. 별도로 정의하지 않으면 DB의 Isolation Level을 따름.&lt;/td>
 &lt;td>@Transactional(isolation=Isolation.DEFAULT)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>propagation&lt;/td>
 &lt;td>트랜잭션 전파규칙을 정의 , Default=REQURIED&lt;/td>
 &lt;td>@Transactional(propagation=Propagation.REQUIRED)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>readOnly&lt;/td>
 &lt;td>해당 Transaction을 읽기 전용 모드로 처리 (Default = false)&lt;/td>
 &lt;td>@Transactional(readOnly = true)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>rollbackFor&lt;/td>
 &lt;td>정의된 Exception에 대해서는 rollback을 수행&lt;/td>
 &lt;td>@Transactional(rollbackFor=Exception.class)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>noRollbackFor&lt;/td>
 &lt;td>정의된 Exception에 대해서는 rollback을 수행하지 않음.&lt;/td>
 &lt;td>@Transactional(noRollbackFor=Exception.class)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>timeout&lt;/td>
 &lt;td>지정한 시간 내에 해당 메소드 수행이 완료되지 않은 경우 rollback 수행. -1일 경우 no timeout (Default = -1)&lt;/td>
 &lt;td>@Transactional(timeout=10)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="마치며">마치며&lt;/h2>
&lt;p>자칫 잘못했다가는 원치않는 트랜잭션으로 잘못된 결과를 초래할수 있기때문에 기본값은 숙지하는게 좋을것 같다.&lt;/p></description></item><item><title>spring4에서 json view 활용하기(with @ResponseBody)</title><link>https://taetaetae.github.io/2017/01/07/spring4-json/</link><pubDate>Sat, 07 Jan 2017 15:47:59 +0000</pubDate><guid>https://taetaetae.github.io/2017/01/07/spring4-json/</guid><description>&lt;p>수많은 블로거분들의 도움을 받고자 구글링을 해서 적용을 해봤지만 너무많은 삽질을 했다.(해봤던 방식은 &lt;code>jsonViewResolver&lt;/code> 를 따로 설정해보거나, &lt;code>@RequestMapping&lt;/code> 옵션을 바꿔보는 수준..) 특히나 Spring설정방식이 예전 방식이였던 &lt;code>xml&lt;/code>이 아닌 &lt;code>javaconfig&lt;/code>였기 때문에 더욱더 자료가 없었고.. &lt;!-- more --> 한참을 삽질하다 해결을 하여 포스팅하게 된다. 우선 환경은 &lt;code>spring 4.3.4.RELEASE&lt;/code>, &lt;code>Maven&lt;/code>, &lt;code>jdk8&lt;/code>임을 밝힌다.&lt;/p>
&lt;h2 id="pomxml">pom.xml&lt;/h2>
&lt;p>&lt;code>jackson-mapper-asl&lt;/code>을 이용해서 하라는 블로거들도 있었지만, 아무리해도(뭔가 Spring버전과 맞지 않는듯 했다.) 잘 안되어 아래와 같은 dependency를 주었다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;dependency&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nt">&amp;lt;groupId&amp;gt;&lt;/span>com.fasterxml.jackson.core&lt;span class="nt">&amp;lt;/groupId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nt">&amp;lt;artifactId&amp;gt;&lt;/span>jackson-databind&lt;span class="nt">&amp;lt;/artifactId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nt">&amp;lt;version&amp;gt;&lt;/span>2.5.1&lt;span class="nt">&amp;lt;/version&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/dependency&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="controller">Controller&lt;/h2>
&lt;p>아래와같이 &lt;code>@ResponseBody&lt;/code> 어노테이션을 설정해주고 리턴은 해당 모델을 넘기면 된다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@RequestMapping&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;/test&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nd">@ResponseBody&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Map&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Object&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">test&lt;/span>&lt;span class="p">(){&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> 	&lt;/span>&lt;span class="n">Map&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Object&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">map&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">new&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">HashMap&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Object&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">();&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> 	&lt;/span>&lt;span class="n">map&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">put&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s">&amp;#34;111&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> 	&lt;/span>&lt;span class="n">map&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">put&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">222&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> 	&lt;/span>&lt;span class="k">return&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">map&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>그리고 호출을 해보면 기대했던것처럼 이쁘게 json형태로 나온다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;#34;1&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;111&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;#34;2&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">222&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>물론, list 나 array, 일반 객체도 가능하다.&lt;/p>
&lt;h2 id="정리">정리&lt;/h2>
&lt;p>삽질을 끝에 알게된 사실(?)을 정리해보자.
다른측면에서 분석을 해보면. &lt;code>@ResponseBody&lt;/code>을 이용하여 view 에 json 형태로 나타내고자 할 경우 가능한 상황은 &lt;code>toString&lt;/code>으로 했을때 json형태로 나올수 있으면 가능하다. 예로들어 아래처럼 클래스에 Lombok 어노테이션인 &lt;code>@Data&lt;/code>가 붙으면 자동으로 &lt;code>toString&lt;/code>을 오버라이딩 해주기 때문에 해당 클래스를 리턴하게되면 자동으로 json 처리가 된다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@Data&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">Student&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">private&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">private&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>@ResponseBody&lt;/code>을 붙이고 &lt;code>List&amp;lt;Student&amp;gt;&lt;/code>를 리턴하게 되면 에러가 나는데, 이럴경우 별도 라이브러리를 추가해줘야 자동으로 변환되어 json 형태로 나올수 있게 된다. (list.toString을 하면 json형태가 아닌 이상한 문자형태로 나오기 때문&amp;hellip; Map같은것도 마찬가지 이유로 별도 라이브러리를 추가해줘야 정상적으로 나온다.)&lt;/p>
&lt;h2 id="마치며">마치며&lt;/h2>
&lt;p>단순히 &lt;strong>@ResponseBody를 사용해서 json으로 리턴하려면 어떤 라이브러리를 추가해야한다&lt;/strong> 로 생각했던것에서, 이것저것 테스트 한 결과 &lt;strong>toString을 할수 있어야 하고 그 값이 json형태이면 가능하다&lt;/strong> 로 결론이 지어졌다. 확실히 장님 코끼리 만지듯이 &amp;lsquo;그런가보다&amp;rsquo;하고 넘어가면 삽질이 진짜 불필요한 삽질이 되는것 같다. 구글링을 해보고, 테스트를 해봐서, 결론적으로 &lt;code>내것&lt;/code>으로 만드는 습관을 가져야 겠다.&lt;/p></description></item><item><title>jsp include</title><link>https://taetaetae.github.io/2017/01/04/20170104/</link><pubDate>Wed, 04 Jan 2017 18:36:17 +0000</pubDate><guid>https://taetaetae.github.io/2017/01/04/20170104/</guid><description>&lt;h2 id="1-디렉티브방식">1. 디렉티브방식&lt;/h2>
&lt;pre tabindex="0">&lt;code class="language-jsp" data-lang="jsp">&amp;lt;%@ include file=&amp;#34;~~&amp;#34;%&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>정적 include 방식, 인클루드 되는 내용이 단순하게 텍스트로 포함되어 컴파일이 된다. (복사된다는 느낌)&lt;/li>
&lt;/ul>
&lt;!-- more -->
&lt;ul>
&lt;li>주의할점은 비록 포함되는 페이지라 하더라도 한글을 제대로 처리하기 위해서는 포함되어지는 jsp파일 상단에 인코딩 명시를 해줘야 한다.&lt;/li>
&lt;li>포함되어지는 jsp 내용이 변경이 될 경우 해당 jsp를 사용하는 jsp를 강제로 변경(touch) 해줘서 다시 컴파일이 되게 해야하는 불편함이 있다.&lt;/li>
&lt;li>정적 방식이기 때문에 예로들어 전역변수를 인클루드 되는 jsp에서 지정하게 되면 상위jsp에서 사용이 가능하게 된다.&lt;/li>
&lt;/ul>
&lt;h2 id="2-액션태그-방식">2. 액션태그 방식&lt;/h2>
&lt;pre tabindex="0">&lt;code class="language-jsp" data-lang="jsp">&amp;lt;jsp:include page=&amp;#34;~~&amp;#34;/&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>동적 include 방식, 포함하는 문서와 상관없이 동적으로 컴파일 된다. (완전히 별도로 동작하기 때문에 변수를 동시에 사용하려면 따로 파라미터로 넘겨줘야 한다.)&lt;/li>
&lt;li>&lt;code>flush&lt;/code> 옵션은 요청흐름이 넘어가면서 현재까지 페이지의 결과를 출력할 것인지 말것인지를 결정하는것이다. 일반적으로 &lt;code>false&lt;/code>로 설정한다.&lt;/li>
&lt;li>&lt;code>&amp;lt;jsp:param&amp;gt;&lt;/code>를 이용하여 파라미터를 전송할수 있다.&lt;/li>
&lt;/ul>
&lt;pre tabindex="0">&lt;code class="language-jsp" data-lang="jsp">&amp;lt;jsp:include page=&amp;#34;...&amp;#34; flush=&amp;#34;false&amp;#34;&amp;gt;
 &amp;lt;jsp:param name=&amp;#34;name&amp;#34; value=&amp;#34;이름&amp;#34; /&amp;gt;
 &amp;lt;jsp:param name=&amp;#34;pageName&amp;#34; value=&amp;#34;페이지이름&amp;#34;/&amp;gt;
&amp;lt;/jsp:include&amp;gt;
&lt;/code>&lt;/pre>&lt;h2 id="3-jstl-방식">3. JSTL 방식&lt;/h2>
&lt;pre tabindex="0">&lt;code class="language-jsp" data-lang="jsp">&amp;lt;c:import url=&amp;#34;~~&amp;#34; /&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>JSTL(JSP Standard Tag Library) 태그중의 하나&lt;/li>
&lt;li>컴파일 되고 동작하는 방식은 액션태그&lt;code>&amp;lt;jsp:include page=&amp;quot;~~&amp;quot;/&amp;gt;&lt;/code>와 같음&lt;/li>
&lt;li>현재 컨테이너 안에 있는 자원외에 다른 외부 자원도 포함이 가능하다.&lt;/li>
&lt;/ul>
&lt;pre tabindex="0">&lt;code class="language-jsp" data-lang="jsp">&amp;lt;c:import url=&amp;#34;http://www.google.com/&amp;#34;/&amp;gt;
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>아래와 같이 보다 더 다양한 옵션이 제공된다&lt;/li>
&lt;/ul>
&lt;pre tabindex="0">&lt;code>&amp;lt;c:import! url=&amp;#34;읽어올 URL&amp;#34;
 var=&amp;#34;읽어올 데이터를 저장할 변수명&amp;#34;
 scope=&amp;#34;변수의 공유 범위&amp;#34;
 varReader=&amp;#34;리소스의 내용을 Reader 객체로 읽어올 때 사용&amp;#34;
 charEncoding=&amp;#34;읽어온 데이터의 캐릭터셋 지정&amp;#34; /&amp;gt;
&lt;/code>&lt;/pre></description></item><item><title>2017 버킷리스트</title><link>https://taetaetae.github.io/2017/01/01/hello-2017/</link><pubDate>Sun, 01 Jan 2017 15:49:31 +0000</pubDate><guid>https://taetaetae.github.io/2017/01/01/hello-2017/</guid><description>&lt;p>올해도 어김없이(?) 1월 1일이 되어 해맞이(&lt;del>해돋인지 해맞인지 햇갈리지만, 새해 첫날부터 복잡해지기 싫당 =ㅁ=&lt;/del>)를 다녀오고 까페에서 새해 계획을 세워본다. 정말 지킬수 있는 계획들, 현실적인 부분들만 고려해서 써내려 가보자. 절반 이상만이라도 지킬수만 있다면 그나마 다행이라고 생각!&lt;/p>
&lt;!-- more -->
&lt;blockquote>
&lt;p>기술블로그 운영하기 : 월 2회 posting&lt;/p>&lt;/blockquote>
&lt;p>내가 아는지식이 얼만큼인지, 보여주기식이 아닌 내 머릿속에 자리잡고 있는 부분들을 정리해서 기록화 하는 이름하야 &lt;code>기술블로그&lt;/code>를 작성하는거다. 2주에 최소 하나씩, 이렇게 되면 한달에 최소 2post, 1년이면 약 20post. 작다고 해도 마냥 작게만 느껴지지 않을 분량이다. 사소한거 하나라도. 이를테면 서버 설치나 스프링의 기본 설정 관련된 것들도. 글쓰는 연습도 하고 좋은 기회가 될것 같다.&lt;/p>
&lt;blockquote>
&lt;p>4대강 종주 : 영산강, 1박2일코스&lt;/p>&lt;/blockquote>
&lt;p>2014년에 한강(북한강, 남한강), 2015년에 금강, 2016년에는 못갔다. 4대강 종주의 목표가 갑자기 시들어진 작년이라 생각이 든다. 우여곡절 산전수전 다겪은 내 자전거 붕붕이에게 미안하지 않기위해서라도 올해 여름에는 꼭 영산강이나 낙동강 하나를 계획잡아 1박2일 코스로 다녀와야겠다. 음, 대략 5월? 아마 영산강을 가게될것같다. 이번에는 무리하지 않고 1박2일코스로..&lt;/p>
&lt;blockquote>
&lt;p>독서 : 월 전공1권, 전공외1권&lt;/p>&lt;/blockquote>
&lt;p>작년에 내 입에서 나왔던 이야기들중에 한심스럽게(?)나온 멘트중 가장 많이나왔던 &lt;code>책좀읽자&lt;/code> 올해에는 정말 &lt;code>많이&lt;/code>는 아닐지라도 &lt;code>자주&lt;/code>읽는 습관을 길러야겠다. 한달에 전공책 한권, 기타서적 한권. 얇은책+읽고싶은책 부터 읽기 시작해서 내년 1월1일때는 내 책상 한켠에 자리잡고있는 책장을 가득 메워보고싶다. 아, 물론 다 읽은 책들로만.&lt;/p>
&lt;blockquote>
&lt;p>여행+사진 : 한달에 한번이상 여행가기&lt;/p>&lt;/blockquote>
&lt;p>해외든 국내든, 올해는 정말 많이 다녀와야겠다. 가볍게 당일치기부터 시작해서 갈수만 있다면 해외여행도. 물론 올해도 야근과의 싸움은 계속될테지만 주말 잠깐이라도 시간을 내서 두달에?아니 한달에 한번이라도 휴가를 써서라도 가까운곳에 힐링하러 다녀오고 싶다. 가서 작년에 산 카메라로 사진도 이것저것 많이 찍고 좋은추억 많이 만들고오고 싶다.&lt;/p>
&lt;blockquote>
&lt;p>저축+a : 근검절약의 생활화, 경제공부&lt;/p>&lt;/blockquote>
&lt;p>나름 월급의 60%이상을 저축하는 중이다. 그치만 상황이 상황인지라 지금도 만족하지 못한다. 천장에 굴비 달아놓고 간장찍어 먹는다는게 아니라 아낄수 있는 부분들은 최대한 아끼면서 살자는거다. 아침에 택시 타지말고 조금 일찍 일어나서 버스를 탄다던지, 버스를 타지말고 조금일찍 일어나서 자전거를 탄다던지&lt;code>(사실 자전거를 타면 퇴근할때 더 빠르고 편하게 올수 있으니)&lt;/code> 생활속에서 절약할수 있는 부분들을 찾고, 몸에 베도록 습관화 시켜야겠다. 그리고 주식이나 펀드 등 투자에 대해서도 이제 공부를 해봐야겠다. &lt;code>(독서하자는거랑 비슷한 이야기)&lt;/code> 저금리시대 마냥 저축만 하다보면 힘든건 누구나 다 아는이야기. 일에 치여 생활에 치여 핑계대지말고 배워가면서 챙겨보자.&lt;/p>
&lt;blockquote>
&lt;p>운동 : 자유형마스터, 몸짱&lt;/p>&lt;/blockquote>
&lt;p>항상 하는 이야기지만 건강보다 중요한건 없다고 생각한다. 올해에도 병원가지 않는 나를 만들기 위해 헬스 + 배드민턴 + 라이딩 은 필수고 가능하면 수영도 배워서 자유형 정도는 할수있는 나를 만들고 싶다. 그래서 다들 말하는 &lt;code>몸짱&lt;/code>도 되보고 싶고 자신있게 해변가에서 상의를 탈의할수있는(?!) 건강한 내가 되도록 노력해야겠다.&lt;/p>
&lt;blockquote>
&lt;p>봉사활동하기 : 연탄배달, 자원봉사&lt;/p>&lt;/blockquote>
&lt;p>작년에 하려다가 못한 봉사활동 올해는 꼭 해야겠다. 가깝게 할수있을법한게 &lt;code>연탄배달&lt;/code>, 이건 1월달 내로 꼭! 해서 봉사라는것과 나눔이라는 행복을 느껴보고 싶다. 지금 생각나는건 자원봉사 같은것도 해보고 싶고 무보수 알바(?) 같은것도 해보고싶다. 나이들면 못할, 언제 해보겠나.&lt;/p>
&lt;blockquote>
&lt;p>가까운, 먼 사람들 만나기&lt;/p>&lt;/blockquote>
&lt;p>마지막으로, 잊고있었던 중요한 행동. 바로 사람들 만나기다. 바쁘다는 핑계 하나만으로 등한시한 내 소중한 사람들. 아무리 연봉을 많이 받고 일을 잘한다고 회사에서 잘나간다 할지라도, 내 곁엔 나를 생각해주는 소중한 사람들이 있기에 내가 있을수 있는것 같다. 가까운 사람들부터 시작해서 오랬동안 못봤던 사람들도 하나둘씩 연락하면서 지내는 여유를 가져야 겠다.&lt;/p>
&lt;p>할수 있을까? 라는 생각보다 하나둘씩 잊지말고, 놓치지 말고 하루를, 이번주를, 이번달을 점검하고 실천해 나가보자.
올 한해도 열심히 최선을 다해 살것!&lt;/p></description></item></channel></rss>