priince의 등록된 링크

키자드에 등록된 총 201개의 포스트를 확인하실 수 있습니다.

Naver Blog

자바 다형성 알기 - 객체지향언어의 핵심

객체지향 언어에서의 디자인 패턴에 대한 글을 쓰면서 놓친 것이 있다.생각해 보니, 가장 기본이 되는 개념을 그냥 넘어간 거다.그렇다. 다형성이란 그런 거다. 이것을 이해하지 못하면 객체지향적인 프로그램을 할 수 없다. 객체지향적인 프로그램을 할 수 없다면 객체지향적인 사고를 할 수 없다.객체지향적인 사고를 할 수 없다면 디자인 패턴을 이해할 수 없다.그만큼 기본이 되고 중요한 개념이다.그런데, 이 개념은 요새 몇 가지 오해가 있는 것 같다.그 대표적인 예가 함수형 프로그래밍과 서버사이드 리액티브다.결론부터 얘기하자면, 자바는 객체지향언어다. 이 말이 모든 것을 대변한다. 자바를 쓰면서, 요새 누가 객체지향적으로.......

Naver Blog

[생물도감] 재규어 - 아마존의 최강자

고양잇과의 표범속에 속하는 종이다.고양잇과의 맹수 중에서도 당당히 최상위권에 이름을 올리는 녀석이다. 크기도 커서 고양잇과 중 호랑이, 사자와 더불어 제일 큰 종이다. 그것이 얼마나 크냐면 수컷의 경우 몸길이 1.8m에 몸무게가 180 정도다. 수컷 사자와 얼추 비슷한 것 같지만 조금 작은 크기라고 보면 된다. -_-;;;따라서, 표범과 헷갈릴 필요가 없다. 훨씬 크고 무겁다. 나란히 있으면 어른과 아이다. 표범은 눈을 깔아야 한다.(실제로는 서식지가 달라 마주칠 일이 거의 없다. @.@)이 녀석은 명실상부 아마존 생태계의 최강자다.이름의 유래도 '포식자'라고 한다.따라서, 눈치 볼 것이 없다. 먹이를 잡으면 그 자리에서 느.......

Naver Blog

핵무기 원리와 종류, 그 공포의 위력

핵폭발은 원자의 핵이 분열 또는 융합하면서 발생하는 엄청난 에너지가 방출되는 현상이다. 이 위력은 일반의 상상을 불허할 정도로 가공할 만하다. 이 원리를 이용해 무기로 만든 것을 모두 싸잡아 핵무기라고 한다.이러한 가공할 핵무기의 위력은 TNT로 환산해서 나타낸다.TNT(TriNitroToluen)는 폭발성의 화학물질로서 이것의 폭발력을 1로 보고, 폭발의 위력을 비교 측정하는 기준이 된다. 즉, 폭발로 발생하는 에너지를 TNT의 질량에 따른 폭발 에너지의 크기와 맞추어 비교 환산하는 것이다.예를 들어, 다이너마이트는 TNT 1.7의 위력을 가지며, 수류탄의 경우는 TNT 0.2 정도이다. 즉, 다이너마이트 1 그램의 폭발은 TNT 1.7과 맞먹.......

Naver Blog

[추천도서] 거의 모든 것의 역사

[저자 : 빌 브라이슨]빌 브라이슨은 미국 작가로, 주로 여행과 역사/과학에 대한 베스트셀러를 많이 쓴 유명인이다.미국인이지만, 영국에서 오래 거주했고, 지금도 영국에서 살고 있다.영국 타임스 등에서 기자 생활을 오래 했는데, 이 경력이 그의 취재와 글 솜씨에 큰 영향을 주지 않았을까 생각한다.이 책도 유명하길래 산 책이다.빌 브라이슨의 책 중 처음 읽은 책이며, 이 작가를 좋아하게 만든 책이기도 하다.처음에는 이 책이 어떻게 역사를 거의 모두 담았을까 의아했다. 한 권의 책으로 역사적인 사건들을 짧게 요약하여 쓴 것인가?라는 생각을 하며 산 것이다. 실제로 이렇게 했다면, 그리 재밌지는 않았을 것 같다. 물론 재미있을.......

Naver Blog

케플러의 법칙 알기 - 행성 운동의 법칙

케플러는 독일의 천문학자로, 행성 운동에 관한 세 가지 법칙을 발견한다.이 법칙은 우주 과학의 발전에 지대한 역할을 하게 되는데,놀라운 것은 케플러가 17세기의 사람이라는 점과 그런 옛날임에도 그 대상이 우주라는 것이며, 지금까지도 이 법칙은 진실이라는 것이다. 우주는 지금도 관측이 쉽지 않다는 점을 생각하면 정말 아찔할 정도이다.1) 타원 궤도의 법칙행성은 타원 궤도를 따라 움직이고 항성(태양)을 초점으로 하여 공전한다.행성은 움직이는 별, 항성은 고정된 별이다.행성이 움직이는 이유는 항성의 중력이 매우 크기때문이다.항성의 중력은 밀도를 높이고, 높은 밀도는 초고온의 에너지를 방출하고 이는 핵융합을 일으키는.......

Naver Blog

[생물도감] 악어거북 - 민물의 티라노사우루스

늑대거북과의 악어거북속에 속한다.크기는 보통 70~80 정도이며, 1m짜리도 간혹 있다고 한다. 생각보다 우와 하고 크지는 않다.그러나, 이 크기는 민물 거북 중에서는 제일 큰 것이다.그런데, 저 생긴 것을 봐라. 정말 대두다. 큰머리 거북..머리가 저리 크니 입도 크다. 문제는, 저 큰머리의 큰입이 가진 치악력이다. 너무 세서 민물의 티라노사우루스라고 불릴 정도다.치악력이 500이나 된다.저것은 하이에나보다 센 것이다. 손가락을 들이대면 그냥 잘린다. -_-;;;이런 무시무시한 입을 가진 녀석이 성질까지 포악하다.서식지는 주로 미국과 멕시코이다.보통은 물에서 주로 산다. 물 밖으로 잘 나오지 않는다. 알을 품을 때만 육지로.......

Naver Blog

[코딩테스트] Persistent Bugger

Persistent BuggerWrite a function, persistence, that takes in a positive parameter num and returns its multiplicative persistence , which is the number of times you must multiply the digits in num until you reach a single digit.Examples :* persistence(39) == 3 // because 3*9 = 27, 2*7 = 14, 1*4=4* // and 4 has only one digit* persistence(999) == 4 // because 9*9*9 = 729, 7*2*9 = 126,* // 1*2*6 = 12, and finally 1*2 = 2* persistence(4) == 0 // because 4 is already a one-digit number→ 주어진 숫자의 각 자릿수 값을 곱해서 한자리.......

Naver Blog

[생물도감] 피라냐 - 아마존의 공포

피라냐, 또는 피라니아라고도 불리며, 크게 세라살무스 계열의 종과 파이고 계열의 종으로 나뉜다. 모두 대략 30여 종이 넘는다.세라살무스 계열은 보통 독립적인 생활을 주로 하고, 파이고 계열은 무리를 짓는 습성이 있다.피라냐라는 이름은 이빨을 가진 물고기라는 뜻이다. 얘네 이빨은 아래와 같이 생겼다.저 이빨과 함께 떼거지로 덤비는 피라냐는 우리에게 공포 그 자체다.그냥 아마존 강에 퐁당 빠지면, 당장 피라냐떼가 마구 덤벼들어 순식간에 뼈만 남을 것 같다.그런데, 사실 얘네들은 우리가 알고 있는 것만큼 공포스럽지는 않다. 영화와 각종 루머가 얘네들의 공포감을 과장시켰다고 한다.실제로는 아마존 강의 생태계에서는 그냥.......

Naver Blog

[추천도서] 사피엔스

[저자 : 유발 하라리]저자는 이스라엘의 역사학 교수이자, 세계적인 석학이다.이 책은 그의 베스트셀러이며, 스테디셀러다.앞선 책 소개에서 총,균,쇠를 얘기할 때 이 책을 언급했었다.인류사에 대한 얘기라 겹치는 부분이 많이 있기 때문이다.하지만, 두 책은 서로 다르다.내 개인적인 생각으로는 총,균,쇠를 먼저 읽고 다른 책을 읽은 후, 이 책을 읽는 것을 추천한다.극강의 재미가 있을 것이다.사실 인류사라고 하면,그냥 원숭이 얘기, 즉 호모 무슨무슨스~ 의 나열과 진화 과정이라는 지루한 얘기일 것이라는 선입견이 있었다.그래서 비록 유명한 책이지만 (사실 유명해서 산 것이다. -_-;;)기대감은 그다지 없었다.이 책은 그러한 선.......

Naver Blog

[생물도감] 붉은머리오목눈이 (뱁새)

참새목의 흰턱딱새과, 붉은머리오목눈이속에 속하는 종이다.오목눈이라는 이름이지만, 정작 오목눈이와는 다른 독자적 분류에 있다.일명 뱁새라고도 하며, 한반도와 동남아시아에 서식하고 있는 아시아의 새다.공원에 산책 나갈 때, 갈대 덤불 등에서 재잘재잘 거리는 소리가 단체로 들려서,참새인가 싶어 봤는데, 훨씬 더 귀엽고 말도 못 하게 귀엽다 하면 바로 이 새다. +.+즉, 엄청 귀엽다!!손바닥에 올려놓고 먹이를 주고 싶어진다. 하지만 그러면 안 된다. 이 새는 관심 대상으로 위기 전 단계인 새다.꼭 그렇지 않다 해도 자연은 자연 그대로일 때가 아름다운 거니깐.얘네들은 겁도 많은지, 사람이 다가가면 아주 요란스러워진다. 도.......

Naver Blog

[생물도감] 피라루쿠 - 아마존의 거대 물고기

골설어목의 아라파이마과,속에 속하는 종이다.현존하는 세계 최대급 덩치의 담수어로 주로 남미의 아마존 강에서 서식한다.덩치만큼이나 역사도 깊다. 수억 년이 넘는다. 그래서 살아있는 화석이라고 불린다.몸길이는 무려 최대 6m까지 자란다고 한다. 하지만, 과거의 남획으로 인해 보통 2 ~ 3m 정도면 큰 놈이라고 한다.지금은 정부 차원에서 보호를 받지만, 원주민들의 생계 수단이라 작은 피라루쿠를 보호할 뿐, 1.5m 이상이면 잡을 수 있기 때문이다. 에휴.. 6m짜리 보고 싶다. ㅠㅠ심지어 맛도 좋다고 한다. @.@그래도, 지정된 기간에 지정된 장소에서만 잡도록 보호하고 있어 그나마 위안이 된다.물론, 허가된 사람만 포획이 가능하다.......

Naver Blog

자본주의? 사회주의? 공산주의? 그 차이점은?

여기에서는 자본주의, 사회주의, 공산주의라는 사상적 이론들을 민주주의라는 테두리 안에서 구분하도록 하겠다.여기에는 무언가 이질적인 거부감이 있을 수 있는데, 그것은 공산주의 때문이다.하지만, 공산주의는 민주주의의 반대말이 아니다. 오히려 민주주의의 반대말은 전제주의다.왜냐하면, 민주주의는 주권이 국민에게 있고, 남에게 피해를 주지 않는 범위 안에서 사상과 행위의 자유를 가지며, 정부는 이러한 국민을 대표하고, 국민의 선택에 의한 평화로운 정권교체가 보장되어야 하는데,전제주의는 어떠한 절대 권력, 즉 왕이나 귀족, 독재 정당 등이 국민을 그 권력 밑으로 귀속시키고 모든 국민의 권한을 제한하고 제어하고 억압하.......

Naver Blog

[생물도감] 범고래 - 바다의 최강자

참돌고래과 > 범고래속 의 유일한 종이다. 영어로는 Killer Whale이다. 멋지다. @.@이름은 역시 그 성향을 말해주나 보다.이 녀석은 바다의 폭군, 깡패, 최강자 중 하나이다. 거칠 것이 거의 없다. 육지로 치면 호랑이 같은 녀석이다.하지만, 무리를 지어 다니므로 바다의 늑대라고 불린다. 실상은 훨씬 세다. 바다의 최강자 중 하나!크기는 보다 큰 수컷을 기준으로 보통 6~9m에 이르며, 무게는 4~8톤에 이른다.이렇게 보면 감이 잡힌다. 엄청 크다.그런데, 보통 사람의 표준 키 맞나? 왠지 눈물이 나네.. ㅠㅠ먹이로는 주로 물고기를 잡어 먹는다. 청어, 연어, 다랑어 등이다. 바다사자나 바다표범, 물개 등을 잡아먹기도 한다.상어도 잡.......

Naver Blog

[코딩테스트] Are they the "same"?

Are they the "same"?Given two arrays a and b write a function comp(a, b) (compSame(a, b) in Clojure) that checks whether the two arrays have the "same" elements, with the same multiplicities."Same" means, here, that the elements in b are the elements in a squared, regardless of the order.Examples :Valid arraysa = [121, 144, 19, 161, 19, 144, 19, 11]b = [121, 14641, 20736, 361, 25921, 361, 20736, 361]comp(a, b) returns true because in b 121 is the square of 11, 14641 is the square of 121, 20736 the square of 144, 361 the square of 19, 25921 the square o.......

Naver Blog

검찰개혁 - 수사권조정과 공수처 왜 이슈일까

대한민국 21대 국회의원을 선출하는 4.15 총선이 며칠 전에 끝났다.결과는 더불어 민주당의 압승이다.그런데, 여기서 재미있는 것은 두 거대 정당인 더불어 민주당과 미래 통합당의 검찰개혁에 대한 입장이다. 완전히 정 반대다. 여당인 더불어 민주당은 검찰개혁과 공수처 설치를, 야당인 미래 통합당은 진정한 검찰개혁으로서의 독립성 강화와 공수처 폐지에 더해 검찰총장의 임기를 기존 2년에서 6년으로 늘리겠다고 한다.자, 결론적으로 보자면 다음과 같은 셈이다.더불어 민주당 '검찰 권한 축소와 수사권 조율을 통한 상호 견제' VS 미래 통합당 '검찰 권한 대폭 강화'로 볼 수 있다. 이제 크게 두 가지의 주요.......

Naver Blog

[생물도감] 대왕고래 - 세상에서 제일 큰 동물

'흰긴수염고래'라고도 불린다.수염고래과 > 대왕고래속 > 대왕고래종 이다.이름부터 알 수 있다. 이 고래는 엄청 크다. 현존하는 동물 중 최고의 크기와 무게를 가지고 있다.평균 길이가 무려 22m ~ 33m에 달하며, 무게는 190톤까지 나간다.190톤이면 190 X 1,000 = 190,000이다. 실감이 안 나는가.. 나도 안 난다.코끼리가 보통 4~6톤이니깐, 코끼리 무게의 대략 30~40배가 나가는 무게다. 대박.. 공룡보다 크다. 이제 좀 실감이 된다. -_-;;;대왕고래는 과거 무분별한 고래잡이로 인해 멸종 위기에까지 갔었다 ㅠㅠ1900년대에 잡힌 대왕고래만 해도 35만 마리였다고 한다. 후아..하지만 다행히도, 1966년 국제조약.......

Naver Blog

옐로우스톤 국립공원 - 슈퍼 화산

옐로우스톤 국립공원(Yellowstone National Park)은 미국 최초의 국립공원으로 와이오밍 주와 몬태나 주 아이다호주가 만나는 지점에 걸쳐 있다. 음.. 지도를 봐야겠지.. -_-;;;바로 저곳이다. 저 세 개의 주가 만나는 곳.(제길.. 와이오밍 주에 속해 있네요. 와이오밍 쪽으로 저 빨간 점을 살짝 밀어야 합니다. -_-;;)그 크기는 대략 8,990 이며, 제주도가 약 1,850 이니깐, 음.. 4.5배가 넘는 크기다. 경기도가 대략 10,170 이고, 충청남도가 약 8,200 이니깐..와.. 이건 그냥 충청남도 하나 떼어다 놓고도 더 넓은 크기다.. 공원 하나가.. 그래도 미국 최대의 공원이라니.. 이걸로 위안을 삼아야 하는 건가..이름이 옐로우스톤인.......

Naver Blog

금융자본? 금융위기? 왜?

현재 민주주의 시대의 경제 사상은 세계 자유무역주의에 기반을 둔 자본주의 경제 사상이다.그럼, 자본이란 무엇인가?모든 생산 수단을 망라한다.그러나,여기서는 금융자본만을 얘기하겠다. 왜? 이것이 현대 자본의 근간이기도 하고 괴상하기도 하고 사기스럽기도 하고 등등 여러 가지 문제의 중심에 있기 때무이다.금융자본은 한마디로 은행에 의한 자본 즉, 돈이다. 이것이 왜 자본이 되느냐 하면, 생산 수단에 투여되기 때문이다. 즉, 대출이다. 이러면, 은행은 여러 가지 이점을 가지는데, 그중 하나가 산업자본에 대한 은행의 영향력이다. 즉, 권한을 가지겠다는 것이다. 이것이 채권이다.※ 채권은 발행을 통한 독특한 대출의 결과이지.......

Naver Blog

디자인패턴 - Singleton Pattern

클래스의 인스턴스는 오직 하나임을 보장한다. 왜? 리소스는 한정적인데, 어떤 객체는 생성할 때마다 계속 메모리를 차지할 이유가 없는 것이 있다. 그렇담, 아예 한 번만 객체가 되게 하고 공유하면 되지 않을까? 그럼 공유라는 개념이 있으므로 쓰레드 안전해야겠지. 그럼 계속 해당 객체를 생성한다 해도, 객체는 1개임을 보장하니깐 메모리를 절약할 것이다. 물론 이 객체는 자주 쓰여야겠지.이는 이미 작금의 엔터프라이즈 환경에서는 매우 널리 퍼진 유명한 패턴이다. 서블릿도 싱클톤이고, 스프링 빈도 싱클톤이며, 기타 많은 엔터프라이즈 객체가 싱클톤이다. 개념상.. 구현 방법은 제각각이라도..인스턴스가 1개만 있어도 되는 경우는 보.......

Naver Blog

[추천도서] 총, 균, 쇠

[저자 : 제러드 메이슨 다이아몬드]이 책은 따로 설명이 필요 없을 만큼 유명한 인문서적이다.매번 인문학 필수 추천 도서로 올라오기 때문에,사실 기대도 컸다.그리고 기대만큼 재미있다. 그런데,이 책을 읽기 전에 읽은 것이 사피엔스다. 두 책 다 내용이 인류사에 관한 것이다. 그래서 겹친다. 오마이갓.물론, 내 경우에 한해서지만, 재미가 약간 반감되어 버리는 부작용이.. ㅠㅠ더군다나, 나에게는 사피엔스가 더 재미있었다. 충격적일 정도로.하지만, 만약 순서를 바꿔 읽었더라면? 에휴..총,균,쇠 라는 제목은 인류사에 있어 인간에게 가장 영향을 끼쳤던 것들을 말하며,이러한 것에 대해 정말 놀라울 정도로 충격적이고 재미있게 풀어.......

Naver Blog

열역학 법칙 알기 - 제3법칙

1) 열역학은 관찰하고자 하는 물질 사이의 열과 에너지의 상호작용에 관한 물리학의 한 분야이다.2) 열역학 법칙이란, 이런 상호작용에 적용되는 일반적인 법칙이다. 즉, 일반적이라 함은 항상 성립한다는 뜻이다.3) 계(System)는 어떠한 공간 같은 것이다.- 고립계 : 주변과 물질 및 에너지를 교환하지 않는다.- 열린계 : 주변과 물질 및 에너지를 교환한다.- 닫힌계 : 주변과 물질은 교환하지 않지만, 에너지는 이동한다.4) 계를 구성하는 입자는 에너지를 가지고 있고, 상태에 따라 에너지가 발산하는 양이 변할 수 있다. 그 평균치를 온도라고 한다.열역학 제3법칙은 다음과 같이 정의된다.절대영도에 가까워질수록, 계의 엔트로피의 변화.......

Naver Blog

[코딩테스트] Reverse words

Reverse wordsComplete the function that accepts a string parameter, and reverses each word in the string. All spaces in the string should be retained.Examples :"This is an example!" ==> "sihT si na !elpmaxe""double spaces" ==> "elbuod secaps"→ 문장의 단어 각각을 뒤집어라.[Test Frame]※ 코딩 테스트를 대하는 개인적인 생각정답은 없다. 다만, 멋진 접근이 있을 뿐.중요한 것은 빠르게 판단하고 해결하는 것이라고 생각한다.코딩이 당장은 스스로 부끄러워도 상관없다.10분이 지나도 시작을 못한다면 받아들여야 한다. 다만, 이러한 것은 아직 학.......

Naver Blog

디자인패턴 - Builder Pattern

자바에서 보통 객체를 생성할 때는 new 키워드를 써서 정의한다. 해당 객체가 단순하다면 이 방식은 아무런 문제가 없다.그런데, 만약 해당 객체가 복합적인 객체로 이루어진 경우이면서, 이 인자들은 반드시 초기화해줘야 한다고 하면?그러면 보통은 생성자에 초기화할 인자를 받는다. 다음과 같은 경우일 것이다.그런데, 이렇게 하면 문제가 있다.인자의 개수가 많아서 클라이언트가 실수하기가 쉽다. 예를 들어 같은 타입의 size와 weight를 바꿔서 생성하면 가장 중요한 값인 value가 달라진다. 더군다나 같은 타입이 더 많아진다면 사용과 유지가 점점 골치 아파진다.이제는 가독성도 급격히 떨어지기 때문이다.그래서 인자의 수를 줄이기 위.......

Naver Blog

열역학 법칙 알기 - 제0법칙

1) 열역학은 관찰하고자 하는 물질 사이의 열과 에너지의 상호작용에 관한 물리학의 한 분야이다. 2) 열역학 법칙이란, 이런 상호작용에 적용되는 일반적인 법칙이다. 즉, 일반적이라 함은 항상 성립한다는 뜻이다.3) 계(System)는 어떠한 공간 같은 것이다. - 고립계 : 주변과 물질 및 에너지를 교환하지 않는다.- 열린계 : 주변과 물질 및 에너지를 교환한다.- 닫힌계 : 주변과 물질은 교환하지 않지만, 에너지는 이동한다.4) 계를 구성하는 입자는 에너지를 가지고 있고, 상태에 따라 에너지가 발산하는 양이 변할 수 있다. 그 평균치를 온도라고 한다.열역학 제0 법칙은 이름부터가 특이하다. 보통은 1부터 시작하는데..맞다. 원래 1부터 시.......

Naver Blog

열역학 법칙 알기 - 제1법칙

1) 열역학은 관찰하고자 하는 물질 사이의 열과 에너지의 상호작용에 관한 물리학의 한 분야이다.2) 열역학 법칙이란, 이런 상호작용에 적용되는 일반적인 법칙이다. 즉, 일반적이라 함은 항상 성립한다는 뜻이다.3) 계(System)는 어떠한 공간 같은 것이다. - 고립계 : 주변과 물질 및 에너지를 교환하지 않는다. - 열린계 : 주변과 물질 및 에너지를 교환한다. - 닫힌계 : 주변과 물질은 교환하지 않지만, 에너지는 이동한다.4) 계를 구성하는 입자는 에너지를 가지고 있고, 상태에 따라 에너지가 발산하는 양이 변할 수 있다. 그 평균치를 온도라고 한다.열역학 제1법칙은 에너지보존의 법칙이다. 어디서 많이 들어본 것이다.하지만, 바로 이거.......

Naver Blog

열역학 법칙 알기 - 제2법칙

1) 열역학은 관찰하고자 하는 물질 사이의 열과 에너지의 상호작용에 관한 물리학의 한 분야이다.2) 열역학 법칙이란, 이런 상호작용에 적용되는 일반적인 법칙이다. 즉, 일반적이라 함은 항상 성립한다는 뜻이다.3) 계(System)는 어떠한 공간 같은 것이다.- 고립계 : 주변과 물질 및 에너지를 교환하지 않는다.- 열린계 : 주변과 물질 및 에너지를 교환한다.- 닫힌계 : 주변과 물질은 교환하지 않지만, 에너지는 이동한다.4) 계를 구성하는 입자는 에너지를 가지고 있고, 상태에 따라 에너지가 발산하는 양이 변할 수 있다. 그 평균치를 온도라고 한다.열역학 제2법칙은 다음과 같이 정의된다.고립계에서 총 엔트로피는 절대 감소하지 않는다.......

Naver Blog

변증법? 귀납법, 연역법?

한국현대사(유시민 저)를 보다가 무림파천황이라는 책이 금서가 되었다는 말이 나온다. 국가보안법을 위반했기 때문이라고 한다. 1981.9월에 발생한 일이다. 엥? 무협지 같은데.. 왜?이유는 정파와 사파의 대립 구도를 설명하면서 변증법을 썼다는 것인데, 그 당시에는 변증법은 공산주의의 논법이라고 한다.음.. 어떠한 주장을 할 때, 논리를 펼치는 방법은 귀납법과 연역법이 있는 것은 알고 있는데.. 변증법은 모지? 들어본 것 같지만 생각이 안 나면 모르는 거지. 그래서 자료를 찾아 정리를 해보았다.일단 먼저 귀납법과 연역법을 짚어보고 가자.1) 귀납법이것은 과학적 접근으로 이해하면 편하다.어떠한 현상으로부터 가설을 세운다. 이.......

Naver Blog

[추천도서] 위험한 과학책

저자 : 랜들 먼로이 책은 좀 특이하다.물리학적 지식을 독자들의 엉뚱한 질문에 대한 설명을 통해 알려준다.개인적으로는 재미있는 부분도 있었지만, 모두가 그렇지는 않았다.질문에 대한 설명 방식이라는 특성상, 빠르게 읽을 수 있다. 이건 장점인거 같다.또한, 꽤 놀랍고 새로운 지식을 종종 알게 된다.저자는 그것을 매우 쉽게 풀어주는 능력도 있다.다만, 몇가지 외에는 별로 생각나는 것은 없다. 내 경우이지만.. 약간 가볍게 부담없이 읽는 그런 기분이랄까.

Naver Blog

[코딩테스트] Find divisors of a number

Find divisors of a numberFind the number of divisors of a positive integer n.Random tests go up to n = 500000.Examples :divisors 4 = 3 -- 1, 2, 4divisors 5 = 2 -- 1, 5divisors 12 = 6 -- 1, 2, 3, 4, 6, 12divisors 30 = 8 -- 1, 2, 3, 5, 6, 10, 15, 30→ 주어진 숫자 n을 깨끗하게 나누는 숫자 개수[Test Frame]※ 코딩 테스트를 대하는 개인적인 생각정답은 없다. 다만, 멋진 접근이 있을 뿐.중요한 것은 빠르게 판단하고 해결하는 것이라고 생각한다.코딩이 당장은 스스로 부끄러워도 상관없다.10분이 지나도 시작을 못한다면 받아들여야 한다.다만, 이러한 것은 아직 학습이나 경험이나 숙련 등이.......

Naver Blog

4.15 총선 - 준연동형 비례대표? 비례정당?

21대 국회의원을 선출하는 4.15 총선이 이제 곧 시작된다. 그런데, 투표용지의 길이가 장난이 아니다. 정당이.. 많다.. (일반 선거구 정당이 21개, 비례정당이 35개)모, 창당의 자유가 있으니깐..그런데, 왜 선거구보다 비례가 많지?이것을 이해하려면, 이번 총선을 위한 비례대표 선출에 대한 선거법 개정을 알아야 한다.※ 선거법 개정 전의 비례 선출 = 비례대표 총 의석 수(47석) X 정당 득표율※ 선거법 개정 후 비례 선출 = 준연동형 30석 + 병립형 17석 이전 방식은 직관적이다. 내가 선택한 정당에 47석 기준으로 비례해서 의석을 주는 것이다.사실 직관적이긴 해도 이해가 되진 않는다. 우리는 우리 지역구의 사람을 선.......

Naver Blog

반민특위 - 광복과 일제의 청산

반민족행위특별조사위원회(이하 반민특위)는 일제 강점기 시절에 일본에 협력한 악질 친일파를 색출하여 반민족 행위로 처벌하기 위해 헌법으로 보장한 특별조사위원회다.1948.9.22 법률로 재정되었고 그해 10월 반민특위가 발족하였다. 그리고 이를 집행할 특별경찰, 특별검사, 특별재판소도 설치한다.이때가 그해 5.10 총선거를 통해 제헌국회가 설립된 이후이며, 이 과정은 정당한 민주적 방식으로 의결되었으며, 그 결과는 압도적인 찬성으로 가결된 것이다.그리고, 이승만 초대 대통령은 이를 승인한다.이것은 너무나 당연한 일이다. 일제 강점기에 나라를 잃고 핍박당한 울분과 한이 있다. 그리고 조선의 자주독립을 위해 목숨을 바치고.......

Naver Blog

4.19 혁명, 그 위대한 승리

대한민국의 초대 대통령은 이승만이다. 조선의 독립을 위해 주로 외교적인 방법으로 활동을 했으며, 그 자신은 철저한 민주주의자다. 따라서, 그는 독립 후 대한민국의 공산화를 방지하기 위한 남한의 단독 정부 수립에 앞장섰다.그래서, 대한민국은 어쨌든 자유 민주주의 국가로 첫 독립 정부가 수립되었다.대한민국의 2대 대통령은 이승만이다. 3대 대통령도 이승만이다. 4대 대통령도 일단은 이승만이다.자유 민주주의를 위해 단일 민족을 분단시키기까지 했던 사람이 스스로 독재의 길을 걷는다. 권력이란 무엇이길래 스스로 저 엄청난 분단의 대의명분을 걷어차면서까지 지키려고 한 걸까. 결과적으로는 자유 민주주의의 수호자가 아닌 단.......

Naver Blog

[추천도서] THE BODY - 바디

저자 : 빌 브라이슨나는 인문 서적을 좋아하지만, 의학에 관한 서적은 한 번도 본 적이 없다.그러던 어느 날 건국대학교 병원에 입원을 하게 되었는데,그곳에서 만난 교수님에게 너무 큰 감동을 받았다.환자에게 환자의 수준에 맞추어 자세히 설명해 주시는 그 모습은 여태껏 보아왔던 지식인의 모습과는 달랐다.존경심이 우러나왔다.그래, 이번 기회에 의학 인문서를 한번 보자! 고 결심한 것은 이러한 이유 때문이다.그런데 웬걸, 이렇게 재미있을 수가.빌 브라이슨의 책을 좋아하기 때문에 이 책을 고른 것도 있지만,내용도 너무 신기하고 재미있다.내가 나의 몸에 대해서 이렇게 무지했구나 라는 생각도 들면서, 스스로 건강에 더 신경을 쓰.......

Naver Blog

우주의 탄생 - 빅뱅

우주의 탄생에 대해서는 신화에서 과학에까지 아주아주 오래전, 그러니깐 인간이 지구에서 철학을 사유할 때부터 궁금증의 대상이었다. 어찌 보면 당연하다. 내가 살아 있는 그 자체, 그 환경, 그 너머에 대한 궁금증과 그 태초라는 것은 너무나도 궁금한 영역이기 때문이다.이제 그중 현재까지 범용적으로 인정받고 있는 빅뱅에 대해 알아보려고 한다. 물론 내가 이해한 수준에서 -_-;;사실 과학의 발전사를 보면, 그 당시에는 정말 과학적 '사실'로 받아들여졌다가, 나중에 '거짓'이 된 사례가 많이 있다. 따라서, 이 빅뱅에 관한 이론 역시 지금은 '사실'이지만 나중엔 어찌 될지 모르겠다. 이를 뒷받침하는 이.......

Naver Blog

[코딩테스트] Reverse Letter

Reverse LetterGiven a string str, reverse it omitting all non-alphabetic characters.→ non-alphabetic characters를 제거하고 뒤집어라[Test Frame]※ 코딩 테스트를 대하는 개인적인 생각정답은 없다. 다만, 멋진 접근이 있을 뿐.중요한 것은 빠르게 판단하고 해결하는 것이라고 생각한다.코딩이 당장은 스스로 부끄러워도 상관없다.10분이 지나도 시작을 못한다면 받아들여야 한다.다만, 이러한 것은 아직 학습이나 경험이나 숙련 등이 부족할 뿐이다.나도 또한 마찬가지다.따라서, 출처 사이트나 또는 다른 사이트나 책등을 통해 코딩 알고리즘 연습을 하는 것이 정답을 찾는 것보다 낫다.나중에는 스스로 부끄러웠던 문제들에 대해.......

Naver Blog

제주 4.3 사건을 기억하자

광복 직후의 제주도는 직접 보지 않은 이상 어땠다 라고 말하지는 못한다. 다만, 제주도가 섬이라 서울이나 평양과 같은 정치적 중심지에서는 멀었다는 것. 따라서 아직 정치적, 이념적 갈등이 혼란스러웠을 것이라는 추측을 할 뿐이다.여기에는 또한 불안 요소가 여럿 잠재해 있었는데, 하나는 일제 강점기 때의 군경 세력들이 그대로 미 군정 경찰 관료로 이어졌다는 것이고, 둘은 서울과 마찬가지로 민주주의 사상과 사회주의 사상의 대립이 존재하고 있었다는 것이다. 그리고 시민들의 가난에 의한 기본적인 욕구불만까지.사건은 1947.3.1일 삼일절 기념행사에서 시작된다. 행진을 하던 기마경찰에 의해 한 초등학생이 말밥굽에 치이는 사.......

Naver Blog

[추천도서] 지적 대화를 위한 넓고 얕은 지식 1,2

작가 : 채사장이 책은 인문학의 입문서라고 말하고 싶다.책 제목도 딱 맞춤이다.정말 넓은데, 매우 얕다. 그래서 읽다 보면 재미와 동시에 궁금증이 계속 생긴다.궁금증이 생기다 보면 좀 더 자세한 내용이 알고 싶고 다른 입문 서적을 찾게 된다.그래서 입문서다. 적어도 내 경우에는 그랬다.인문 서적을 보려는 사람에게는 흥미를 유발할 것이고,인문 서적을 좋아하는 사람에게는 전반적인 정리가 될 것이고,레알 지식인이라면, 음.. 굳이 안 봐도 될 것 같다.

Naver Blog

남북 분단의 비극 - 단일민족의 아픔

대한민국은 분단국가다.왜?그야 해방 후, 정치적 이념 때문에 북쪽은 소련이, 남쪽은 미국이 38도 선을 기준으로 갈랐으니깐..여기까지가 나의 보통의 생각이었다.그런데, 왜? 패전국인 일본이 신탁통치의 대상이 되지 않고 아무 상관 없는 조선이었을까?일제 강점기의 시대는 일본이 2차 세계대전의 패전국이 되면서, 자연스레 종료되었다.다만, 문제는 우리 스스로의 독립 쟁취가 아닌, 외부에 의한 독립이었다는 것이다.여기에는 복잡한 문제가 숨어 있는데, 동아시아의 연합군의 승전은 미국만이 아니라는 것이다. 바로 소련이다.따라서, 소련은 일본군을 몰아내며 자연스레 북에서 들어왔고, 이를 견제한 미국은 자연스레 남으로 들어왔다.......

Naver Blog

try-with-resources

자바로 프로그램을 만들다 보면, 특정 resource에 대해 종료 처리를 반드시 해야만 하는 경우가 있다. 우리는 이럴 때 보통 try 구문을 쓴다.다음은 일반적인 사용 예이다.test.txt 파일을 하나 만들어 boot 프로젝트의 resources 밑에 두자. 그리고 Main 함수로 해당 메서드를 실행시키면 파일의 내용이 출력된다.여기서의 문제점은?사실 워낙 익숙해서 잘 모르겠지만, 일단 대부분 중첩 try를 피할 수가 없다. 따라서 close 해야 할 리소스가 1개일지라도 저 모양은 복잡하다. 더군다나 다수의 resource의 경우에는 더 끔찍해진다.이러한 문제점을 의식해서인지, 버전 7 에서는 새로운 방식을 소개하였다. 이를 try-with-resources 구문이라.......

Naver Blog

Short Circuit Evaluation

일련의 &&, || 등의 연산 결과 True/False를 조합하여 어떠한 결과물을 도출해야 하는 경우, 일련의 &&, || 연산의 끝에 도달하기 전에 결과가 이미 확실하다면, 나머지 연산을 수행할 필요가 없다. 이것이 Short Circuit Evaluation의 의미다.그런데, 우리는 이미 이를 알고 있다. 저 알고리즘 용어를 몰랐더라도 이미 알고 있을 것이다. 다음을 보자.위 예제는 우리가 흔히 사용하는 조건절의 &&, || 조건이다. 여기에는 이미 Short Circuit Evaluation 알고리즘이 적용되어 있다. 따라서, &&의 경우 앞의 연산이 false가 나오면 더 이상 뒤를 연산하지 않으며, ||의 경우 앞의 연산이 true가 나오면 더 이.......

Naver Blog

Java 11 특징

Java10이 18.03에 출시되었다. 그로부터 6개월 뒤인 9월에 11이 나오는데, 오라클에서 앞으로 6개월 주기로 나올 것이라고 한 것과 일치한다. 그리고 이 11버전은 6개월 주기의 update 정책을 발표한 후 나온 최초의 LTS(Long Term Supported) 버전이며, 유료 패키지 버전이다. 그리고 다음 LTS는 매 3년 뒤에 나오므로 +6를 하면 17버전이 다음 LTS 버전이 될 것이다.그럼 9와 10은 모며, 12~16은 모란 말인가. 라이선스에서 서브 스크립션으로 요금 정책을 변경한 것이라고 하지만, 솔직히 저 버저닝은 아직도 적응되지 않는 정책이다. -_-;;;따라서, 아마도 이 버전이 상용으로 오래 쓰이지 않을까 싶다. OpenJDK를 커스터마이징 하는 업체들.......

Naver Blog

Workflow Engine - Activiti Cloud 3

Activiti Cloud의 3번째 편이다. 2편에서 끝내려고 했는데, 왤케 많은 거냐 -_-;;; 1편은 Activiti Cloud 설명과 Custom Modeling, Full example 설치에 대해 이야기했고, 2편에서는 Custom Runtime-bundle인 demo-workflow-rb를 만들어서 기존의 Full example에 슬쩍 추가하여 보았다.각각의 링크는 다음과 같다.· Activiit Cloud 1편 - Setup & Custom Modeling : https://priince.blog.me/221566486040· Activiit Cloud 2편 - Custom Runtime-bundle : https://priince.blog.me/221575830615이제는 진짜 마지막 편이다. 여기서는 Custom Modeling 시 정의했던 serviceTask1 비즈니스 서비스가 어떻게 연동되는지를 Custom Activiti Cl.......

Naver Blog

디자인패턴 - Decorator Pattern

이 패턴은 이전에 Proxy를 했을 때, 같이 했어야 하지 않을까 싶은 녀석이다. 왜냐하면, 이 녀석도 사실 Proxy 기 때문이다. 다만, 보는 관점이 달라 GOF의 디자인패턴에서는 따로 분류하였다.이 녀석이 보는 관점은 순전히 부가적인 기능이다. 따라서, 본래의 순수한 비즈니스를 방해하지 않고 플러스하여 다른 옵션이나 부가 기능을 추가하는 데 특화를 시킨다. Decorator라는 이름도 이러한 특징을 반영한 것이다.이러면, AOP가 생각나지 않은가? 실제로 스프링 AOP는 이 패턴을 주로 사용하여 만들어진 것이다. 또한, 실제로 비즈니스를 구현하면서도 커스텀 하게 자주 사용하게 되는 녀석이다. 그럼, 부가적인 기능이라는 것을 처리함에 있.......

Naver Blog

JPA 영속성 관리

JPA를 사용하다 보면, Entity Object를 다루는 데 있어 직관과 어긋나 당혹스러운 때가 있다. 그런데 이는 뭔가 JPA의 네거티브함이 있기 때문이 아니다. 대부분의 원인은 객체와 테이블 각자가 관계를 보는 관점의 차이에서 올 것이다. 그리고 또 하나, Entity의 생명 주기가 영속성 Context 하에 있기 때문인데, 이를 이해하지 못하면 또한 당혹스러운 거다. 그런데 이 개념은 JPA를 함에 있어 매우 중요해서 이 당혹스러움이 주는 피드백이 매우 심각할 수도 있다. 따라서 여기서는 이 영속성 Context의 개념을 한 번 확인하고 가자.1. Entity ManagerEntity는 테이블과 매핑되는 기본 구조다. Entity Manager는 이러한 Entity를 조회/저장.......

Naver Blog

Spring 외부 Resource 다루기

요새는 Boot를 통해 Spring을 사용하다 보니, 스프링 Context 설정 xml이 어떻고, 웹 Servlet Context와 루트 Application Context가 어떻고, 각각의 스캔할 패키지는 어떻고, 기본 리소스는 어디에 정의하며 등등을 거의 생각하지 않는다.점점 바보가 되어가고 있는데, 어쨌든 프레임워크 개발자들의 입장에서는 성공적이다. 자동화가 운영 수준까지 많은 부분을 커버하게 되었으니 개발자는 플랫폼적인 신경을 훨씬 덜 쓰게 되는 것이니깐. 물론 최적화나 커스텀 한 설정은 언제나 발생하긴 하지만, 많은 부분이 자동화되었음을 부인할 수 없다.이제는 Boot App을 구성하면, 기본적인 설정을 properties나 yaml을 통해 오버라이딩 하거나, 특별.......

Naver Blog

Spring AOP 사용하기

일전에 Spring AOP의 개념에 대해 다음과 같이 글을 쓴 적이 있다.https://priince.blog.me/221399150115지금 이 포스트를 바로 보게 되었다면, 위 글을 먼저 보는 것을 추천한다. 다음은 이를 Annotation 기반으로 간단히 사용해 보도록 하겠다.먼저 annotation 기반을 사용함에 있어 혼동하지 말아야 할 것이 있다. Spring AOP는 전통적인 방식의 객체지향적인 Proxy다. 즉, 인터페이스를 기본으로 하여 이를 구현한 원본 타깃 Object를, 거짓 구현한 Decorator가 감싼 구조가 된다. 이것이 default다.왜 이런 이야기를 하는가 하면, AOP annotation 표현의 대부분을 AspectJ에서 따왔기 때문이다. 그래서 헷갈린다. AspectJ가 사용된 건가 하.......

Naver Blog

Workflow Engine - Activiti Cloud 2

Activiti의 Cloud 부분은 내용이 많아 부득이하게 두 개로 나누어 설명을 하게 되었다. 전편은 다음을 참고하자.[전편] https://priince.blog.me/221566486040원본 출처는 전편의 출처와 같기 때문에 생략한다.또한, 여기서는 gradle 기준으로 수정하여 작성하였음을 참고하기 바란다.이제, 전편에서 Cloud를 위한 기본 세팅과 함께 Custom 한 모델링을 해보았으므로, 다음은 해당 Model을 실제로 실행해 보는 것이다. 그러기 위해서는 application 2개를 만들어야 한다. 바로 Process Runtime 과 Cloud Connectors다. 앞서 보았듯이 이 둘 역시 Cloud 독립 모듈이지만 애플리케이션과 의존성을 가지게 되는 녀석이다. 이 의존성을 최소화해야겠.......

Naver Blog

디자인패턴 - Observer Pattern

이 패턴은 어떠한 주제에 대한 상태변화에 관심 있어 하는 객체가, 그 변화를 어떻게 알 것이냐에 대한 문제에서 시작된다. 사실 이 패턴은 요새 핫한 리액티브의 근간을 이루는 Message Driven에 대한 기본 원리이기도 하며, 그 외 콜백 함수나 각종 listener와 같이 뭔가 비동기적인 느슨한 이벤트 연결 고리의 기본 원리이기도 하다. 그만큼 실제로 많이 쓰인다.그럼 일단, 그냥 상태 변화를 감지한다는 것을 생각해 보자. 보통은 그 변화에 대해 관심 있어 하는 객체가 주체로 생각된다. 따라서, 변화하는 주제를 가지고 있는 Subject에 대해 주기적으로 찔러 본다. 이러면 그 주기적인 텀이 실제 텀이 될 것이기 때문에 이것이 중요한 경.......

Naver Blog

Workflow Engine - Activiti Cloud 1

전편의 Activiti Core에 이어, 이번엔 7버전에서 새롭게 선보인 Cloud에 대해 알아보려고 한다.[전편] https://priince.blog.me/221558505087Cloud의 경우에는 그 내용이 길어서 두 chapter로 나누어서 진행하겠다. 먼저 시작은 Cloud Set up과 Custom Modeling이다.모든 설명과 소스는 다음을 참고하였다.[출처] https://community.alfresco.com/community/bpm/blog/2018/12/10/getting-started-with-activiti-7-beta Activiti CloudBPMS의 스펙을 이해하고 엔진의 각 요소를 Cloud Platform으로 독립/분산 시킴으로써, 그 실행을 자동화 시키는 것. 이것이 Cloud의 목적이다. 따라서 개발자는 엔진의 핵심 프로세스만 이해하면 된다. 한마.......

Naver Blog

디자인패턴 - Proxy Pattern

이 패턴을 구현하는 Object는 실제 서비스를 처리하는 Object의 대리자 개념이다. 하지만, 클라이언트는 실제 서비스 객체인지를 인지하지 못한다. 아니, 인지하고자 하는 것에 관심이 없다. 왜냐하면, 서비스는 제대로 수행되기 때문이다. 즉, 대리자는 실제 서비스 객체의 서비스에는 영향을 주지 않지만, 최초 요청은 대신 받아서 처리 흐름을 제어할 뿐이기 때문이다.왜? 이런 일을 할까?1) 성능상의 이유파일을 읽는 경우를 생각해 보자. 이 경우에 실제 파일의 내용을 읽는 객체에 계속 서비스를 요청하게 되면 매번 IO가 발생할 것이다. 이는 자연스러운 현상이다. 하지만, 조금만 더 생각해 보면 만약 해당 파일이 소량이고 정적이.......

Naver Blog

Workflow Engine 이란?

근래의 프로그래밍은 다시 SOA의 철학으로 돌아가서 비즈니스를 명확하게 서비스 단위로 쪼개고, 그 서비스들을 mesh up 하는 것이 트렌드다. 그 중심에는 MSA가 있고, 이 MSA는 어떠한 도메인을 기준으로 도메인별 애플리케이션으로 쪼개는 것에서부터, 함수형 애플리케이션을 배포하여 필요한 기능들을 조합하는 등 다양하게 구현되고 설정된다.이제, 다시 focus는 저 조합이라는 단어에 맞춰진다. 왜냐하면, 서비스를 나눈다는 것은 어떠한 리소스를 독립적으로 Component 화한다는 것이고, 이는 하나의 부속품과 같이 투명하게 공유되기를 원하며, 이 공유로 인해 나눠진 서비스 단위의 Object나 API들은 어떠한 비즈니스 문제를 해결하기.......

Naver Blog

Workflow Engine - Activiti Core

Activiti는 Alfresco에서 만든 오픈소스 Lightweight Workflow Engine이다. 따라서, 완전 무료로 이용할 수 있으며 Java base이다. 더군다나, Spring 과의 통합을 강하게 지원하고 있고, 최근에는 Spring Boot Starter를 지원 및 빠르게 안정화 시키고 있다. Spring 과의 편리한 통합은 꽤나 매력적으로 보인다.이 글을 쓰는 현재의 Activiti는 버전 7을 release 중이고, 이는 이전 버전과는 조금 다른 컨셉을 가지고 있다. 바로 Core 와 Cloud로 Workflow 엔진에 대한 접근 방식을 이중화 한 것인데.. 이왕 Workflow 엔진에 대해 알아본 거 이놈을 타깃으로 알아보도록 하겠다.※ 여기서 사용되는 소스는 모두 Activiti Developer Guide를 참.......

Naver Blog

JPA - Entity 관계 2

Entity 관계 1 - 1:1 매핑 관계에 이은 포스트입니다.http://priince.blog.me/221537924782이번에는, 관계의 방향과 다수의 관계에 대해 알아보려고 한다. 사실 모델이라는 것은 문제 Domain의 속성과 상태와 그것의 변경 행위를 담기 때문에, 생각보다 복잡해지는 경우가 종종 있다. 따라서, 여기서는 조금 복잡한 관계로 넘어가 보자.(사실, Model과 Entity는 아직 애매한 딜레마가 존재한다. 하지만, 이는 추후에 따로 얘기하겠다. 따라서, 지금은 그냥 Model = Entity에 준한다고 생각해도 된다.)[N:1 관계 - 단방향과 양방향]이번에는 기존의 Member를 팀에 소속 시키겠다. 이러면, Member는 해당 Team에 소속 관계를 맺게 되며, Mem.......

Naver Blog

JPA - Entity 관계 1

Entity 기본에 이어지는 포스트입니다.http://priince.blog.me/221534359540우리는 앞서 회원 Entity를 가지고, SQL 없이 해당 Entity를 저장하고 복원하였다. 그리고 이렇게 객체와 저장매체 간의 상이한 패러다임을 개발자가 느끼지 못하게 매핑하는 방식을 ORM이라고 하였으며, JPA가 그 표준 기술이라고 했다. 그런데, 실제로는 이 Entity가 단순하지 않다. 왜냐하면 이놈들은 서로 관계를 가지기 때문이다. 이 관계는 RDBMS의 관계와는 다르다. 왜냐하면, Entity 자체가 바로 Object 객체 자체이기 때문에 관계라는 패러다임 자체가 다르기 때문이다. 즉, 이 객체인 Entity들 간에는 상속관계도 있을 수 있고, 서로의 정보를 참조할 수도.......

Naver Blog

JPA - 서론

JPA는 자바의 ORM 표준 API다. ORM은 데이터를 Object 기반으로 다룰 수 있도록 하는 개념이다. 하지만, 오랜 경력의 베테랑 개발자라면, 한때의 뜨거운 ORM 열풍과 처절한 실패를 겪어 봤을 것이다. 그리고 ORM은 필요 없는 것이라고 나름 선입견을 가지게 된다. 나도 그랬다. 그것은 ORM의 개념이 나쁘다는 것과는 다른 것이다. 그냥 실정에 안 맞는 이상주의 같은 그런 느낌인 것이다.하지만, 그 와중에 Hibernate는 잔잔하게 성공 가도를 달려왔다. 그리고 지금에 와서는 다시 한번 ORM 열풍을 주도하고 있는 가장 인기 있는 ORM 프레임워크다. 왜? 이상주의 같은 개념이 어째서 사라지지 않고 다시금 발전할 수 있었을까?여기에는 저 이상주.......

Naver Blog

JPA - Entity 기본

jpa는 일반 자바 Object를 DBMS에 매칭 시키는 자바 표준 기술이다. 그럼 이제 얼마나 쉽게 Object가 DBMS에 write 되는지 간단하게 보자.(spring boot를 이용하여 테스트할 것이다. boot는 정말 편리하다 +.+)sts 나 intelliJ에서 스프링 부트 프로젝트를 하나 시작하자. boot는 프로젝트를 만들기가 너무 쉽기 때문에, 프로젝트의 미니멈 버전의 프로토타입을 테스트하기에 최적화되어 있다. 의존성으로는 DevTools와 Lombok, 그리고 JPA와 테스트용으로 쓰기 정말 편한 로컬 DB로 H2를 추가해 주면 된다.DevTools는 H2 console을 위해, 그리고 Lombok은 자바빈에 특화된 어노테이션 기반 유틸리티 때문에 추가했다. 한번 쓰기 시작하면 계속.......

Naver Blog

Java equals 와 hash code

우리는 보통 a == b는 둘이 완전 같은 경우 (주소값이 같은 경우), a.equals(b) == true는 주소값은 상관없이 값이 같은 경우라고 잘 알고 있다. 따라서, 일반적으로 자바 객체를 정의할 때 비교를 위해 equals를 아주 능숙하게 오버라이딩 한다.여기서 끝난다. 보통은.그런데, 우리는 이러한 얘기를 들어 봤을 것이다. 객체의 equals를 재정의 했다면 반드시 hashCode를 재정의 하라고.그래도, 보통은 위 예제에서 끝난다. -_-;그래서, 여기서는 왜 hashCode도 같이 재정의 해야 하는지에 대해 얘기하려고 한다.※ hash code 규약1. A.equals(B)가 true 면, A와 B의 hash 값은 같아야 한다.2. A.equals(B)가 false 면, .......

Naver Blog

Java Garbage Collection

자바는 태생부터 프로그램의 상위 구조의 목적에 포커스가 맞춰져 있었다. 즉, 하부의 메모리, 하드웨어 등 저 수준의 프로그램을 신경 쓰지 않고, 상부의 비즈니스를 보다 효율적으로 표현하고자 한 것이다. 그런데, 이것이 말만 쉽지 정말 그렇게 하려면 무엇인가는 복잡한 법이다. 그 무언가란 JVM으로 언어의 구동 계층을 추상화 시키고, 여기에 거의 모든 하부 수준의 관리를 자동화하게 한 것이다. 따라서 이러한 언어 플랫폼 개발자들의 노력에 따라, 우리 비즈니스 개발자는 보다 중요한 비즈니스의 구현에 포커스를 맞추면 되고, 메모리는 어떻게 할당되고 해제되는지 따위는 전혀 몰라도 된다. 비즈니스 외이기도 하고 복잡할 것이니깐.......

Naver Blog

Lambda Expression

자바8에서 람다가 도입되었음을 알고 있다. 람다에 대한 기본 개념은 이전에 자바8을 소개한 글에서 참조 가능하다.[http://priince.blog.me/221398248462]여기서는 람다를 어떻게 왜 사용하는지를 얘기하려고 한다. (기본 출처는 effective java 3판 님입니다.)일반적으로 람다를 적용함에는 다음의 우선순위를 가진다.1. 익명 내부 클래스 대신 람다2. 람다 대신 메서드 참조3. 람다를 위한 Functional interface는 새로 만들기보다는 java.util.function 패키지의 정의된 것 사용.1. 익명 내부 클래스 대신 람다.자바8을 블로그에 처음 정리할 때, 람다에 대한 기본 설명의 시작은 익명의 내부 클래스였다. 인터페이스에 대한 규약이 불.......

Naver Blog

Java Reference 종류와 GC 영향도

참조되지 않는 객체는 JVM의 Garbage Collection (GC)에 의해 수거 대상이 된다. 참조되지 않는 객체란 해당 객체의 참조자의 scope가 종료되었거나 우리가 명시적으로 null을 지정해 줬을 경우 등이다.보통은 문제가 되지 않는다. 왜냐하면, 대부분의 객체는 메서드 안에서 생성을 하고, 해당 객체를 참조하는 참조자는 보통 메서드 안에서 선언되므로 이 참조자의 scope는 메서드의 범위 내에서 끝난다.하지만, 모든 문제는 바로 얼마 안 되는 예외 상황에서 발생하며, 일단 발생하면 애플리케이션의 성능에 어마 무시한 영향을 끼치거나 심지어 OOM 을 외치며 죽이는 수도 있다. -_-;;예를 들면 그 안전한 메서드가 반복이나 재귀를 끝없이 한.......

Naver Blog

Cache Replacement 기본

캐시에 쓰는 저장 장치는 보통 메모리 기반이다. 또한, 이것은 디스크 기반보다 처리 속도가 매우 빠르다. 따라서, OS 수준의 연산 효율을 위한 캐시에서부터, 애플리케이션의 캐시 기반 프로세스 설계까지 폭넓게 이용되고 있다.다만, 이것은 저장소 자체가 효율 대비 비싸기 때문에 고비용을 초래한다. 따라서, 캐시의 용량은 언제나 한계가 있고, 이 한계의 용량을 효율적으로 관리하기 위한 교체 알고리즘이 존재하는 것이다.다음은 잘 알려진 알고리즘을 요약한 것이다.1) FIFO First In First Out. 즉, Queue다. 이 말은 곧 캐시가 풀 찼을 경우 제일 오래된 녀석을 버리겠다는 뜻이다. 단순하지만, 새로 조회된 녀석은 항상 캐시의 마.......

Naver Blog

Java 10 특징

2018.03 자바 10 등장! 와~~ 이럴 줄 알았냐. 이런 니미, 8에 겨우 익숙해지고, 이제 겨우 9를 볼까 하는데, 10? 10? 10? 그것도 9가 2017.09에 나왔는데? 겨우 6개월이 지났을 뿐이 단 말이다. ㅠㅠ이런 어처구니없는 상황이 발생하는 이유는, 클라우드 주도 개발자를 지원한다고 하여 잘난 오라클님께서 앞으로 자바의 업그레이드 시기를 6개월로 하겠다고 했음이기 때문이다. 자바 9부터니깐 매년 3월, 9월이라는 얘기이다. 눈 돌아간다 @.@하지만, 다행인 것은 이것이 앞서 얘기했던 개발자들을 위한 지원이라는 것이다. 따라서, 다음과 같이 2개의 채널로 구분하였다.1) OpenJDK : 개발자들이 Java SE Platform의 최신 기술 혁신에 먼.......

Naver Blog

디자인패턴 - Bridge Pattern

복합적인 객체와의 관계에서 추상화를 아무 생각 없이 설계하게 될 경우, 서브 클래스의 지속적인 추가는 이 객체들 간의 N * N의 경우의 수를 만들게 된다. 추상화한 이점이 관리의 문제로 전가되는 상황이 된다.예를 들면, 이런 경우다.1) 시나리오- 문서를 만드는 클래스를 정의하려고 한다.- 문서는 doc, pdf 형식으로 내보내기가 되어야 한다.- 문서는 다양한 폰트를 적용할 수 있다.얼핏 보면, 클라이언트는 단순히 applyFont와 writeDocument만 알면 된다. DocumentMaker를 통해 추상화했으니깐. 그런데, DocumentMaker를 관리하는 입장에서 보면, 서브 클래스는 그 기능의 조합인 N * N 만큼 늘어나게 될 여지가 충분하며, 이를 관리.......

Naver Blog

Java 기본 데이터형

(표 출처: https://leetaehoon.tistory.com/3 에서 그대로 복사 -_-;;)boolean은 원래 1비트다 (true/false == 0/1... 모가 0이지... 1이 true다! +.+). 하지만, 자바는 byte 단위로 움직이기 때문에 저렇게 8비트로 표현되었다. 정수형은 8비트 단위로 움직인다. byte = 8비트, short는 16비트, int는 32비트, long은 64비트. 이것이 이 데이터형의 범위가 되는데, 예를 들어 byte는 8비트이므로 28 = 256, 0부터 시작이니깐 -1 해서 255까지가 범위가 된다. 그런데, 자바의 기본 데이터형에는 부호가 있고/없고 가 없다. 그냥 디폴트 부호가 있다. 그러면 음의 정수를 표현하기 위해서는 저 저장 범위를 반으로 나눠야.......

Naver Blog

대칭형/비대칭형 암호화

A와 B가 서로 정보를 주고받는 경우, 이 정보가 일반 텍스트 평문일 경우 상당히 당황스러운 경우가 있다. 이 평문이 개인 정보일 경우나 또는 비밀문건 또는 개인 정보 중에서도 뱅킹과 관련된 계좌, 비밀번호 등등 당황스러운 경우는 많다.요새는 인터넷에서도 개인 정보보호를 위해 SSL 통신을 기본으로 하는 사업자들이 많이 늘고 있다. 또한 자동 로그인, 관련 앱 자동 연동, 제3자 인증 등등 사람들을 편하게 하면 할수록 눈에 안 보이는 저러한 보안 오리발들이 겁나 많아지는 것이다.다시 본론으로 돌아가서, A와 B가 서로 정보를 주고받는데 당황스럽지 않으려면, 이 정보를 제3자 C가 읽지 못하도록 암호화를 하면 된다. 평문을 어떠.......

Naver Blog

가중 그래프

그래프의 간선에 추가 정보가 표기되어 있는 구조.당연히 방향이 있는 그래프도 가능하다. 이렇게 가중치를 두면 거리, 비용 등의 추가 정보에 따른 관계 + 가중치의 새로운 요소가 추가된다. 이제는 단순 탐색이 아닌, '거리'와 같은 값 개념을 도입할 수 있다. 사실 가중 그래프를 별도로 분리한 것은, 이 최단거리 탐색 알고리즘을 설명하기 위해서다.1) 다익스트라 알고리즘시작 정점을 현재 정점으로 하고, 인접 정점의 가중치를 모두 기록한다. 그리고, 가장 작은 가중치를 기록한 간선으로 연결된 인접 정점을 방문하고, 이를 다음 현재 정점으로 삼는다. (방문한 정점은 표시하여, 중복에 빠지지 않게 한다!). 다음 현재 정.......

Naver Blog

디자인패턴 - Singleton Pattern

클래스의 인스턴스는 오직 하나임을 보장한다. 왜? 리소스는 한정적인데, 어떤 객체는 생성할 때마다 계속 메모리를 차지할 이유가 없는 것이 있다. 그렇담, 아예 한 번만 객체가 되게 하고 공유하면 되지 않을까? 그럼 공유라는 개념이 있으므로 쓰레드 안전해야겠지. 그럼 계속 해당 객체를 생성한다 해도, 객체는 1개임을 보장하니깐 메모리를 절약할 것이다. 물론 이 객체는 자주 쓰여야겠지.이는 이미 작금의 엔터프라이즈 환경에서는 매우 널리 퍼진 유명한 패턴이다. 서블릿도 싱클톤이고, 스프링 빈도 싱클톤이며, 기타 많은 엔터프라이즈 객체가 싱클톤이다. 개념상.. 구현 방법은 제각각이라도..1) 시나리오인스턴스가 1개만 있어도 되.......

Naver Blog

Spring MVC - 예외 처리

바로 이 글 전에 Spring MVC를 쓰다가 너무 길어서, 이 앞에서 잘라버렸다. 이제 Spring MVC를 이용하여 웹 애플리케이션을 개발할 때, 예외를 처리하는 일반적인 방식을 알아보겠다. 잘 설계된 예외 처리 프로세스는 어플리케이션을 견고하게 만든다. 예외가 처리되지 않고 던져지면, 웹서버는 보통 500에러를 내며, default error 페이지로 가거나, 에러 문자열을 마구 찍어낸다. 모 던지기 전에 로깅을 확실히 하고, 피드백을 잘 설계만 해두면, 문제는 사용자 측의 UI나 응답이 지저분하다는 것 밖에 없다. 과연 그럴까?사용자 UI를 망치는 것은 UX에 커다란 구멍임은 말할 것도 없고, 신뢰도를 추락시킨다. 또한 불필요한 오류 정보가 노.......

Naver Blog

그래프

데이터 간의 관계를 표현하는데 최적화된 자료구조. 데이터는 저 대문자 알파벳, 관계는 선이며, 이를 정점(노드)과 간선(엣지)이라고 한다. 저런 형태의 자료구조가 왜 중요할까 하면, 현재의 SNS 시대의 데이터 구조를 조금 생각해 보면 답이 나온다. 이웃, 팔로잉 등등 모든 데이터는 관계를 기반으로 하고 있다.그럼 일반 자료구조로는 관계를 따라갈 수 없는가 하면, 불가능한 것은 아니지만, 효율이 좋을 리 없다. 왜냐하면 관계를 따로 데이터로 보면, 원래 정점과 관계의 경우의 수는 '정점 간 N * N' 로 뒤져야 나오기 때문이다. 또한 어떠한 노드를 경유하는 경우라면 N*N*N이다. 왜냐하면, 경유지를 기준으로 다시 정방 행.......

Naver Blog

이진 트리

일반적으로 배열을 검색할 때는 선형 검색을 수행한다. 즉, 앞에서부터 쭉 비교해보는 것이다. N 크기의 배열일 경우 O(N)의 효율을 가진다. 하지만, 배열을 정렬하면 우리는 다음과 같이 검색할 수 있다.1) 검색하고자 하는 수를 배열의 가운데 위치한 수(기준 수) 와 비교한다.2) 기준 수와 비교하여 작으면 기준 수의 왼쪽 배열을 가져와 다시 1)을 반복한다. (이때 다른 반대쪽 배열은 버리면 된다!)이는, 내가 생각한 숫자를 맞추는 게임에서도 자주 사용하는 방법이다. 어떤 수를 제시하면 크다, 작다를 통해 범위를 줄이게 되는 알고리즘이다. 이를 이진 검색이라고 한다. 배열을 분할하는 차수에 의존하므로 O(logN)의 효율을 가진다.......

Naver Blog

Spring MVC

Spring의 웹 모듈. 사실 Bean Container로서의 핵심 기능 외에, framework로서의 특징을 나타내는 부분이기도 하며, 별도 독립적인 모듈이다. 따라서, 제3의 웹 MVC 모듈을 사용해도 되나, 이 독립 모듈 자체가 스프링의 Core 한 특징을 잘 활용하고 구현하였기 때문에, 사실 이 자체의 완성도가 제3의 웹 모듈에 절대 밀리지 않는다. 고로 스프링을 사용하는데 웹 모듈이 필요한 건 맞는데, 기존 레거시가 다른 3자의 MVC와 융합되어 있어 등등의 별 이상한 이유가 없다면, 그냥 쓰는 것이 낫다.다음은 Spring MVC의 프로세스를 타나 낸다.그림에 Model Instance에 대한 표현이 빠진 것이 살짝 아쉽지만, 아주 잘 표현한 그림이다. (위키에서.......

Naver Blog

구글이 10년간 연구한 '최고의 보스'

1. (최고의 보스는) 좋은 코치입니다.좋은 보스는 동료와 팀을 대신해 문제를 해결해주는 해결사의 덫을 피...

Naver Blog

Kubernetes 기본 개념

Container를 orchestration 하기 위한 가상화 플랫폼.Container는 무수히 많이 생성되고 소멸되며, 이로 ...

Naver Blog

Kubectl command

1. Kubectl Autocomplete1) Bash2) Zsh2. Kubectl Context and Configuration3. Creating Objects...

Naver Blog

객체지향 개발 원칙

스프링이 개발자에게 제공하는 가치 = 객체지향과 테스트※ 객체지향 개발의 원칙 (SOLID)1. ...

Naver Blog

비트마스크

bit : 2진수의 1자리> 예를 들어 8비트를 가지고 부호가 없는 정수 0 부터 255 까지를 표현0 = 00...

Naver Blog

Spring Overview

스프링의 목표1. J2EE 개발을 보다 쉽게2. Business 외의 일반적인 Task를 보다 쉽게3. 좋은 프로그래...

Naver Blog

Spring Core - IoC, DI, Context And Bean

보통 main메소드에서 시작해서 개발자의 의도대로 오브젝트가 생성되고 실행된다. 그런데 서블릿은 컨테이...

Naver Blog

Kubernetes 설치 가이드 - v1.11.3

※ CentOS 7 기준으로 작성됨.※ 내부 베어메탈 서버에 쿠버네티스를 설치하는 가이드이며, 1.11.3 버...

Naver Blog

Docker 기본 개념

application을 위한 하나의 독립된 가상화 플랫폼. Container 안에 application을 넣고, 필요 라이브러리,...

Naver Blog

JVM 이란

jvm은 간단히 얘기하면 java 실행 환경 이다.이것을 아는 것은 왜 중요할까? 이는 jvm 이전의 프로그래밍 ...

Naver Blog

12 Factors

SaaS(Software as a Service) -12원칙1. 단일 코드베이스- 하나의 어플리케이션은 버전 관리되는 하...

Naver Blog

Kafka 기본 개념

한마디로 정의하자면, 고성능에 초점을 맞춘 pub/sub 모델의 메시지 관리자라고 말하겠다.메시지를 생성...

Naver Blog

java 버전별 특징(1.0~1.7)

1. java 1.0- 1996년 1월 발표- "Write Once, Run Anywhere" > JVM 기반- 메모리 관리...

Naver Blog

Java 8 (Spider)

2014.03월, 자바가 오라클에 인수되고 나온 첫 번째 버전으로 출시됨. 언어적으로 가장 역대급 변경이 아닌...

Naver Blog

Spring AOP - 개념

실제 비즈니스에, 템플릿화된 Non-비즈니스 영역에 대한 고민 (로그, 트랜잭션 등)에서 시작.아래의 예를 ...

Naver Blog

Kubernetes Dashboard 설치

※ 설치 버전 : 1.11.3 기준웹 기반 kubernetes 사용자 인터페이스 제공.Dashboard를 사용하여 Kuber...

Naver Blog

Kubernetes Service Object

kubernetes pod cluster에 대한 service discovery 및 loadbalance, dns 서비스를 제공한다.따라서, kubern...

Naver Blog

Kubernetes StatefulSet 구성 (with Kafka)

k8s의 pod repository는 pod과 그 운명을 같이한다. 즉, pod이 죽으면, repository의 내용도 날아가게 된다...

Naver Blog

Java 9 특징

2017년 9월 Release된 자바9는 아마 구조적으로 역대급 변경을 가져오지 않았나 싶다.바로, 2008년 시작된...

Naver Blog

DDD 기본 개념

DDD를 지탱하는 두 가지 축1. MODEL-DRIVEN DESIGN분석/설계/구현이 별개로 나눠...

Naver Blog

Spring Boot 기본

Spring boot는 application을 구성함에 있어 자주 반복되지만 수동적인 의존성을 자동화하고,웹서버를 내...

Naver Blog

Spring 컨테이너 계층구조

하나의 Application에는 보통 하나의 컨테이너(ApplicationContext).But, 부모 Context -> 자녀 C...

Naver Blog

버블 정렬

정렬되지 않은 배열의 첫 번째 요소와 두 번째 요소를 비교하면서, 서로의 순서에 따라 위치를 교환한다.이...

Naver Blog

선택 정렬

배열의 처음부터 최소값을 가정하여 임의 저장하고, 배열의 끝까지 하나하나 비교해 가면서 최소값을 확정...

Naver Blog

삽입 정렬

주어진 배열에서 두 번째 값(index 1)을 임의 변수에 저장하고 해당 위치의 값을 삭제한다. 그리고 삭제된 값의 왼쪽으로 하나씩 비교하여, 크기가 크면 오른쪽으로 시프트 시키고 아니면 그냥 놔둔다. (작은 값으로 정렬됨으로, 값을 비교함에 있어 오른쪽 시프트가 발생하지 않는다면, 그 앞을 비교할 필요가 없다는 의미이므로 비교 연산은 멈춘다). 임의 변수는 비교 후 빈자리에 삽입되므로 삽입 정렬이라고 하나 보다.이 패스 쓰로를 index+1의 위치로 계속 옮기면서 반복한다. 임의 변수 지정이 배열의 끝(length-1)에 도달할 때까지.최악의 경우 배열이 역순으로 정렬되어 있다면, 매번 비교 N * 매번 스위치 N이므로, O(N2) 이다. 이.......

Naver Blog

Hash table

해시는 문자열을 숫자로 변환하는 것이다. 해시 함수라고 하는 것은 이것을 실행하는 알고리즘이다. 해시테이블은 이 해시 함수를 이용하는 key, value 쌍의 자료 구조다. 이를 다시 정리하자면,* 단순화를 위해 문자열은 알파벳 3자리로..1. 해싱 : 문자열을 숫자로 변환. A:1, B:2, C:3 ... 일 경우 CAT = 3, 1, 20.2. 해시 함수 : 실행 알고리즘 -> 문자열 숫자의 곱으로 하겠다! -> CAT = 3 * 1 * 20 = 603. 해시테이블 : 자료구조를 ZZZ까지 생성 -> 26 * 26 * 26 = 17576 번까지의 cell 주소 생성. 각 Cell의 주소는 해시 값이 됨.이제, 이 자료구조에 값을 insert 하면, talbe.set("cat", &qu.......

Naver Blog

재귀 호출

간단히 말하면, 자기 자신을 호출하는 행위. 왜? 반복문을 쓰는 것보다 나은 이점이 있기 때문인데..위 반복문은 주어진 숫자를 역순으로 0까지 프린트하는 단순 반복 로직이다. 이것을 재귀로 풀면반복문은 사라졌다. 다만, 주어진 num을 출력 후, pringDigit 함수를 종료하기 전에 다시 pringDigit 함수를 num-1 해서 호출한다. 언제까지? num이 0보다 작아질 때까지. num이 0보다 작아지게 되면, 더 이상 재귀 호출이 발생되지 않는데(이 시점에서 재귀 호출까지 도달하지 않으니깐) 바로 이 지점을 기저 조건이라고 한다. (기저 조건이 없으면, 무한 반복.. 그럼 Stack이 넘쳐서 Stack Overflow가 발생하는 거다.)이제, 함수는 종료된다. 어.......

Naver Blog

LDAP

LDAP (Lightweight Directory Access Protocol)은 네트워크 상에서 어떠한 정보(전화번호, 주소, 조직, 파일, 프린터 등 하드웨어 위치, 계정 등등)를 쉽게 찾아볼 수 있게 하는 소프트웨어 프로토콜이다.음, 그냥 쉽게 말해 네트워크를 이용한 Directoy 접근이다. Directory이니깐, tree 형태로 자유롭게 그룹 지을 수 있으며, 그 안에는 어떠한 정보도 있을 수 있다는 얘기이고 말이다.그런데, 그냥 단순히 저렇게만 알았는데, 점점 LDAP을 통합 인증의 용도로 많이 사용하고 있다. 왠지 매칭이 되지 않아 처음엔 이해가 잘되지 않았다. 그런데, 바로 요점은 Directory 안에는 어떠한 정보도 있을 수 있다는 것이며 이는 네트워크를 통해 공.......

Naver Blog

퀵 정렬

주어진 배열을 임의의 한 수(피벗)를 기준으로 작은 값은 왼쪽, 큰 값은 오른쪽으로 이동시킨다. 그럼 최소한 이 피벗은 올바른 위치에 있게 된다. 이제 이 피벗을 기준으로 배열을 왼쪽과 오른쪽으로 분할한다. 분할된 배열을 다시 하나의 배열로 보고 이 과정을 반복한다. 분할된 배열의 크기가 1이하가 될 때까지. 즉, 임의의 피벗을 선정하면, 이 피벗은 제외하고 (공간은 제외되지 않는다. 비교 기준으로 low, high pointer에서만 제외다.)1) 분할 : 크기 N인 배열의 left point(low)와 right point(high)에서 각각 피벗과 값을 비교한 후 low와 high를 만족시키는 pointer를 각각 이동시키면서(교환만 발생한다. 둘 다 low 면 정상 포인터.......

1 2 3