출처 : https://stackoverflow.com/questions/2157282/generate-days-from-date-range
-- STR_TO_DATE 파라미터에 들어가는 날짜 역순으로 해서 최대 1000개 row를 생성하여 조회조건으로 걸러낸다.
SELECT DT.YYYYMMDD |
-- 현재 날짜 역순으로 해서 최대 1000개 row를 생성하여 조회조건으로 걸러낸다.
SELECT DT.YYYYMMDD |
출처 : https://stackoverflow.com/questions/2157282/generate-days-from-date-range
-- STR_TO_DATE 파라미터에 들어가는 날짜 역순으로 해서 최대 1000개 row를 생성하여 조회조건으로 걸러낸다.
SELECT DT.YYYYMMDD |
-- 현재 날짜 역순으로 해서 최대 1000개 row를 생성하여 조회조건으로 걸러낸다.
SELECT DT.YYYYMMDD |
출처 : http://blog.kurien.co.kr/116
Gimp : https://www.gimp.org/
Gimp Korea : http://gimp.kr
Gimp 문서 : https://docs.gimp.org/ko/
김프란?
GIMP 는 많은 플랫폼에서 사용가능한 사진 편집 프로그램으로 GNU Image Manipulation Program 의 약자입니다. GIMP는 사진 편집이나 이미지 생성 및 편집 등 다양한 이미지 편집 작업을 하기에 적절한 프로그램입니다.
김프는 간단한 페인트 프로그램, 전문적인 사진 편집 프로그램, 온라인 배치 프로세싱 시스템, 대량의 이미지 렌더링, 이미지 포맷 변환기 등의 다양한 용도로 사용할 수 있습니다.
김프는 확장성이 뛰어나며 유연합니다. 플러그인과 확장기능의 추가로 어떠한 일도 할 수 있도록 디자인되었습니다. 발전된 스크립팅 인터페이스는 간단한 작업부터 굉장히 복잡한 이미지 편집 작업까지 모든 것을 할 수 있는 스크립트를 쉽게 작성할 수 있게 해줍니다.
김프의 장점 중 하나는 많은 소스로부터 다양한 운영체제를 위한 기능들을 제공받을 수 있다는 점입니다. 대부분의 GNU/Linux 배포판에서는 GIMP를 기본 프로그램으로 포함합니다. 또한 Microsoft Windows™ 나 Apple 사의 Mac OS X™(Darwin) 등의 다른 운영체제에서도 사용할 수 있습니다. 하지만 김프는 공짜 프로그램이 아닙니다. General Public License( GPL license, GNU 일반 공중 사용 허가서)에 의해 보호되는 공개 프로그램입니다. GPL 은 사용자로 하여금 프로그램 소스에 대한 자유로운 접근과 수정을 허용합니다.
이렇게 여러가지의 장점이 있습니다.
몇가지만 말해보자면, 가장 중요한건 먼저 오픈소스 프로그램으로 "무료"이구요!
한글 지원이 되어있어 따로 한글 패치가 필요없습니다!
사용자가 직접 플러그인을 확장하여 어떤 기능이든 만들어 사용하는것도 가능합니다.
그리고 Windows, Mac OS, Linux 모든 OS에서 사용이 가능하죠.
기본 기능만 하더라도 포토샵과 큰 차이가 없습니다.
포토샵에 있는 영역선택, 올가미, 마법봉, 펜 툴, 색 선택, 색상 추출, 확대, 글꼴, 자유변형, 붓, 펜, 복원도구, 흐림, 선명하게, 문지르기, 닷지, 번 등
다 적진 못했지만 이것 외에도 무지 많은 기능이 있습니다.
포토샵 못지 않게 많은 기능, 포토샵에도 없는 다양한 기능이 있습니다.
도구상자와 레이어 창이 따로 선택되어서 작업에도 편하구요
메모리도 포토샵에 비해 월등히 적게 먹습니다.
왠만한 게임 다 돌리는 컴퓨터에서도 포토샵을 쓰면 언제나 느리더라구요...
김프는 그럴 걱정이 없어요!
그리고 포토샵을 다운받는 이유가 포토샵 고유 확장자인 PSD 파일 때문이신분!
김프는 PSD도 걱정 없이 돌아갑니다.
지금 위의 이미지가 이미지 아래 있는 PSD 파일을 김프로 열었던 이미지입니다.
문제 없이 실행이 되는걸 볼 수 있습니다!
다운로드는 아래의 주소에서 가능하시구요.
영어 울렁증이신분은 주황색 HTTP만 눌러주시면 다운로드 가능합니다^^
Gimp 다운로드 하기 : http://www.gimp.org/
다운받으시고 난 후에 설치하시면 그냥 다음만 눌러주시면 되는데요!
시작할 때 language 설정이 있습니다.
기본이 English인데 한국어가 없는걸 보고 영어로 설치되는거 아니냐! 라고 생각하시는분들이 계실것 같아 말씀드리지만,
어떤 언어를 선택하시더라도 결과는 한국어입니다.
시작할 때 물어보는 언어는 설치 프로그램 언어이니 걱정말구 설치하세요!
포토샵과는 다른점이 있어서 어려워 하시는 분들을 위해서 김프 강좌 사이트인 김프 코리아 주소를 올려드릴께요.
김프코리아 주소 : http://www.gimp.kr/
이렇게 이미지 수정이 가능합니다.
이 프로그램은 오픈소스 프로그램으로 집, 회사, 관공서 어디서든 무료로 이용하실 수 있습니다!
무료 이미지 편집 프로그램, 이젠 가격 걱정 마시고 김프(Gimp)를 써보세요!
출처 : https://velopert.com/1712
이전부터 Sass 의 존재를 알고있었고,배우고싶었는데, 미뤄오셨나요? 그렇다면 잘 오셨습니다.
이 포스트에서는 Sass 의 특징에 대하여 알아보고, Sass 로 할 수 있는 멋진 것들을 알아볼테니까요.
Sass (Syntactically Awesome Style Sheets : 문법적으로 짱 멋진 스타일시트) 는 CSS pre-processor 로서, 복잡한 작업을 쉽게 할 수 있게 해주고, 코드의 재활용성을 높여줄 뿐 만 아니라, 코드의 가독성을 높여주어 유지보수를 쉽게해줍니다.
CSS pre-processor 란?
CSS 를 확장하는 스크립팅 언어로서, 컴파일러를 통하여 브라우저에서 사용 할 수 있는 일반 CSS 문법 형태로 변환합니다
SASS 를 컴파일하는방법은 여러가지가 있습니다:
gem install sass
로 설치하고,sass style.scss style.css
로 컴파일한다.어떤걸 선택해야하냐구요? 여러분이 무엇을 만드는지, 어떤 환경에서 작업하는지에 따라 다릅니다.
저는 빠른 컴파일속도를 선호하고, Node.js 환경에서 작업을 하므로 node 환경에서 libsass 를 사용 할 수 있게 해주는 node-sass 를 사용합니다.
# NPM 을 통하여 node-sass 글로벌 설치
$ sudo npm install -g node-sass
# 컴파일하여 현재 디렉토리에 저장
$ node-sass style.scss -o .
# style.scss 파일에 변화가 있을 떄 마다 자동으로 리컴파일
$ node-sass style.scss -w -o .
성능 차이
libsass 이 오리지널 Ruby Sass 에 비하여 훨씬 빠른 성능을 지니고 있습니다.
주의: libsass는 Ruby Sass 의 기능의 100% 를 지원하지는 않습니다 지금 시점으로는 모든 기능이 지원되기는 합니다.
허나, Ruby Sass 가 업데이트 되었을 때는, LibSass 역시 업데이트 될 때까지 기다려야합니다.
이에 대한 자세한 내용은 Sass Compatibility 를 참고하세요.
그냥 공부만 하거나, 예제를 만들어 공유하고싶은 분들께는 Sassmeister 를 사용하는것을 추천드립니다.
웹상에서 SASS 코드를 CSS 를 변화해주는 웹서비스이며, 예제를 만들어 공유 할 수도있습니다.
Sass 가 처음 릴리즈 되었을 때, 주 문법은 CSS와 많이 달랐습니다. 괄호 { }
대신 들여쓰기 (indentation) 을 사용하였으며 세미콜론 ;
을 사용하지 않고 단축 연산자를 사용하였습니다.
대략 다음과 같은 형태이지요.
=myclass // = means @ mixin
font-size: 12px
p
+myclass // + means @include
그 시절, 일부 개발자는 이 새로운 문법에 익숙하지 않아서, Sass 버전 3 이상부터는 주 문법이 .scss 로 변경되었습니다.
SCSS 는 CSS 의 상위집합으로서, CSS와 동일한 문법으로 SASS 의 특별한 기능들이 추가되어있습니다.
이 강좌에서는 .scss 문법을 사용하도록 하겠습니다. (오리지널 문법도 아직까지 지원되므로, 옛날 문법이 맘에 드시는분들은 그 문법을 사용해도 됩니다)
Sass의 주석이 CSS 와 다른점은 한 줄 주석이 추가되었다는 점 입니다.
한 줄 주석은 // 로 표기하며, CSS로 컴파일 되었을 때 나타나지 않습니다
여러 줄 주석은 CSS 와 동일하며 CSS 로 컴파일 되었을 때 나타납니다.
Sass
/* You can See me */
// You can't see me
/* You
Can
See
Mee
*/
CSS
/* You can See me */
/* You
Can
See
Mee
*/
Sass 는 CSS에 변수 개념을 도입해줍니다.
변수로 사용 가능한 형태는 숫자, 문자열, 폰트, 색상, null, lists 와 maps 가 있습니다.
변수를 사용 할 떄는 $
문자를 사용합니다. 첫 변수를 한번 만들어볼까요?
Sass
$primary-color: #333;
CSS
변수를 만들어도, 사용하지 않으면 컴파일된 CSS 파일에는 아무것도 나타나지 않습니다.
한번 body 에서 사용을 해봅시다.
Sass
$primary-color: #333;
body {
background-color: $primary-color;
}
CSS
body {
background-color: #333;
}
Sass 의 변수엔 변수범위가 있습니다. 변수를 특정 selector (선택자) 에서 선언하면 해당 selector 에서만 접근이 가능합니다.
Sass
$primary-color: #333;
body {
$primary-color: #eee;
background-color: $primary-color;
}
p {
color: $primary-color;
}
CSS
body {
background-color: #eee;
}
p {
color: #333;
}
변수를 선언 할 때, 변수를 global (전역) 하게 설정 할 때는 !global
플래그를 사용합니다.
Sass
$primary-color: #333;
body {
$primary-color: #eee !global;;
background-color: $primary-color;
}
p {
color: $primary-color;
}
CSS
body {
background-color: #eee;
}
p {
color: #eee;
}
추가적으로, !default
플래그는 해당 변수가 설정되지 않았거나 값이 null 일떄 값을 설정합니다.
이 플래그는 나중에 mixin 을 작성 할 떄 유용하게 사용됩니다. (mixin 에 대한 설명은 강좌 하단부에 있습니다)
Sass
$primary-color: #333;
$primary-color: $eee !default;
p {
color: $primary-color;
}
CSS
p {
color: #333;
}
Sass 에서는 수학 연산자들을 사용 할 수 있습니다. 지원되는 연산자들은 다음과 같습니다:
Operator | Description |
---|---|
+ | addition |
- | subtraction |
/ | division |
* | multiplication |
% | modulo |
== | equality |
!= | inequality |
주의하실점은, +
, -
operator 를 사용 할 떄는 단위를 언제나 통일시켜야합니다.
예를들어, 다음과 같은 코드는 오류가 발생하게됩니다: $box-width: 100% - 20px
이런 작업을 해야한다면 css 의 calc()
함수를 사용해야합니다.
다음과 같은 식은 오류 없이 작동합니다: $box-width: 300px / 960px * 100%
Sass
.container { width: 100%; }
article[role="main"] {
float: left;
width: 600px / 960px * 100%;
}
aside[role="complementary"] {
float: right;
width: 300px / 960px * 100%;
}
CSS
.container {
width: 100%;
}
article[role="main"] {
float: left;
width: 62.5%;
}
aside[role="complementary"] {
float: right;
width: 31.25%;
}
이전에 여러분들이 CSS 작업을 하실 때, 멋진 버튼을 만드려고 컬러 팔레트 툴로 적절한 그림자 색깔을 찾으려고 노력한적이 있으신가요?
그런 여러분들께 darken()
함수를 소개합니다!
이 함수는 특정 색깔과, 얼마나 어둡게 할지 인수로 던져주면 자동으로 색상을 계산해서 나타내줍니다.
See
the Pen <a
href="http://codepen.io/velopert/pen/MewQvp/">MewQvp</a> by
velopert (<a
href="http://codepen.io/velopert">@velopert</a>) on <a
href="http://codepen.io">CodePen</a>.<br />
(위 예제에서 사용된 &
문자에 대한 설명은 다음 섹션에서 설명됩니다)
이 함수 외에도, 많은 유용한 함수들이 엄청 많습니다. 모든 내장함수들의 목록은 여기서 확인 할 수 있습니다.
색깔에 관한 함수들의 보이는 예제는 Jackie Balzer 의 Visual Guide to Sass & Compass Color Functions 에서 확인 할 수 있습니다.
Sass 의 매우 유용한 기능중 하나는 선언을 중첩시킬 수 있다는 것 입니다. 어떻게 작동하는지, 또 어떤점을 주의해야 할 지 알아봅시다.
일반 CSS 에선 특정 선택자 안의 선택자를 스타일링 하려면 이렇게 했었죠?
/* CSS */
.container {
width: 100%;
}
.container h1 {
color: red;
}
간단한 CSS 면, 큰 문제는 없지만, CSS 파일이 커지면 유지보수가 어려워지죠..
Sass 에선, 이런식으로 작성하면 위와 같은 결과물을 얻을 수 있게 됩니다!
/* Sass */
.container {
width: 100%;
h1 {
color: red;
}
}
부모 선택자를 리퍼런스 할떄는 &
문자를 사용합니다. (내장함수 예제에서도 이 문자가 사용됐었죠?)
Sass
a {
color: black;
&:hover {
text-decoration: underline;
color: gray;
}
&:visited {
color: purple;
}
}
CSS
a {
color: black;
}
a:hover {
text-decoration: underline;
color: gray;
}
a:visited {
color: purple;
}
코드 중첩을 하는건 위와같이 하면 됩니다. 하지만 중첩에서 벗어나려면 (de-nest) 어떻게 할까요? 예를들어.. 다음과 같은 코드가 있을 때
/* Sass */
.container {
.child {
color: blue;
}
.sibling {
color: gray;
}
}
sibling 클래스가 container 클래스 밖에서도 사용되는것을 알게되었을땐, @at-root
directive (지시자) 를 사용합니다.
Sass
.container {
.child {
color: blue;
}
@at-root .sibling {
color: gray;
}
}
CSS
.container .child {
color: blue;
}
.sibling {
color: gray;
}
위는 그냥 사실 사용 예제일 뿐이고 사실상 이런 상황이 오면 코드를 잘라내서 밖에 붙여넣는게 맞죠.
보통 @at-root 는 Sass 코드를 깔끔하게 정리하면서 작성 할 때 사용됩니다 (참조링크: Writing modular CSS (BEM/OOCSS) selectors with Sass 3.3)
인셉션 규칙: Sass 코드 중첩을 할 때, 4 레벨 보다 깊게 들어가지 말 것
영화 인셉션에서 보면, 레벨 5의 꿈을 꾸게 될 땐 림보에 빠져서 개고생하게되죠..
더 깊게 들어간다고해서 오류가 나거나 Sass 개발자가 화를 내지는 않겠지만.. 코드가 복잡해질 확률이 높고 유지보수가 어려워집니다.
자세한 내용은 제목부분의 링크를 클릭하여 참조하세요.
import 기능은 스타일들을 여러 파일들로 나누고, 다른 파일에서 불러와서 사용하는 기능입니다.
다음과 같이 @import
directive 를 사용하여 특정.scss 파일을 불러 올 수 있습니다:
@import "layout.scss";
참고로, 확장자를 붙이지 않아도 됩니다.
@import "layout";
partial 기능에 대하여 알아봅시다.
만약에 .sass 파일이나 .scss 파일의 파일이름을 underscore _
로 시작하면 css 파일로 따로 컴파일되지 않습니다.
html 에서 해당 css 파일을 불러올일이 없고, import 만 되는경우에는이 기능을 사용하세요.
Sass 에서 특정 선택자를 상속 할 때, @extend
directive를 사용합니다.
Sass
.box {
border: 1px solid gray;
padding: 10px;
display: inline-block;
}
.success-box {
@extend .box;
border: 1px solid green;
}
CSS
.box, .success-box {
border: 1px solid gray;
padding: 10px;
display: inline-block;
}
.success-box {
border: 1px solid green;
}
Placeholder 선택자 %
를 사용하면 상속은 할 수 있지만 해당 선택자는 컴파일되지 않습니다.
Sass
%box {
padding: 0.5em;
}
.success-box {
@extend %box;
color: green;
}
.error-box {
@extend %box;
color: red;
}
CSS
.success-box, .error-box {
padding: 0.5em;
}
.success-box {
color: green;
}
.error-box {
color: red;
}
Mixin 은 Sass 의 아주 유용한 기능 중 하나인데요, extend 와 비슷하지만 argument (인수) 를 받을 수 있습니다.
mixin 을 선언 할 떄는 @mixin
directive 를 사용하며, 이를 사용 할 때는 @include
directive 를 사용합니다.
Sass
@mixin headline ($color, $size) {
color: $color;
font-size: $size;
}
h1 {
@include headline(green, 12px);
}
CSS
h1 {
color: green;
font-size: 12px;
}
Mixin 을 응용하면 이런식으로도 사용 가능합니다:
Sass
@mixin media($queryString){
@media #{$queryString} {
@content;
}
}
.container {
width: 900px;
@include media("(max-width: 767px)"){
width: 100%;
}
}
CSS
.container {
width: 900px;
}
@media (max-width: 767px) {
.container {
width: 100%;
}
}
워우워우… 갑자기 처음보는 표현들이 좀 나왔죠? 당황하지 마세요, 설명해드리겠습니다.
#{ }
표현은 특정 문자열을 따로 처리하지않고 그대로 출력 할 때 사용됩니다.
@content
directive 를 사용하면 나중에 @include
하였을 때, 그 선택자 내부의 내용들이 @conent
부분에 나타나게됩니다.
Built-in Function 과는 달리 이부분은 임의 함수입니다.
Function은 위에서 소개한 mixin 과도 사뭇 비슷한데요, 차이점은 mixin 은 style markup 을 반환하지만, function 은 @return
directive 를 통하여 값 을 반환합니다.
Function을 선언 할 때는, 예상하셨겠지만! @function
directive 를 사용합니다.
Sass
@function calc-percent($target, $container) {
@return ($target / $container) * 100%;
}
@function cp($target, $container) {
@return calc-percent($target, $container);
}
.my-module {
width: calc-percent(650px, 1000px);
}
CSS
.my-module {
width: 65%;
}
꿀 팁: 자주 사용 할 것 같은 함수는 위와같이 단축함수를 만들어 사용하세요. 그런다고해서 결과물의 용량이 늘어나지는 않으니까요.
여기까지 다 읽으셨다면 Sass 에 대해 어느정도 배운 것 같다.. 고 생각 하실 수 있지만, 그건 큰 오산입니다! Sass 의 기본적인 기능에 대하여 대부분 소개한건 사실 이지만 이 강좌에서 다룬건 그저 빙산의 일각에 불과합니다. 왜, 그렇잖아요. CSS 도 속성 하나하나만 따지면 그렇게 대단 한 것도 아닌데 여러가지 속성들이 합쳐지면 엄청나게 멋진 UI를 만드는 것 처럼요.
Sass 에 대하여 더 배우고 싶으신 분들께 다음 링크를 추천해드리겠습니다.
그럼, 즐거운 Sassing 되세요 🙂
Refrences
- “Sass Basics”. Sass.
- “Getting Started With Sass”. Scotch.io
- “The Sass Ampersand”. CSS-Tricks.
- “The Inception Rule”. The Sass Way.
- “Understanding placeholder selector”. The Sass Way.
- “Sass Basics: The Mixin Directive”. SitePoint
- “Pure Sass Functions”. The Sass Way.
출처 : http://devlsh.tistory.com/entry/Java-Naming-Convention
아주 오래전에 읽었봤었지만 그때는 중요성도 모르고 그저 그런가보다 하고 지나갔던 코딩컨벤션
특히 네이밍이 코딩에서 가장 어려운 일이라는 걸 느껴본 사람이라면 다시 한번 보시길...
http://geosoft.no/development/javastyle.html
가장 중요한 말은 이 모든 규칙들은 가독성을 위해서라면 위반되어도 된다는 말.
Java naming은 아니지만 참고할만한 http://msdn.microsoft.com/en-us/library/xzf533w0(v=VS.71).aspx
Java Naming Conventions
참고 : https://www.lesstif.com/pages/viewpage.action?pageId=30277941
Chocolatey 는 Mac OS X 의 Homebrew 나 Linux 의 yum, apt-get 같은 역할을 수행하는 NuGet 기반의 윈도우용 패키지 관리자이다.
cmd.exe 를 열고 다음 명령어 실행
또는 powershell 을 실행한 후에 파워쉘 프롬프트에서 설치 명령어 입력
다른 경로에 설치할 경우 ChocolateyInstall 환경 변수에 설치할 폴더를 지정하고 수동으로 폴더 생성
https://chocolatey.org/packages 에서 패키지 검색하거나 cmd 에서 다음 명령어 입력
전체 패키지 목록
패키지에 대한 자세한 정보를 보려면 search 에 아래 옵션 추가
또는 위 명령의 축약어인 info 명령어 사용
출처 : http://forum.falinux.com/zbxe/index.php?document_srl=807633&mid=lecture_tip
참고 : http://kimseunghyun76.tistory.com/381
Java API : http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#addShutdownHook-java.lang.Thread-
Java에서 어플리케이션을 종료 될때 뭔가를 작업 하고 싶을 경우에 addShutdownHook이란 걸 사용 할 수 있습니다.
addShutdownHook은 VM에서 사라지기 전에 마지막 유언을 할 수 있게 해줍니다.^^;
Ctrl+C, 또는 kill명령으로 강제 종료가 될때도 실행이 됩니다. 위에서 말했듯 마지막 유언을 남기기 위해....
그럼 샘플 소스입니다.
[샘플 소스]
public class ShutdownHookDemo { static class ByeMessage extends Thread { public void run() { System.out.println("프로그램이 종료 되었습니다.!!!!"); } } public static void main(String[] args) { // 자바가 종료 될때 실행 시킬 쓰레드를 등록 시킴. Runtime.getRuntime().addShutdownHook(new ByeMessage()); try { // 프로그램 시작 메세지 System.out.println("프로그램 시작!!!!"); // 3초간 대기 함. System.out.println("대기 3초!!!"); Thread.sleep(3000); // 프로그램 종료 System.out.println("프로그램 종료!!!"); } catch(Exception e) { e.printStackTrace(); } } }
- 익명 (anonymous) class 사용
public class ShutdownHookDemo { public static void main(String[] args) { // 자바가 종료 될때 실행 시킬 쓰레드를 등록 시킴. Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { System.out.println("프로그램이 종료 되었습니다.!!!!"); } }); try { // 프로그램 시작 메세지 System.out.println("프로그램 시작!!!!"); // 3초간 대기 함. System.out.println("대기 3초!!!"); Thread.sleep(3000); // 프로그램 종료 System.out.println("프로그램 종료!!!"); } catch(Exception e) { e.printStackTrace(); } } }
[실행]
addShutdownHook에는 쓰레드가 등록 됩니다.
샘플에는 대기를 3초로 하고 이클립스에서 실행 시켜서 정상적으로 종료 하도록 하였지만,
커멘드창에서 프로그램을 실행 시킨후, 3초가 되기전에 Ctrl+C를 눌러 종료 시키면
"프로그램이 종료 되었습니다.!!!!"라는 메세지가 뜨고 "프로그램 종료!!!!"라는 메세지는 뜨지 않습니다.
* addShutdownHook 사용 시 주의점
- Shutdown hooks의 개수 : 제한 없다.
- Shutdown hook을 붙여야 하는 시점은 언제든지 붙여도 된다.
단순한 이야기 이지만, 셧다운 되기 전에 어떤 인스턴스든지 붙여놔야 겠지.
- 같은 hook을 다시 붙이는 것은 할수 없다."Hook previously rfegisted"라는 IllegalArgumentException이 발생한답니다.
- De-register a Hook : Runtime.removeShutdownHook 메소드를 호출하는 것 만으로, 훅을 제거 할 수 있다.
하지만 익명 내부 클래스를 사용해서 셧다운을 대부분 등록하는데, 이 것을 사용할수 있는 어떤 참조도 가질수 없기 때문에, 우리는 익명 내부 클래스를 우리가 제거할지 모르는 훅들에 대해서는 사용하면 안된다.
removeShutdownHook 메소드에 이 참조를 전달 해야하기 때문이랍니다.
- 동시성을 유지하는 것을 지켜요 : 앞서 말한대로.
- Shutdown Hook의 Reliability(신뢰도) : JVM은 최선을 다해 실행하겠지만, 모두 다 실행된다고 보장 할 수 없다고 한다.
- Hook들에 의한 시간 소비를 유의해라 : 셧다운 할 때 시간 소비 하지 않는것이 중요하다.
윈도우에서 cURL 설치 및 사용법
참고 : http://ilhee.tistory.com/25
Linux curl 참고 : http://tyboss.tistory.com/entry/Linux-curl-%EC%82%AC%EC%9A%A9%EB%B2%95
다운로드 : https://curl.haxx.se/download.html
목록 중 Win64 - Generic 항목에서 7zip으로 되어 있는 항목을 받는다.
압축을 해제하면 하위 경로에 curl.exe 파일이 있거나 하위 디렉토리 중 bin 디렉토리를 확인하면 있다.
cmd 창에서 해당 경로로 들어간 후 curl --help 로 확인가능하다.
Oracle 참고 : http://docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#BEIDHCBA
https://docs.oracle.com/cd/B12037_01/network.101/b10776/tnsnames.htm
오라클 SID, Service Name 차이 | Oracle개념용어정리
--------------------------------------------------------------------
지금껏 오라클을 사용하면서도 SID와 Service Name은 거의 구분해서 사용하지 않았다.
덕분에 최근까지는 SID와 Service의 차이를 인식하지 못하고 사용해 왔다.
사실 일반적인 테스트 환경이나 소규모의 경우 한개의 DB서버에 한개의 인스턴스만 사용한다.
이런 환경에서는 SID와 Service Name을 구분할 필요가 없었던것.
단순히 구분짓자면 이렇게 말할수 있다.
SID = DB 하나의 인스턴스
Service Name = 여러개의 인스턴스를 모아 하나의 서버 혹은 시스템을 구성한것
쉽게 예를 들어보자.
서버 한대에 인스턴스를 여러개 생성하여 orcl1, orcl2 로 각각 생성했다고 하자.
각각의 인스턴스는 orcl1, orcl2 라는 SID를 갖게 된다.
해당 서버에서 두개의 인스턴스를 묶어 사용할경우, orcl 이라는 Service Name을 갖을수 있다.
이외에도 서버 두대에 설치하여 각각 미러링 처리하여 동일한 서버인것 처럼 활용할경우
각각의 서버는 서로다른 SID를 갖게 되지만 Service Name을 동일하게 하여 같은 서버 처럼 활용할수 있다
[출처] 오라클 SID와 Service Name의 차이|작성자 도토리
DBMS 서버를 기동하기 위해서는 DB서버가 기동하는 서버의 IP 그리고
DB서버가 접속을 받아들이기 위한 프로토콜에 대한 정의가 필요합니다.
오라클의 경우 인스턴스가 서버 역할을 하는 DBMS프로세스인데,
인스턴스가 기동할때 SID를 필요로 합니다.
즉 SID는 인스턴스의 이름인 셈이지요.
SID가 필요한 이유는 한 서버(H/W)에 여러개의 인스턴스가 기동될 수 있으므로
구별하는 태그가 필요하겠지요. 따라서 SID는 DB서버에서 필요한 정보입니다.
SID정보는 환경변수와, LISTENER.ORA라는 파일에서 정의 됩니다.
DB에 접속하는 클라이언트 프로그램의 경우 접속하고자 하는 오라클 인스턴스 정보를
필요로 합니다. 클라이언트 프로그램이 접속하는데 필요한 정보는 서버IP, 오라클SID, 접속프로토콜
같은 정보가 필요하지요. 이러한 정보를 묶어서 서비스명으로 대표하고,
이 서비스명으로 클라이언트 프로그램이 서버에 접속하는데 사용합니다.
이 정보는 클라이언트쪽의 TNSNAMES.ORA라는 파일에 정의 되어있습니다.
출처 : 네이버 지식 검색 : 정확히는 모름(?)
instance, instantiate ; 인스턴스, 인스턴스화
--------------------------------------------------------------------
인스턴스는 추상화 개념 또는 클래스 객체, 컴퓨터 프로세스 등과 같은 템플릿이 실제 구현된 것이다.
인스턴스화는 클래스 내의 객체에 대해 특정한 변형을 정의하고, 이름을 붙인 다음, 그것을 물리적인
어떤 장소에 위치시키는 등의 작업을 통해, 인스턴스를 만드는 것을 의미한다.
1. 몇몇 필자들은, 객체지향 프로그래밍에서 클래스를 인스턴스화 한다는 것이, 클래스의 구체적인 인스턴스,
즉 객체를 만드는 것이라고 말한다. 그 객체는 컴퓨터 내에서 실행시킬 수 있는 실행 파일이다.
2. 객체지향 프로그램 언어인 자바에서는, 클래스로부터 인스턴스화된 객체를, 객체라는 말 대신에
역시 클래스라고 부름으로써 많은 사용자들을 혼란스럽게 한다. 즉 자바에서는, 특정한 클래스를
만들기 위해 클래스를 인스턴스화하며, 그것 역시 컴퓨터 내에서 동작하는 실행 파일이다.
3. 객체지향 프로그래밍 개념이 나오기 이전의 데이터 모델링이나 프로그래밍에서는, 인스턴스화라는 것이
관계형 데이터베이스 테이블 내에 새로운 엔트리를 만듦으로써 추상화된 객체로부터 실재(데이터가 들어있는)
객체를 만드는 것도, 한 가지 용례였다.
[출처] 오라클 SID, Service Name 차이 | Oracle개념용어정리 |작성자 용쓰
======================================================================
오라클(Oracle) SID 및 DB_NAME 확인 방법
출처 : http://pangate.com/665
jdbc 에서 thin 드라이버로 오라클에 접속할 때는 SID를 알아야 한다.
최근에는 SID로 직접 기술하여 접근하는 것보다는 service name 이라는 것을 tnsname.ora 파일에 지정해 놓고 이것을 사용한다. 아무래도 SID가 공개되는 것이 문제가 될 수 있을 것이다.
<tnsname.ora 의 작성 예>
서비스명과 인스턴스명과 데이타베이스명과 SID는 서로 비슷한 듯 하면서 약간 다르다.
일반적인 경우 데이타베이스가 하나만으로 구성 되어 있다면 데이타베이스명이 SID가 된다. 하지만 RAC 로 구성하여 데이타베이스 두개가 동시 가동되는 경우라면 이 SID 가 서로 다를 수 있기 때문에 중복 확인해야 한다.
JDBC 로 접속할 때 url 정보 작성 방법 :
url=jdbc:oracle:thin:@ip주소:포트:SID (url=jdbc:oracle:thin:@192.168.20.1:1521:ORCL)
아래의 예제에서 보면 RAC로 묶여 있는 경우 DATABASE NAME 과 실제 INSTANCE NAME 은 서로 다를 수 있다. 데이타베이스명은 ORCL 이지만 인스턴스명은 ORCL1 과 ORCL2 로 이름이 다름. thin 드라이브 URL 에서는 이 인스턴스명을 사용해야 한다.
======================================================================
SID
jdbc:oracle:thin:@서버IP:서버Port:SID
jdbc:oracle:thin:@//hostname:port:sid
Service Name
jdbc:oracle:thin:@서버IP:서버Port:ServiceName
jdbc:oracle:thin:@//hostname:port/serviceName
Thin 사용
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=서버IP)(PORT=서버Port)))(CONNECT_DATA=(SERVICE_NAME=ServiceName)))
출처 : http://gent.tistory.com/39
PL/SQL(Procedure, Package)을 사용하다 보면 동적으로 쿼리(Query)를 생성하거나 텍스트(text) 쿼리를 입력 받아서 실행해야하는 경우가 있다. 다음 두가지 방법을 적절히 사용하면 좋은 결과를 얻을수 있다.
EXECUTE IMMEDIATE : Inset, Update, Delete 구문을 실행하거나 Select 구문을 실행 시 INTO를 사용하여 단일 값을 리턴 받을 때 사용
OPEN-FOR : Select 구문을 실행 시 Cursor를 리턴 받을 때 사용
주의 : 바인드 변수(:) 사용 시 쿼리 내부에서 변수명은 의미가 없고 변수 순서, 개수가 USING의 변수 순서, 개수와 일치해야 한다. 바인드 변수가 없다면 USING는 생략가능.
1. EXECUTE IMMEDIATE (INSERT, UPDATE, DELETE 등 구문 실행)
CREATE OR REPLACE PROCEDURE
PC_SET_HOLIDAY ( in_hldy_dte in date
, in_hldy_nm in varchar2
, in_use_yn in varchar2)
IS
v_query varchar(1000);
d_sysdate date;
BEGIN
BEGIN
-- 단일 값을 리턴받을때
EXECUTE IMMEDIATE 'SELECT SYSDATE FROM DUAL' INTO d_sysdate;
END;
v_query := v_query || 'INSERT INTO HOLIDAY';
v_query := v_query || ' VALUES(:1,:2,:3,:4)';
BEGIN
-- INSERT, UPDATE, DELETE 구문 실행
EXECUTE IMMEDIATE v_query
USING in_hldy_dte, in_hldy_nm, in_use_yn, d_sysdate;
END;
END;
2. OPEN-FOR (CURSOR를 리턴 받을 때)
CREATE OR REPLACE PROCEDURE
PC_GET_HOLIDAY ( in_fromdate in varchar2
, in_todate in varchar2
, out_cursor out SYS_REFCURSOR)
IS
v_query varchar(1000);
BEGIN
v_query := v_query || 'SELECT HLDY_DTE, HLDY_NM';
v_query := v_query || ' FROM HOLIDAY';
v_query := v_query || ' WHERE HLDY_DTE BETWEEN :in_fromdate';
v_query := v_query || ' AND :in_todate';
BEGIN
-- CURSOR를 리턴 받을때
OPEN out_cursor FOR v_query
USING in_fromdate, in_todate;
END;
END;
-- SELECT 1건 샘플
DECLARE |
-- SELECT CURSOR 샘플
DECLARE |
참고 : http://blog.kjslab.com/20
1. 커서의 내용을 미리 정의 해 놓고 사용하는 방법
DECLARE / |
-- ROW 단위로 변수 정의
DECLARE |
-- ROW 단위로 변수 정의 후 COLUMN 단위로 사용
DECLARE |
-- COLUMN 단위로 변수 정의
DECLARE |
-- TYPE 정의
DECLARE |
2. 커서 변수를 미리 만들어 놓고 불러서 사용하는 방법
DECLARE |
3. 동적으로 커서를 생성해서 사용하는 방법
BEGIN |