1 ~ n까지 합을 구하는 원리

관련글: 1부터 n까지의 합 구하기

전에 1 ~ n 까지 합 구하기 문제에 관해서 글을 올렸지만, 내용을 좀 더 보충하고자 합니다.

그럼 1에서 n까지의 합을 구하는 문제에 대해서 처음부터 다시 생각해 보겠습니다.

이 문제 자체의 정의를 그대로 프로그램으로 표현한다고 하면, 1에서 n까지의 수를 카운트해서 전부 더하면 됩니다. 일단 문제의 정의에 가장 충실하면서도, 구현도 비교적 간단합니다.

그러나, n이 10, 100, 1000, 10000 정도까지라면 이 알고리즘에 별다른 문제는 발생하지 않지만, 만일 n이 10억, 100억 단위로 커지게 되면 문제가 발생합니다.

반복적 제어구조를 이용하기 때문에, 그만큼의 숫자를 카운트하려다 보면 알고리즘의 수행성능이 대단히 느려집니다. 그러면, 주어진 문제에 대한 해법을 다른 방식으로 찾아볼 필요가 있습니다.


자, 우선 n = 5 라고 가정하고, 1부터 5까지의 합을 계산해 봅시다.


    1 + 2 + 3 + 4 + 5 = ?


잠깐... 이걸 한번 그래픽으로 표현해 볼까요?
인간의 뇌는 뭔가를 그림으로 표현할때 이해가 잘 되는 법입니다.


   ○
   ○○
   ○○○
   ○○○○
   ○○○○○


앗, 삼각형이 되는군요!

그렇다면, 1 ~ 5의 합계는 결국 삼각형의 넓이라는 것으로도 표현될 수 있을 겁니다.

바로 계산해 봅시다.


   삼각형의 넓이 = 밑변 x 높이 / 2

   → 5 x 5 / 2 = 12.5 (??)


어.. 뭔가 답이 이상하죠? 그야 당연한 결과입니다. 삼각형의 넓이는 사각형의 넓이의 절반이라는 개념에서 나온것입니다. 그러니까, 우선 삼각형을 사각형으로 변환하지 않으면 안됩니다. 그래서 밑변 x 높이를 해주는 것이죠.

그런데, 5 x 5를 하게되면...

   ○○○○○
   ○○
○○○
   ○○○
○○
   ○○○○

   ○○○○○


이런 사각형이 되는 겁니다. 구하고자 하는 삼각형의 2배 넓이를 가지는 사각형을 만들어야 하기 때문에, 제대로 하자면 이렇게 되어야 합니다.

   int sum = 0;

   ○○○○○○
   ○○
○○○○
   ○○○
○○○
   ○○○○
○○
   ○○○○○


자, 그럼 계산해 보죠.


   5 x (5 + 1) / 2 = 15


자, 그럼 이 공식을 일반화 해볼까요?
5라는 숫자 대신, n으로 바꿔주면 됩니다.


   n x (n + 1) / 2


자, 그러면 1 ~ n까지의 합이란 문제에 대해서... 위의 공식만 대입하면 끝나는 겁니다. n이 아무리 큰 숫자가 들어와도 단 한줄의 수식만 처리하면 됩니다. 알고리즘의 속도는 비교할 것이 못됩니다.

제가 여기서 강조하는 싶은 건, 공식이 아니라, 수학적인 사고 방법입니다. 수학은 복잡해 보이는 것을 단순하게 만들어 놓고 계산하는 것입니다. 이것이 바로 '추상화'의 과정입니다. 수학은 이런 추상화의 과정 위에서 비로소 계산을 시작하는 겁니다. 그래서 수학은 숫자의 학문이 아니라, 생각의 학문이라고 합니다.

그리고 또 한가지 말하고 싶은 것은, 문제를 해결하는 관점을 여러 각도에서 생각해 보자는 겁니다. 문제를 풀어나가는 방법은 여러가지가 있을 수 있습니다. 위에서 예를 든 경우도, 반복을 통한 누적계산으로 풀어나가는 방법과, 수식으로 계산하는 방법이 있습니다.


둘다 장단점은 있습니다.


누적계산은 문제의 정의를 가장 충실하게 구현한 것이고, 따라서 더 이해하기도 쉽습니다. 하지만 n이 무한히 커지면 수행속도가 현저히 떨어지는 문제가 있습니다. 반면 수식을 통한 방법은 성능에 있어서는 탁월하지만, 저 공식이 어떤 원리로 나왔는지 모를경우에는 저게 뭐하는 것인지 잘 이해가 안될겁니다. (주석이 안달려 있다면 말이죠)

제가 전에 올렸던 피보나치 수열 구하는 방법도 역시, 문제의 정의에 따라서 충실히 구현한 방법과, 황금분할비를 이용해서 곱셉으로 처리하는 방법이 있었습니다. 세상에 한가지 약으로 만병을 치료할 수 없듯이, 어떤 문제에 대해서도 하나의 알고리즘이 만능으로 적용되지는 않는다고 봅니다. 그때 그때 상황에 따라서 방법을 바꿀 필요도 있는 것입니다.

문제를 바라보는 관점에 따라서 얼마든지 방법은 달라질 수 있습니다.

마지막으로, 한가지 문제를 내보겠습니다.
심심하신 분들은 한번 도전(?)해 보시죠...(^^)


[문제]


위에서 1 ~ n까지의 합을 구하는 공식을 만들었습니다. 그러면 1부터가 아니라, a ~ b까지의 합을 구하는 것은 어떻게해야 할까요? 그리고 1씩 증가하는 수열이 아니라 2나 3 등으로 증가하는 수열에 대해서 공통으로 적용될 수 있는 방법은 무엇일까요?


이에 대한 저의 답안은 아래에 있습니다.




우선 a ~ b까지의 합입니다. 간단히 예제로 나가죠.
 
2 ~ 5 까지의 합을 계산해 보겠습니다.
 
   ○○
   ○○○
   ○○○○
   ○○○○○
 
이번엔 사다리꼴 모양이 됩니다.
그럼 이번에도 역시...
 
   ○○○○○○○
   ○○○○○○○
   ○○○○○○○
   ○○○○○○○
 
자, 그럼 여기서 저 사다리꼴의 면적을 구하려면?
 
밑변의 길이: 2 + 5
높이: 4
 
   (2 + 5) * 4 / 2 = 14
 
자, 그럼 이걸 일반화 해보죠.
 
   2 -> a
   5 -> b
 
음.. 그럼 높이 4는 뭘로?
 
여기서 높이는 수열에서의 원소 갯수로 표현할 수 있습니다. 즉 2 3 4 5 로 된 수열이니까, 4개의 숫자가 있는 건데... 여기서 수열의 길이는 구하는 것은 아주 쉽습니다.
 
   "수열의 마지막 값 - 첫번째 값 + 1"
 
마지막에 +1을 해주는 이유는, b - a만 해버리면, a 자신은 카운트에 포함되어 있지 않게 되기 때문입니다.
 
자, 그럼 이제 일반화 해보죠.
 
   (a + b) * (b - a + 1) / 2
 
이걸 풀이하면, (첫번째 원소 + 마지막 원소) x 원소의 갯수 / 2 가 되는 겁니다.
 
그러면....
 
1씩이 아닌, 임의의 수로 증가하는 등차수열의 경우도 이 식의 틀에서벗어나지 않습니다.
2씩 증가하는 수열로 예를 들어 보죠.
 
   2 4 6 8 10 12
 
   ○○
   ○○○○
   ○○○○○○
   ○○○○○○○○
   ○○○○○○○○○○
   ○○○○○○○○○○○○
 
이것 역시 2배를 해보면....
 
   ○○○○○○○○○○○○○○
   ○○○○○○○○○○○○○○
   ○○○○○○○○○○○○○○
   ○○○○○○○○○○○○○○
   ○○○○○○○○○○○○○○
   ○○○○○○○○○○○○○○
 
이런 모양이 되는데, 그래봐야 결국은...
 
   (첫번째 원소 + 마지막 원소) x 원소갯수 / 2
 
...인 겁니다.
 
즉, 원소갯수만 구할 수 있다면, 몇개씩 증가하든지 상관없다는 것이지요.
 
그럼 이때의 원소 갯수는 어떻게 구할까요.
 
시작값을 a, 증가분을 c라고 할때, a의 n번째 원소를 구하는 식은 이렇게 됩니다.
 
   A(n) = a + c x n
 
그러면, 마지막 원소값 b가 a로부터 몇번(n)째에 위치한 것인지를 알면, 전체 원소의 갯수를 구할 수 있습니다.
 
저 식으로부터 n을 계산해 내면...
 
   b = a + c x n
   → (b - a) / c = n
 
단 여기에는 시작값 a는 카운트에 포함되어 있지 않으므로, + 1을 시켜줘야 합니다.
그래서, 등차수열에서 전체 원소의 갯수는... → (b - a) / c + 1
그래서 최종적으로 나온 식은...
 
   (첫번째 원소 + 마지막 원소) x 원소갯수 / 2 
   → (a + b) x ((b - a) / c + 1) / 2
 
   a: 시작값
   b: 종료값
   c: 증가분
 
가 됩니다.

이것을 스몰토크에서 표현하면...

-----------------------------------------------
Interval>>sum

     ^(self first + self last) * self size / 2
-----------------------------------------------



출처 : http://sizuha-textcube.blogspot.kr/2006/04/1-n%EA%B9%8C%EC%A7%80-%ED%95%A9%EC%9D%84-%EA%B5%AC%ED%95%98%EB%8A%94-%EC%9B%90%EB%A6%AC.html


'프로그래밍 > 알고리즘' 카테고리의 다른 글

[알고리즘] 1 ~ n까지 합을 구하는 원리  (0) 2016.01.05
Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

오픈소스 라이선스

https://www.olis.or.kr




제 생각을 [Comment]로 추가


번역에 대한 법적 책임 면제에 대한 공지:

다음 Apache License Version 2.0 번역본은 제 개인적인 목적에 의해 번역된 것을 밝힙니다. 이 번역본에 의해 아파치 라이선스의 정확한 법적 조건을 판단하는 것은 그 정확성을 보증할 수 없음을 밝히며, 임의로 사용 후에 발생하는 손해에 대해 저는 책임질 수 없음을 밝힙니다. 정확한 법적 조건을 알기 위해서는 링크를 통해 접근할 수 있는 원문을 참고하시기 바랍니다.

===========================================================================================================


아파치 라이선스
Apache License
2.0판, 2004년 2월
Version 2.0, January 2004
http://www.apache.org/licenses/

사용, 재생산, 배포를 위한 조항 및 조건
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. 정의
1. Definitions
.

"라이선스"란 이 문서의 1절부터 9절에 제시되어 있는 사용, 재생산, 배포를 위한 조항 및 조건을 뜻한다.
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

"라이선스 허가자"란 라이선스를 허가하는 저작권자 본인 또는 저작권자에 의해 지명된 사람[entity 를 모두 사람이라고 번역했습니다]을 뜻한다.
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

"법인"이란 실제 행동하는 사람과 그 사람을 조정하거나 그 사람에 의해 조정당하는 모든 사람들, 그 사람과 공통의 조정하에 있는 모든 사람들의 연합체[회사나 비영리 법인 같은 걸 뜻하는 거겠죠?]를 뜻한다. 여기서 "조정"이란 (i) 직간접적으로 그 사람의 행동 방향을 결정하거나 관리를 하는 권력을 뜻하거나, (ii) 발행주식 중 50% 이상을 소유하고 있거나, (iii) 그 실체로부터 수익을 얻는 소유권이 있음을 뜻한다.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

"라이선스 사용자"란 이 라이선스에 의해 허가된 조항들을 실제 실행하는 개인 또는 법인을 뜻한다.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

"소스" 형태란 소프트웨어 소스 코드, 문서 소스, 구성 파일 등과 같이 수정에 편리한 형태를 뜻한다. 그렇지만 이 세가지 형태로 국한되지는 않는다[including but not limited 를 이렇게 번역했습니다].
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

"목적물" 형태란 소스 형태를 기계적으로 변환하거나 번역하여 얻은 임의의 결과물을 뜻한다. 예로는 컴파일된 목적 코드, 생성된 문서, 여타 미디어 타입으로 변환된 형태 등이 있으며 이 세가지 형태로 국한되지는 않는다.
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

"창작물"이란 이 라이선스 조건 하에 소스 형태 또는 목적물 형태로 가용하게 된 원작자의 작업물을 뜻한다. 이 라이선스를 아래 첨부에 있는 예에서와 같이 창작물에 포함시키거나 부착하여 라이선스 적용 여부를 표시한다.
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

"파생 창작물"이란 소스 형태 또는 목적물 형태로 창작물에 기반하여 편집상 개정하거나, 주석을 추가하거나, 상세화하거나, 기타 전체적으로 볼 때 원저작자의 창작물임을 알 수 있을 정도로 수정한 저작물을 뜻한다[파생 창작물의 범위가 어떤 것인지는 Open Source License 에서 상당히 중요한 개념이죠. 아파치 라이선스에서는 편집상 개정, 주석 추가, 상세화, 원창작물을 식별할 수 있을 정도로 수정된 결과 등이 해당되네요. modification 을 법적 용어로는 개작이라고 표현하던데, 저는 그냥 수정이라고 번역했습니다. 대문자 Work 와 소문자 work를 구분해서 Work 는 창작물 work 는 저작물이라고 번역했습니다. 여기서 Work는 1.정의에서 언급한 창작물을 뜻하기 때문입니다]. 여기서 파생 창작물이란 창작물과 것의 모든 파생 창작물과는 분리된 형태로 존재하는 저작물[독립된 프로세스로 존재하며 창작물의 서비스를 이용하는 경우를 뜻하는 것 같습니다. Affero GPL 인가 하는 것은 이런 경우도 GPL로 공개해야 한다고 하더군요. 아직 확인은 안 해 봤습니다. ^^]과 그 인터페이스에 단순 연결(즉, 이름에 의한 연결)된 저작물[라이브러리 형태의 창작물에 링크만 한 경우를 뜻하는 것 같습니다. GPL과는 다르네요]은 포함하지 않는다.
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

"기여물"이란 창작물 원래 버전과 창작물과 그것의 모든 파생 창작물에 대한 수정 또는 추가 사항을 포함한 저작물로서 저작권자가 직접 또는 저작권자에 의해 지명된 개인 또는 법인이 저작권자를 대신하여 창작물에 포함시켜달라고 제출한 것을 뜻한다[대표적인 경우가 버그를 발견해서 이렇게 저렇게 fix 해 달라고 메일을 보낸 경우가 될 것 같습니다. 아래 2. 저작권 라이선스 허가에 따르면 자신이 기여한 소스에 대해서는 자연스럽게 사용권을 허가하게 되는 방식입니다]. 여기서 "제출"이란 전자적 대화, 음성대화, 기록대화 어떤 형태로든 라이선스 허가자 또는 그의 대리자에게 보낸 내용을 뜻한다. 대화 창구의 예로는 창작물에 관해 논의하고 창작물을 개선할 목적으로 라이선스 허가자에 의해 또는 라이선스 허가자를 대신하는 사람에 의해 관리되는 전자 메일링 리스트, 소스 코드 제어 시스템, 이슈 트랙킹 시스템 등이 있으나 이 세 가지에 국한되지는 않는다. 저작권자가 "기여물에 해당되지 않음"이라고 명확하게 표시하거나 그렇게 기록되어 있는 문서는 기여물에 포함되지 않는다[만약 라이선스를 허가하고 싶지 않다면 메일 보낼 때 "Not a Contribution"이라고 딱지를 붙여서 보내야겠네요. 그런데 그럴 거면 아예 메일을 보내질 않지 뭐하려고 "Not a Contribution"이라고 보낼까요 ?].
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

"기여자"란 라이선스 허가자에게 기여물을 보내어 그 기여물이 라이선스 허가자에 의해 창작물에 반영되었을 때, 그 기여물을 보낸 개인 또는 법인을 뜻한다. 라이선스 허가자는 기여자에 포함된다[이 개념에 따르면 최초의 원저작자도 기여자가 되는 것이겠죠 ? 그 이후에 이렇게 저렇게 수정을 한 모든 사람들도 기여자가 되는 것이구요].
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

2. 저작권 라이선스 허가. 각 기여자는 이 라이선스의 조항 및 조건에 따라 라이선스 이용자에게 소스 형식 또는 목적물 형식으로 창조물과 그것의 모든 파생 창조물을 재생산하고, 그것들의 파생 창조물을 준비하고, 일반인에게 공표하고, 일반인 앞에서 실행하고, 재차 라이선스하고, 배포할 수 있는 저작물 사용 권한을 허가한다[이 조항에 따르면 사용권에는 재생산, 수정, 공표, 실행, sublicense, 배포권이 포함되네요. 근데 sublicense란 뭘 뜻하는거죠 ?]. 이 권한은 영구적이고, 전세계적이며, 독점적이지 않고, 부과금이 없고, 사용료가 없으며, 취소될 수 없다[취소될 수 없다면 이 라이선스였다가 중간에 바뀌었더라도 바뀌기 전 버전을 가지고는 허가된 권한을 계속 사용할 수 있다는 뜻이네요].
2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. 특허 라이선스 허가. 각 기여자는 자신이 제출한 기여물 단독으로 또는 원창작물과 조합된 기여물에 의해 어쩔 수 없이 침해될 수 밖에 없으나 자신에 의해 라이선스 허가가 가능한 특허 청구항에 대해서만 이 라이선스의 조항 및 조건에 따라 라이선스 이용자에게 창작물을 제작하고, 사용하고, 판매를 제안하고, 판매하고, 수입하고, 전송할 수 있는 특허 사용권을 허가한다[모든 기여자의 특허는 자신이 알던 모르던 사용권이 허가되는 것이네요. 혹시 회사 업무의 일부로 기여를 했는데, 자신도 모르게 회사의 특허로 기여를 했다면 그 회사의 특허는 사용권을 허가해 버리게 되는 것이네요]. 이 권한은 영구적이고, 전세계적이며, 독점적이지 않고, 부과금이 없고, 사용료가 없으며, 이 절에서 기술된 경우를 제외하고는 취소될 수 없다. 라이선스 사용자가 창작물 또는 창작물에 포함된 기여물이 직접적으로 또는 기여적으로 특허를 침해했다고 주장하는 어떤 개인 또는 법인과 특허 소송을 시작하면(맞고소 포함), 이 라이선스 하에서 라이선스 사용자에게 허가된 모든 특허 사용권은 소송이 신청된 날로부터 취소된다[어떤 개인 또는 법인이라도 아파치 라이선스를 적용하고 있는 창작물을 사용하고 있는 임의의 한 회사에게 특허 소송을 걸면 바로 사용권이 취소된다는 얘기네요. 그렇다면 그 회사만 영향을 받는 것이겠죠 ? 모든 사람이 적용받는 게 아니라... 이건 법적으로 더 확인해 볼 필요가 있을 것 같네요. 이 조항의 해석에 따라 특허권을 보호 받고 싶은 회사가 일일이 사용하는 사람 또는 법인에게 다 소송을 걸어야 하는 것인지 아니면 한 회사에 대해 소송에서 승소하면 그걸로 끝인지... 일일이 소송을 걸어야 한다고 하더라도 한 번 판결이 나면 웬만한 회사들은 더이상 사용하질 않겠죠? 그리고 사용권이 취소되는 시점도 판결이 난 이후가 아니라 특허 소송이 접수된 시점이라서 아파치 라이선스가 적용된 소스는 사용상에 약간 위험성이 크네요. 어떻게 보면 특허권을 가졌다고 주장하는 회사에게 유리한 조항이군요].
3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

4. 재배포. 라이선스 사용자는 임의의 미디어에 담긴, 창작물과 함께 그것의 파생 창작물의 복사본을, 수정 여부에 관계 없이, 소스 형태 또는 목적물 형태로 재생산하거나 배포할 수 있다. 단, 다음과 같은 조건을 만족하여야 한다[라이선스 사용자가 재배포를 할 경우, 의무사항을 나열하고 있는 부분이네요. 잘 따라야 하겠지요. 그런데 수정 내용을 공개하라는 말도 없고 재배포시에 반드시 소스 형태로 제공해야 한다는 말도 없네요. 이것도 GPL과는 상당히 다른 점이군요]:
4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

  1. 라이선스 사용자는 창작물 또는 파생 창작물의 수신자에게 이 라이선스의 복사본을 줘야 한다[라이선스 복사본을 배포해야 하고]; 그리고
    You must give any other recipients of the Work or Derivative Works a copy of this License; and 
  2. 라이선스 사용자는 자신이 수정한 파일들에 알아보기 쉽게 수정하였다는 것을 명시해야 한다[수정 내용은 공개하지 않더라도 수정한 파일들을 알려 줘야 하는군요]; 그리고 
    You must cause any modified files to carry prominent notices stating that You changed the files; and 
  3. 라이선스 사용자는 창작물의 소스 형태에 있던 저작권 공지, 특허 공지, 상표권 공지, 귀속 공지를 파생 창작물의 소스 형태에 그대로 유지한 채로 배포해야 한다. 단, 파생 창작물과 관계 없는 공지는 제외한다[소스 형태로 파생 창작물을 배포할 때는 공지사항을 포함시켜야 한다는 것인가요?]; 그리고
    You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and 
  4. 창작물의 배포본에 "NOTICE" 파일이 포함되어 있다면 라이선스 사용자가 배포하는 모든 파생 창작물에도 그 NOTICE 파일에 담긴 귀속 공지 사본이 읽을 수 있는 형태로 포함되어야 한다[쉽게 말하면 그 NOTICE 파일을 그냥 그대로 놔두면 되겠네요]. 단, 파생 창작물의 어떤 부분에도 관련이 없는 공지는 제외한다. 그 공지는 적어도 다음과 같이 위치 중 한 곳에 위치해야 한다: 1) 파생 창작물의 일부로 배포되는 NOTICE 텍스트 파일안에, 2) 파생 창작물과 함께 배포 되는 소스 또는 문서 안에, 3)파생 창작물에 의해 생성되는 화면 안에 보통 나타나는 제3자 공지사항으로[목적물 형태로 배포하는 경우에는 이렇게 할 수 있겠네요]. NOTICE 파일의 내용은 정보 제공의 목적이므로 라이선스 조건을 변경할 수는 없다. 라이선스 사용자는 자신이 배포하는 파생 창작물 내에 창작물의 NOTICE 파일에 덧붙여 자신만의 귀속 공지를 배포할 수 있으나 그 귀속 공지가 라이선스 조건을 변경해서는 안된다.
    If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

라이선스 사용자는 자신이 수정한 부분에 자신만의 저작권 선언을 추가하고, 수정 부분의 사용, 재생산, 배포권에 대해 부가적인 또는 이 라이선스와는 다른 조항 및 조건을 기술할 수 있다. 또는 라이선스 사용자의 사용, 재생산, 배포의 조건이 이 라이선스와 호환이 된다면 수정 부분이 아닌 전체 파생 창작물에 대해 부가적인 또는 이 라이선스와는 다른 조항 및 조건을 기술할 수 있다[자신이 변경한 부분에 대해서는 다른 라이선스를 내걸 수 있다는 게 GPL과는 상당히 다른 점이네요. 이상의 재배포 조건을 보건데 GPL보다는 상당히 완화된 의무사항이네요]
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

5. 제출된 기여물. 라이선스 사용자가 창작물에 포함시키려는 의도를 가지고 라이선스 허가자에게 제출한 기여물은 명확하게 기여물이 아니라고 기술하지 않았다면 추가적인 조항과 조건 없이 이 라이선스의 조항과 조건하에 놓이게 된다. 이렇다 하더라도 라이선스 사용자가 기여물에 관해 라이선스 허가자와 별도로 맺은 라이선스 합의 조건을 이 조항이 대신하거나 변경하지는 않는다[기여물로 제출하면 당연히 이 라이선스를 따르게 된다는 거죠].
5. Submission of Contributions
. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

6. Trademarks. 이 라이선스는 라이선스 허가자의 상품명, 등록상표, 서비스 마크, 제품명을 사용할 권한을 부여하지 않는다. 단, 창작물의 시초를 밝히거나 NOTICE 파일을 재생산하기 위해 합리적이고 관습적으로 쓰는 경우에 한해서는 사용할 수 있다[등록 상표를 함부로 쓰면 안되겠군요. 예를 들면 Apache HTTP Server 파생 창작물을 만들고 기여물로 제출하지 않은 채로 Apache 라는 이름을 쓰면 안된다는 것이죠].
6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

7. 보증 거부. 법에 의해 요구되거나 문서상으로 합의한 경우를 제외하고, 라이선스 허가자는 아무런 보증 없이 창작물의 상태 그대로를 제공한다. 또한, 적법한 권한, 무침해, 거래 적합성, 특정 목적 부합성을 보증하지도 않는다. 라이선스 사용자는 자신이 직접 창작물 사용 및 배포의 적합성을 판단하여야 하고, 이 라이선스 하에서 허가된 권한을 실행하는데 있어 관련된 위험이 있을 수 있다는 걸 인지하여야 한다[어떠한 보장도 못하니 알아서 판단해서 쓰라는 얘기군요. 심지어는 다른 사람의 권리를 침해하지 않았다는 것도 보증하지 못한다네요. You use this at your own risk. 이것만 보면 정말 겁나는 얘기죠].
7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

8. 법적 책임의 한계. 어떤 사건, 어떤 법률적 이론 하에서도, 직무 태만을 포함한 불법 행위, 계약, 또는 다른 형태로든, 관련 법률이 강제하거나 기여자가 문서로 합의하지 않는 한, 기여자는 라이선스 사용자의 손해에 대한 책임을 지지 않는다. 그 손해가 직접적이던, 간접적이던, 특별한 손해이던, 우연한 손해이던, 창작물의 사용으로 인한 손해, 창작물의 사용 불가로 인한 손해, 이 라이선스로 인한 손해 등과 같이 인과적인 손해이던지 상관없이 책임을 지지 않는다. 그러한 손해의 예로는 선의의 손실로 인한 손해, 업무의 중단에 의한 손해, 컴퓨터 고장 또는 오동작으로 인한 손해, 기타 모든 상업적인 손해등이 있으며, 이것들만으로 제한되진 않는다. 기여자가 이러한 손해의 가능성에 대해 조언을 받았다고 하더라도 이 조항은 그대로 적용된다.
8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

9. 보증 또는 책임의 추가. 창작물과 그것들의 파생 창작물을 재배포할 때, 라이선스 사용자는 소정의 수수료를 받고 지원, 보증, 손해배상 책임, 기타 이 라이선스와 일치하는 법적 책임 및 권한을 받아들일 수 있다. 그러나, 그러한 책임을 받아들임에 있어 라이선스 사용자는 오로지 자신의 책임하에 받아들여야 하며, 이로 인해 야기되는 법적 책임 또는 지불 청구 등에 대해 기여자를 대신하여 배상금을 지불하고, 기여자를 보호하고, 각 기여자가 손해를 입지않도록 하는데 동의하여야 한다[7.항 8.항에 따르면 기여자들은 어떤 책임도 지지 않기 때문에 이항을 통해 보증 또는 책임을 짐으로써 비즈니스를 영위하는 경우를 명시적으로 허용하고 있네요. 이렇게 되면 오픈 소스 사업을 하는 사람도 나올 수 있고, 기여자들은 안심하고 기여를 할 수 있으니 누이 좋고 매부 좋고네요 ^^]
9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

조항 및 조건의 끝
END OF TERMS AND CONDITIONS 

첨부: 자신의 창작물에 아파치 라이선스를 적용하는 방법
APPENDIX: How to apply the Apache License to your work

자신의 창작물에 아파치 라이선스를 적용하려면 다음의 틀을 갖는 공지에서 대괄호를 둘러 쌓인 부분을 자신을 식별할 수 있는 정보로 대치해야 한다(대괄호 자체는 포함해서는 안된다). 파일 형식에 따라서는 적절한 코멘트 형식으로 둘러 싸야 한다[예를 들자면, C/C++ 소스 코드에 포함하는 경우에는 /* */ 이런 걸로 둘러 쌓아라는 말이겠죠]. 파일 이름, 클래스 이름, 목적 기술은 제3자의 아카이브 안에서도 쉽게 확인할 수 있도록 인쇄할 때 저작권 공지와 동일한 페이지에 나타나도록 할 것을 추천한다.
To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.


출처 : http://yesarang.tistory.com/272

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

http://zion437.tistory.com/349


http://manos.malihu.gr/jquery-custom-content-scroller/





Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

http://www.weplr.com/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%83%80-%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%88%A0/d3-js%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0%EB%B0%98%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%83%80-%EC%8B%9C%EA%B0%81%ED%99%94-fw/



https://www.dashingd3js.com/d3js-first-steps



http://blog.nacyot.com/articles/2015-02-02-d3-selection/

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

데이터 시각화 라이브러리 목록

아래에 정리된 내용들은 코드팩토리에서 직접 수집한 것으로 틀린 정보가 있을 수 있습니다. 사용하시기 전 각 라이브러리의 웹사이트에서 꼭 확인해주십시오

이름용도데모보기ElementIE8지원가격비고연관웹사이트
amCharts종합보기svgO조건부 무료링크포함 무료, 유료 가격은 1 domain 99Euro ~방문
arbor.jsforce directed보기canvasX무료방문
AwesomeChartJS종합보기canvasX무료방문
Backgrid.jsdatagrid보기tableO무료Backbone.js방문
Canvas 3D Graph3d graph보기canvasX무료방문
CanvasJS종합보기canvasO조건부 무료non-commercial 무료, 유료 가격은 1 developer $299 ~방문
canvasXpress종합보기canvasX무료방문
Chart.js종합보기canvasO무료방문
Crossletmap보기svgX무료D3.js방문
Cubism.jstime series보기svgX무료D3.js방문
Cytoscape.jsgraph보기canvasX무료jQuery방문
D3.js종합보기svgX무료방문
DataTablesdatagrid보기tableO무료jQuery방문
dc.jsdimensional chart보기svgX무료D3.js방문
DHTMLX종합보기canvasO조건부 무료기본 version 무료, 유료 가격은 1 domain Pro version $466 ~방문
dygraphs종합보기canvasO무료방문
EASY PIE CHARTpie chart보기canvasO무료jQuery방문
Ember Timetreetimetree보기svgX무료Ember.js, D3.js방문
Flexigriddatagrid보기tableO무료jQuery방문
Flot종합보기canvasO무료jQuery방문
Flotr2종합보기canvasO무료방문
Fuel UX Datagriddatagrid보기tableO무료Twitter Bootstrap방문
Fusion Tables종합보기svgO무료Google APIs Terms of Service를 따름Google방문
FusionCharts종합보기svgO조건부 무료무료 flash version 따로 있음, 유료 가격은 1 domain $399 ~방문
Google Chart Tools종합보기svgO무료Google방문
gRaphaël종합보기svgO무료Raphaël방문
Griddatagrid보기tableO무료방문
Handsontabledatagrid보기tableO무료jQuery방문
heatmap.jsheatmap보기canvasX무료방문
Highcharts종합보기svgO조건부 무료non-commercial 무료, 유료 가격은 1 domain $90 ~방문
JavaScript InfoVis Toolkit종합보기canvasO무료방문
jChartFX종합보기svgX무료방문
JointJSdiagram보기svgX무료방문
jOrgChartorganization chart보기tableX무료jQuery방문
jqGriddatagrid보기tableO조건부 무료무료 version 따로 있음, 유료 가격은 1 developer $300 ~jQuery방문
jqPlot종합보기canvasO무료jQuery방문
jQuery HighchartsTabletable -> chart보기svgO무료Highcharts, jQuery방문
jQuery Sparklinesinline chart보기canvasO무료jQuery방문
jQuery Timelinrtimeline보기divO무료jQuery방문
jquery-orgchartorganization chart보기tableO무료jQuery방문
jQuery.Ganttgantt chart보기divO무료jQuery방문
jqxChart종합보기svgO조건부 무료non-commercial 무료, 유료 가격은 1 domain $99 ~jQuery방문
jqxGriddatagrid보기divO조건부 무료non-commercial 무료, 유료 가격은 1 domain $99 ~jQuery방문
JS Sequence Diagramsdiagram보기svgO무료Raphaël방문
JScharts종합보기canvasO조건부 무료워터마크포함 무료, 유료 가격은 1 domain non-commerical $39 ~방문
jStat통계보기canvasO무료MATLAB, R, jQuery방문
JSXGraphmath diagram보기svgX무료방문
jui_datagriddatagrid보기tableO무료jQuery방문
Kendo UI DataViz종합보기svgO유료$399Kendo UI방문
KeyLinesnetwork보기canvasO유료가격 문의방문
Leafletmap보기divO무료OpenStreetMap방문
leaflet-dvfmap보기divX무료Leaflet, OpenStreetMap방문
Magic Tabledatagrid보기canvasX무료방문
Magna Chartatable -> chart보기divO무료jQuery방문
MathBoxmath diagram보기canvasX무료Three.js, tQuery방문
Morris.js종합보기svgO무료Raphaël방문
ng-griddatagrid보기divX무료jQuery, AngularJS방문
NVD3종합보기svgX무료D3.js방문
Open JS Griddatagrid보기divX무료jQuery방문
ParamQuerydatagrid보기tableO무료jQuery방문
Planetary.jsmap보기svgX무료D3.js방문
Polymapsmap보기svgX무료OpenStreetMap방문
Processing.js종합보기canvasX무료Processing방문
Red Dwarfheatmap보기Google MapsO무료Google방문
RGraph종합보기canvasO무료방문
Rickshawtime series보기svgX무료D3.js방문
sigma.jsnetwork보기canvasX무료방문
SlickGriddatagrid보기divO무료방문
SpreadJSdatagrid보기canvasX유료$499, 구매전 다운받아 기간제한 없이 평가판 사용, 구매후 프로젝트 개수 제한 없음WIJMO, jQuery방문
Springy.jsforce directed보기canvasX무료방문
timecharttime series보기canvasX조건부 무료non-commercial 무료, 유료 가격은 미정방문
TimelineJStimeline보기divO무료방문
TreeGrid Gantt chartgantt chart보기divO유료One server 10 web pages $600 ~방문
Twproject Ganttgantt chart보기svgX무료jQuery방문
WebGL Heatmapheatmap보기canvasX무료방문
WIJMO종합보기svgO유료$499, 구매전 다운받아 기간제한 없이 평가판 사용, 구매후 프로젝트 개수 제한 없음방문
xCharts종합보기svgX무료D3.js방문

수정해야할 내용이 있거나, 추가하고 싶은 라이브러리가 있으시면 댓글을 남겨주십시오

참고문서


출처 : http://codefactory.kr/data-visualization-libraries/

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

특정 OS에서 톰캣을 구동시에 request.getRemoteAddr()을 호출하면 IPv6 주소를 리턴하는 경우가 있는데

이를 IPv4로 받으려면 -Djava.net.preferIPv4Stack=true 옵션을 넣어줘야 합니다.


[이클립스 설정]

1. Run - Run Configurations 메뉴 선택

2. Apache Tomcat 하위에 설정하고자 하는 톰캣서버 선택

3. Arguments 탭 선택

4. VM arguments 젤 뒤에 -Djava.net.preferIPv4Stack=true 옵션 추가

5. Apply


[톱캣 설정]

1. 톰캣이 설치되어 있는 ROOT → bin → catalina.bat를 에디터로 열기

2. set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% 뒤에 위와 같이 옵션을 추가 합니다.



출처 : http://tskwon.tistory.com/272

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

웹 개발을 하다보면 접속하는 사용자의 정보를 확인하기 위해서 CLIENT IP를 수집하는 경우가 있습니다.
하지만 접속하는 클라이언트가 PROXY SERVER를 사용하거나, 내부적으로 LOAD BALANCER를 하고 있다면 접속하는 클라이언트의 실제 IP를 수집하는 것이 아니라 웹 서버에 접속하는 바로 직전의 IP를 수집하게 될 것입니다.

그렇다면 그 정보는 정확한 정보가 아닌 쓰레기 정보라고 할 수 있겠죠?
그래서 접속하는 클라이언트의 실제 IP를 수집하는 방법을 설명 하려고 합니다.

먼저 보편적인 클라이언트 IP를 수집하는 방법입니다.

그렇다면 PROXY SERVER 또는 LOAD BALANCER를 거쳐나온 클라이언트의 IP는 어떻게 구할까요?

대부분의 이런 경우에는 CLIENT IP가 없어지는 것이 아니라 Request의 헤더에 X-FORWARDED_FOR라는 키워드로 정보를 남겨 놓는다고 합니다. 그래서 자바내의 로직을 처리하실 때는 다음과 같이 하시면 됩니다.

위의 자료는 STCreative에서 개발을 하면서 겪었던 일을 기반으로 작성된 자료입니다.
모두 100%정확하다는 편견을 버려주십시요.
확인해 보시고 에러가 발생한다면 디버깅과 함께 해결 방법을 적어주시면 수정하도록 하겠습니다.

출처 : http://blog.stclab.co.kr/?p=6




메소드로 구현 해 놓기


public String getClientIP(HttpServletRequest request) {


    String ip = request.getHeader("X-FORWARDED-FOR"); 

    

    if (ip == null || ip.length() == 0) {
        ip = request.getHeader("Proxy-Client-IP");
    }


    if (ip == null || ip.length() == 0) {
        ip = request.getHeader("WL-Proxy-Client-IP");  // 웹로직
    }


    if (ip == null || ip.length() == 0) {
        ip = request.getRemoteAddr() ;
    }

    

    return ip;

}

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거
<c:set var="a" value="${L_att}" />
<c:set var="b" value="${'99999'}" />
      <c:set var="c" value="${'99999'}" />


<%

int a = (Integer)pageContext.getAttribute("a");

%>

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

무조건 json 파일 형식으로만 파일을 뽑으면 된다.

나는 그래서 jstl을 사용하여 Json 파일을 만들어봤다.


기본적으로 이동은

jsp <--> Dao <--> Manager <--> Mapper 로 이동한다.


JSON 으로 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<%@page import="dto.Chap07Dto"%>
<%@page import="dao.Chap07Dao"%>
<%@page import="java.util.List"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 
 
<%-- ---------------------------------  jSon용으로 출력 -------------------------------------------%>
    
    <jsp:useBean id="dto" class="dto.Chap07Dto">    <%-- dto 객체 생성 --%>
        <jsp:setProperty property="*" name="dto"/>    <%-- dto 객체 다 받아옴 --%>
    </jsp:useBean>
    <%
        Chap07Dao dao = new Chap07Dao();    // dao객체 생성
        List<Chap07Dto> list = dao.getList();    // list변수에 dao의 getList 사용
        request.setAttribute("list", list);    
    %>
    
            <%-- json용으로 뿌려준다 --%>
        
        [
        <c:forEach items="${list }" var="v1" varStatus="i">    <%-- 위에서 만들 list를 뿌려줄 준비 --%>
            <c:if test="${!i.first }">,</c:if>    <%-- 만약 i 가 처음이 아니면 , 을 뿌려준다. --%>
            {
                "id" : "${v1.id }",
                "name" : "${v1.name }",
                "content" :"${v1.content }"
            }
        </c:forEach>
        ]



여기서 중요한건 25 ~ 34줄이다. 

나 같은 경우는

 [ { "id" : "1", "name" : "name", "content" :"content" } , { "id" : "2", "name" : "하이", "content" :"테스트1" } , { "id" : "3", "name" : "jsp", "content" :"콘텐츠" } ]

이런식으로 나온다.


14 ~21줄은 dao에서 mybatis를 거쳐 db의 자료를 가져오는 작업이다.



Ajax에서의 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript">
        $(document).ready(function () {
            // $.ajax()에서 반복 사용하는 속성을 상단에 설정 후 $.ajax에서 상속받아 사용
            $.ajaxSetup({
                url: "./commentlist.jsp",
                dataType: "json"
            });
            
            $.ajax({
                success: function (data) {
                    $.each(data, function () {
                        $('#tblList').append("<tr><td>" + this.id + "</td><td>"
                            + this["name"] + "</td></tr>");
                    });
                }
            });
        });
    </script>
</head>
<body>
    <table id="tblList" border="1"></table>
</body>
</html>


url = json파일의 위치



chap07Dao.java   -  Dao


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package dao;
 
import java.util.List;
 
import mybatis.Chap07Manager;
 
public class Chap07Dao
{
 
    public List getList() 
    {
        List list = Chap07Manager.getList();
        return list;
    }
}
 





Chap07Manager.java   -  Manager



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package mybatis;
 
import dto.Chap07Dto;
 
import java.io.Reader;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.sql.SQLException;
 
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 
public class Chap07Manager {
 
    private static SqlSessionFactory sqlMapper;
 
    static {
        try {
            Reader reader = Resources.getResourceAsReader("mybatis/SqlMapConfig.xml"); // classes
                                                                                // 폴더안에있으면
                                                                                // 경로가
                                                                                // 없어도된다.
            sqlMapper = new SqlSessionFactoryBuilder().build(reader);
            reader.close();
        } catch (IOException e) {
            // Fail fast.
            throw new RuntimeException(
                    "Something bad happened while building the SqlMapClient instance."
                            + e, e);
        }
    }
 
    public static List getList() 
    {
        System.out.println("Chap07Manager 의 getList");
        List list = null;
        
        SqlSession session = sqlMapper.openSession();
        list = session.selectList("getList");
        session.commit();
        session.close();
        return list;
    }
    
    
 
    
 
}
 



Chap07Mapper.xml   -  Mapper


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8" ?>
 
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="mybatis.Chap07Mapper">
 
  
  <!-- Select with no parameters using the result map for Account class. -->
  <select id="getList" resultType="Chap07Dto">    <!-- value값이 resultMap 값으로 사용가능  //만약 SqlMapConfig에서 typeAliases를 지정해주지않았으면 패키지이름까지 다 써줘야된다.-->
    select * from COMMENT order by ID
  </select>
  
  
  
  
 
</mapper>


Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

[MySQL날짜 차이 구하기

※ 경고
높이뜬새의 모르는 사람이 없는 팁시리즈 입니다.
이 팁시리즈는 지면낭비라는 항의시에 즉각 중단됩니다.

MySQL에서 날짜간의 차이를 구하기 위해서는 TO_DAYS 함수를 사용하시면 됩니다. TO_DAY 함수는 TO_SECONDS 함수처럼 지원하는 버전대가 있는 것도 아니라서 MySQL 버전이 몇이든 상관없이 사용하실 수 있습니다.



형식) MySQL프롬프트> SELECT TO_DAYS(DATE) - TO_DAYS(DATE);


예) 2010년 2월15일과 2010년1월25일의 차이 구하기

mysql> SELECT TO_DAYS('2010-02-15') - TO_DAYS('2010-01-15' ) AS CHA;

예) 2010년의 설날연휴인 2010년 2월13일은 오늘부터 몇 일 남았나 구하기

mysql> SELECT TO_DAYS('2010-02-13') - TO_DAYS(now()) AS CHA;


※ TO_DAYS 함수는 기본 인자로 DATE 형을 취하기 때문에 아래와 같이 CAST함수를 이용해서 DATE형으로 형변환 해서 쓰실 수도 있습니다.


mysql> SELECT TO_DAYS(CAST('2010-03-01' AS DATE)) - TO_DAYS(CAST('2010-01-25' AS DATE)) AS CHA;






테이블 이름에서 근무일이 300일 미만을 출력해라

select * from테이블이름 where to_days(now())-to_days(근무시작일) < 300

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거