Archives
전체 작업 노트
최신순으로 한 페이지에 모았습니다.
FAB 에 언리얼 플러그인 배포하기
FAB 에 언리얼 플러그인 배포하기 플러그인 구조 꼭 준수 해야 되는 플러그인 구조 위에 구조를 준수해야 되며 파이썬 플러그인도 가능은하지만 C 모듈이 없으면 승인처리가 되지 않는다. 기본 등록 방법 1. 퍼블리셔 계정 설정 Fab.com에 로그인하거나 계정을 생성한 후, 상단 툴바에서 Publish를 클릭 Epic Ga
DGX SPARK에서 ONNX Runtime 설치 및 설정하기
DGX SPARK에서 ONNX Runtime 설치 및 설정하기 onnxruntime 패키지는 ONNX(Open Neural Network Exchange) 모델을 실행하기 위한 고성능 런타임입니다. DGX SPARK 환경에서 onnxruntime를 설치하고 설정하는 방법을 안내합니다. DGX SPARK는 arm64 아키텍
언리얼 Python 스크립트로 에디터 자동화하기
언리얼 Python 스크립트로 에디터 자동화하기 언리얼 엔진은 C++와 블루프린트 외에도 Python 스크립팅을 지원하여 에디터 작업을 자동화할 수 있습니다. 그중에서도 python 스크립트의 장점인 번거러운 컴파일 과정이 없다는것이 큰 장점입니다. 만드는 방법은 언리얼에 설명이 되어 있고 에서 다양한 API를 확인할 수
Git LFS와 pre-commit 훅으로 대용량 파일 자동 추적하기
Git LFS와 pre commit 훅으로 대용량 파일 자동 추적하기 pre commit 파일 hooksPath 확인 로컬 설정 글로벌 설정 참조
JEP 444: Virtual Threads
Virtual Threads Summary Java 플랫폼에 가상 스레드를 소개합니다. 가상 스레드는 처리량이 높은 동시 애플리케이션의 작성, 유지 관리 및 모니터링에 드는 노력을 크게 줄여주는 가벼운 스레드입니다. History 가상 스레드는 JEP 425 에서 미리보기 기능으로 제안되어 JDK 19 에 포함되었습니다.
GitHub Pages에서 Custom Domain 설정하기
GitHub Pages에서 Custom Domain 설정하기 A 레코드 설정 A 레코드 설정을 @로 해서 다음 IP 주소로 설정합니다. 도메인 설정 확인 방법 참고
우분투 nvidia 드라이버 업데이트
우분투 nvidia 드라이버 업데이트 사용 가능한 NVIDIA 드라이버 목록 보기 최신 권장 드라이버 자동 설치 수동으로 특정 버전 설치 드라이버 설치 후 재부팅 참고
우분투 에서 5090 driver 설치
우분투 에서 5090 driver 설치 기존 드라이버 삭제 여기서 최신 드라이버 다운로드 driver 설치때 MIT/GPL 라이센스 동의 해야함 참고
우분투 설치시 네트워크 드라이브(R8125) 인식 안됨
우분투 설치시 네트워크 드라이브(R8125) 인식 안됨 현상 위에 명형어를 수행하면 위처럼 나오고 유선랜이 잡히지 않음 해결 방법 위에 링크를 통해서 드라이버를 설치하면 됨 네트워크 없이는 의존성을 설치하기 힘듬 wifi를 통해서 설치하면 됨 참고
Docker login 시 mac keychain 에러
Docker login 시 mac keychain 에러 로그인 예시 에러 해결 방법 Keychain 잠금 해제 참고
Docker build 시 SSH 키 설정 사용
Docker build 시 SSH 키 설정 사용 컴파일 언어를 사용해서 배포할때는 바이너리만 배포하면 되니깐 문제가 없는데(모든 의존성을 build 시점에 같이 묶임) 파이썬 같은 인터프리터 언어를 사용할때는 배포할 시점에 의존성 파일을 다운받아야 된다. venv를 사용해서 가상환경을 만들고, 그 안에 의존성 파일을 다운
jenkins에서 python 빌드하기
jenkins에서 python 빌드하기 아래 와 같은 오류가 날수 있는데 해당 오류는 apt install python dev 로 해결할수 있다. macOS를 host로 사용시에 docker 설정에서는 docker in docker 를 사용할때 아래와 같은 설정이 정상 동작 하지 않는다. /usr/bin/docker:/u
최신 image gen AI 기술 관련 기사
최신 image gen AI 기술 관련 기사 LoRa 관련 기사 안정된 확산 관련 기사 위에 링크들을 보면 기본적인 이미지 생성 관련 내용을 파악할수 있다. 참조
2024년 간략 회고
2024년 간략 회고 업무 stable diffusion 이미지 생성쪽에 대한 연구를 진행하면서 보게 되는 모델이다 sd 1.5 sd 2.1 sdxl 위에 모델 순으로 성능이 좋아지는 것을 확인할 수 있었다. fine tuning LORA dreambooth 위에 2가지 방법으로 fine tuning을 진행하였다. pro
CHAPTER 2 리스트와 딕셔너리
2장 리스트와 딕셔너리 리스트는 아주 간편하며 다양한 문제를 해결하는데 사용 리스트를 자연스럽게 보완할수 있는 타입이 딕셔너리 타입이다 딕셔너리 타입은 일반적으로 해시 테이블이나 연관 배열이라고 부르는 데이터 구조 안에 값을 저장 Better way 11 시퀀스를 슬라이싱하는 방법을 익혀라 슬라이싱 구문의 기본 형태는 리
CHAPTER 1 파이썬다운 생각
1장 파이썬답게 생각하기 가장 파이썬 다운 방식을 알아야 된다 Better way 1 사용 중인 파이썬의 버전을 알아두라 파이썬 2는 수명이 다됨 백포팅이 이루어지지 않음 backporting: 새로운 기능을 이전 버전에서도 사용할 수 있게 하는 것 Better way 2 PEP 8 스타일 가이드를 따르라 파이썬 개선 제
CHAPTER 19 Critique: 구글의 코드 리뷰 도구
Part IV 도구 CHAPTER 19 Critique: 구글의 코드 리뷰 도구 코드 리뷰는 소프트웨어 개발에서 없어서는 안 될 요소입니다. 특히 성장하기 위해 매우 중요한 요소입니다. 코드 리뷰 도구 원칙 간결성 가장 큰 영향을 준 원칙 신뢰 제공 익숙한 소통 방식 워크플로 통합 코드 리뷰 흐름 변경 생성 리뷰 요청 변
CHAPTER 18 빌드 시스템과 빌드 철학
Part IV 도구 CHAPTER 18 빌드 시스템과 빌드 철학 구글 엔지니어에게 빌드시스템은 사랑이다 빌드 시스템의 목적 빌드 시스템의 목적 속도 : 개발자가 명령 하나로 빌드를 수행하고 몇 초안에 결과 바이너리를 얻을 수 있어야 한다. 정확성 : 소스 파일과 기타 입력 데이터가 같다면 모든 개발자가 어떤 컴퓨터에서 빌
CHAPTER 17 Code Search
Part IV 도구 CHAPTER 17 Code Search 구글이 이용하는 코드 브라우징 및 검색 도구 Code Search UI 핵심요소는 검색창 파일 하나를 들여다 볼때 대부분은 토큰을 바로 클릭하여 관련 정보로 빠르게 이동 할수 있다 이슈 트래커 코드 참조 클래스 구글 개발자가 Code Search를 이용하는 방법
CHAPTER 16 버전 관리와 브랜치 관리
Part IV 도구 CHAPTER 16 버전 관리와 브랜치 관리 버전 관리 시스템은 가장 널리 쓰이는 소프트웨어 엔지니어링 도구 트렁크 기반 개발(Trunk Based Development)이 확장성이 뛰어나기에 그 이유와 함깨 몇가지 제안 버전 관리란? VCS(Version Control System)은 파일의 시간에
CHAPTER 15 폐기
Part III 프로세스 CHAPTER 15 폐기 모든 시스템은 나이를 먹습니다. 소프트웨어는 디지털 자산이라서 물리적인 비트들 자체가 늙지 않는다. 이주를 순차적으로 시켜서 낡은 시스템을 완전히 걷어내는 과정은 폐기라 한다 폐기시키는 이유 기본전재는 코드는 자산이 아니라 부채다 라는 기본 전재에서 시작함 코드가 부채가
CHAPTER 14 더 큰 테스트
Part III 프로세스 CHAPTER 14 더 큰 테스트 테스트들이 자원 낭비가 아닌 값진 자산이 되게끔 하려면 또 다른 난관을 극복해야 된다 더 큰 테스트란? 더 큰 테스트의 특징 느릴 수 있다 밀폐되지 않을 수 있다 비결정적일 수 있다 충실성 테스트가 대상의 실제 행위를 얼마나 충실하게 반영했는냐를 나타내는 속성 단
CHAPTER 13 테스트 대역
Part III 프로세스 CHAPTER 13 테스트 대역 단순한 코드라면 단위 테스트 작성이 전혀 부담되지 않습니다 하지만 대상 코드가 복잡해질수록 테스트를 작성하기도 어려워진다 테스트 대역은 실제 구현 대신 사용 할 수 있는 객체나 함수를 말한다 테스트 대역이 소프트웨어 개발에 미치는 영향 테스트 용이성 적용 가능성 충
3D Gaussian Splatting
3D Gaussian Splatting colmap을 사용해서 3D reconstruction을 하고 나서 3D Gaussian Splatting을 사용해서 rendering을 할 수 있다. ㅇ ㅎ 위에 폴더 구조를 따라야 된다. 참조
3D Vision 2
3D Vision Implicit Function: NeRF NeRF 2020 년에 나온 논문 인풋으로 카메라 포즈를 알고 있는 픽셀들의 레이드를 알고 있어 그걸로 렌더링하는 게 목표 데이터는 신에대한 이미지 colmap sfm pipeline을 사용해서 데이터를 만들었다 Positional Encoding fourfea
CHAPTER 12 단위 테스트
Part III 프로세스 CHAPTER 12 단위 테스트 작은 테스트는 빠르고 결정적이어서 개발자들이 수시로 수행하며 피드백을 즉각 얻을수 있다 단위 테스트는 대체로 대상 코드와 동시에 작성할 수 있을 만큼 작성하기 쉽다 빠르게 작성할 수 있으므로 테스트 커버리지를 높이기 좋다 시스템의 특정 부분에 집중하므로 실패 시 원
3D Vision 1
3D Vision 3차원 데이터는 x,y,z 같은 좌표를 갖는다 3D Representations: Point Cloud, Voxel, Mesh 컴퓨터를 통해서 3D 데이터를 어떻게 만들어야 되나 시멘틱 vs 신텍스 Raw data Point cloud Unstructured Range image 텝스이미지의 스캔한 이미
CHAPTER 11 테스트 개요
Part III 프로세스 CHAPTER 11 테스트 개요 테스트는 처음부터 프로그래밍과 함께다 소프트웨어와 시스템 복잡도에 대응하기 위해 테스트 방식을 극적으로 진화 그 진화의 중심에는 개발자가 주도하는 테스트와 자동 테스트가 있다 자동 테스트는 버그가 몰래 숨어들어 고객을 놀라게 하는 사태를 막아준다 테스트 체계가 잘
CHAPTER 10 문서자료
Part III 프로세스 CHAPTER 10 문서자료 대부분의 엔지니어가 코드를 작성하고 이용하고 유지보수 하면서 대표적인 불만이 양질의 문서자료가 부족하다는 점 구글에서 문서 자료를 개선하고자 해본 시도 중 가장 성공적이었던 방법은 문서자료를 코드처럼 취급하여 엔지니어링 워크플로에 통합하는 것 문서자료란? 엔지니어가 작
3부 문을 열다 / 어떻게 통찰을 촉진할 수 있는가
3부 문을 열다 / 어떻게 통찰을 촉진할 수 있는가 통찰의 경로 모순 경로 연결 경로 창의적 절망 경로 14장 우리 자신을 돕기 모순의 힘을 더 잘 사용하는 것 연결 경로는 많은 아이디어들을 빙빙 돌게 만들며 우연한 링크를 만드는데 뛰어나다 소용돌이와 난류가 많을수록 발견의 확률은 더 높아진다 아이디어 밀도를 높이고 창의
2부 문을 닫다 / 무엇이 통찰을 방해하는가
2부 문을 닫다 / 무엇이 통찰을 방해하는가 9장 어리석음 동일한 상황 동일한 정보가 있어도 어리석으면 통찰을 얻지 못한다. 그 생각을 못했다니 얼마나 멍청한가 헉슬리 10장 대조적 쌍둥이 연구 통찰을 얻지 못함 결함이 있는 믿음에 빠짐 경험 부족 수동적 자세 구체적 추론 방식 통찰에 개방적이도록 놓아 두지 않는다. 통찰
1부 통찰의 문으로 들어가다 / 통찰은 어떻게 촉발되는가
1부 통찰의 문으로 들어가다 / 통찰은 어떻게 촉발되는가 성과 개선 = 실수를 줄이고 + 통찰을 올리는것 하지만 실수를 모두 제거해 버리면 통찰을 얻기 힘들다 1장 통찰 사냥하기 다양한 방법으로 통찰을 얻어낸다 2장 번뜩임의 순간 준비 배양 조명 확인 삶의 통찰을 따라다니는 내 매일의 아름다움이여 선율을 바꾸고 내 미지의
CHAPTER 9 코드 리뷰
Part III 프로세스 CHAPTER 9 코드 리뷰 코드 리뷰는 작성자 이외에 사람이 코드를 검토하는 프로세스로 주로 코드를 코드베이스에 반영하기 전에 수행한다 코드리뷰는 버그가 코드베이스로 침투하기 전에 잡아 낸다. 코드 리뷰 흐름 변경을 코드에 커밋하기 전에 리뷰 하는데 이 단계를 프리커밋 리뷰라고 한다 코드 리뷰
CHAPTER 8 스타일 가이드와 규칙
Part III 프로세스 CHAPTER 8 스타일 가이드와 규칙 조직 내부 코드베이스를 관리하는 규직은 어디든 존재한다 규칙은 법이다. 지침은 권장사항과 모법사례를 이야기함 따르는 편이 이득이라 어지간하면 따르라고 권한다 코드의 지속 가능성을 높이도록 이끄는것 규칙이 필요한 이유 좋은 행동을 장례하고 나쁜 행동을 억제하기
CHAPTER 7 엔지니어링 생산성 측정하기
Part II 문화 CHAPTER 7 엔지니어링 생산성 측정하기 구들은 데이터를 토대로 결정하는 데이터 주도 회사 이다. 제품과 설계에 관한 결정 대부분을 근거 데이터와 함께 백업해놓는다 엔지니어링 생산성을 측정하는 이유 사업을 확장하려면 충원을 피할수 없는데 그에 따른 소통 비용이 너무 가파르게 늘어난다 사업확장문제를
CHAPTER 6 성장하는 조직 이끌기
Part II 문화 CHAPTER 6 성장하는 조직 이끌기 팀하나를 이끌게 되었다면 다음 순서로는 연관된 여러 팀을 이끄는게 자연스러운 흐름 역활이 커져도 기존의 모범사례들은 계속 유효하다 섬기는 리더 3A 리더쉽 늘 결정하라(Always Be Deciding) 기존 보다 높은 수준에서 더 많은 걸 결정해야 한다는 뜻 여
CHAPTER 5 팀 이끌기
Part II 문화 CHAPTER 5 팀 이끌기 구글의 리더의 역활 관리자 : 사람을 이끌고 테크리드 : 기술과 관련 책임을 진다 관리자와 테크 리드(혹은 둘 다) 엔지니어링 관리지 팀 구성원 모두의 성과, 생산성, 행복을 책임져야 한다 제품의 사업적 요구까지 충족시켜야함 테크 리드 팀의 기술적인 면, 기술과 관련한 결정
CHAPTER 4 공정 사회를 위한 엔지니어링
Part II 문화 CHAPTER 4 공정 사회를 위한 엔지니어링 프로그래밍은 당면한 문제에 집중하여 코드를 생산한다 우기가 얻은 깨우침을 다음 세대에 전하여 차세대 엔지니어들은 우리보다 나은 결정을 내리도록 이끄는 일이 중요하다고 생각 편견은 피할 수 없다 무의식적인 편견은 교묘하여 의도적인 배척 행위보다 물리치기 어려
CHAPTER 3 지식 공유
Part II 문화 CHAPTER 3 지식 공유 조직은 자신의 문제 대부분에 스스로 답할 수 있어야 한다 조직은 질문의 답을 아는 전문가들이 필요하고 그들의 지식을 전파할 메커니즘도 필요하다 조직에는 배움의 문화가 자리 잡혀 있어야 한다 사람들에게 모르는것을 인정할 수 있도록 돕는 심리적 안전을 제공해야 한다 배움을 가로
CHAPTER 2 팀워크 이끌어내기
Part II 문화 CHAPTER 2 팀워크 이끌어내기 반듯이 통제해야 하는 하나의 변수는 자기자신이다 사람은 간헐적 버그들의 집합 내 코드를 숨기고 싶어요 불안감 때문에 코드를 숨기고 싶어 한다 천재 신화 천재 신화의 진짜 업적은 사람들을 협업하도록 이끈것이다 숨기는 건 해롭다 오롯이 홀로 일한다면 실패할 위험성을 불필
CHAPTER 1 소프트웨어 엔지니어링이란?
Part I 전제 CHAPTER 1 소프트웨어 엔지니어링이란? 프로그래밍과 소프트웨어 엔지니어링의 가장 큰 차이 시간 확장 트레이드오프 소프트웨어 엔지니어링은 흐르는 시간 위에서 순간순간의 프로그래밍을 모두 합산한것 이 코드의 예상 수명은? 지속가능성 소프트웨어 프로젝트의 팀 조직, 프로젝트 구성, 정책과 관례는 모두 소
CHAPTER 7 비폭력대화로 세상은 달라질 수 있다
CHAPTER 7 비폭력대화로 세상은 달라질 수 있다 자신의 삶에서 세상으로 시선을 넓힌다 다른 사람의 욕구가 충족되지 않은 상태에서 우리의 욕구를 채울수는 없다 세상의 아름다움을 느끼며 나 자신에게 다가가 삶의 풍요로움이 창조한 에너지를 먹을 것이 필요한곳에 사용하자 불평등한 구조를 변화시키려면 가장 좋은 방법은 각자의
CHAPTER 6 선과 악의 경계를 묻다
CHAPTER 6 선과 악의 경계를 묻다 폭력과 비폭력에 대하여 분노에는 사람들의 모습이 상징적으로 담겨 있다 분노를 통해 욕구가 드러나기 때문 우리를 강조하며 똘똘 뭉침 간디는 수동적인 태도와 폭력중 한 가지를 택할 수 밖에 없으면 폭력을 택하겠다고 말했다 폭력 행사는 최후의 수단 옳음과 그름을 초월한 장소에서 만나게
CHAPTER 5 공감이 아이의 마음을 연다
CHAPTER 5 공감이 아이의 마음을 연다 선을 그어야 할 대상은 나이와 상관없다 부모가 자녀를 어린아이로 인식해서 자칼의 언어를 쓰게 된다 부모는 아이의 행동을 통제할수 없다 자신의 욕구를 보호하거나 채우기 위해 일정한 선을 그어야 될수도 있는데 이것은 나이랑 상관 없다 옳고 그르다는 말은 아이의 자존감을 낮춘다 나이
CHAPTER 4 사랑을 어떻게 말하는가
CHAPTER 4 사랑을 어떻게 말하는가 마음을 구체적으로 묻고 표현하는 법 구체적인 마음의 표현을 말로 하는게 좋다 단순 사랑해보다 구체적으로 표현해보자 관계에 필요한 말들 상대에게 보장할수 있는것은 지금 이 순간의 목적 뿐이다 나의 욕구는 어디에 있는가? 나에게 정말 의미있는 것은 무엇인가를 스스로에게 묻고 이것을 상
CHAPTER 3 말이 필요 없는 것이 공감이다
CHAPTER 3 말이 필요 없는 것이 공감이다 현재에 집중한다 공감은 인간이 다른 사람에게 줄 수 있는 가장 값진 선물 타인은 공감을 통해 유대감을 느낀다 공감은 동의가 아니다 내가 당신의 마음을 잘 읽은 걸까 공감은 서핑과 비슷 파도를 잘 타야 된다 우리가 정해 놓은 기준에 얽매이지 말고 조금씩 벗어나려 노력해보자 비
CHAPTER 2 삶의 갈증이 욕구가 된다
CHAPTER 2 삶의 갈증이 욕구가 된다 우리는 욕구를 표현하는 법을 모른다 비폭력적 대화는 다양한 상황에서 우리 안에서 일어나는 상태(상황)에 적합한 표현을 찾는다 인간은 무리를 지어 사는 동물이다 즉 인간은 욕구를 채우기 위해 서로에게 도움을 주어야 한다 사람에게 가장 중요하고 필요하다고 느끼는 욕구는 존중 내 안에
CHAPTER 1 내 안의 감정을 이해한다
CHAPTER 1 내 안의 감정을 이해한다 나의 감정은 온전히 내 것이다 자칼 : 소통하는데 어려움을 느끼게 만드는 사람 기린 : 진심이 담긴 언어의 상징 비폭력적대화 지금 내 안에 무엇이 살아있는가? 무엇이 내 삶을 충만하게 하는가? 비폭력적 대화의 4가지 요소 관찰 감정 욕구 부탁 평가 하지 말고 관찰만 한다 지금 내
Part 3 이론
Part 3 이론 언제 소프트웨어 설계 결정을 시작해야 하는가? 언제 소프트웨어 걸계 결정을 중단하고 시스템의 동작을 변경해야 하는가? 다음 결정은 어떻게 내릴것인가? Chapter 22 요소들을 유익하게 관계 맺는 일 소프트웨어 설계는 인간관계 속에서 벌어지는 활동 요소 요소에는 경계가 있다 계층 구조 관계 맺기 호출하
Part 2 관리
Part 2 관리 Chapter 16 코드 정리 구분 다양한 변경 필요성을 구분하지 않은 상태에서 변경 시도 동작 변경과 구조 변경 순서를 부여한 동작 변경과 구조 변경 별도의 pr 포함된 동작 변경과 구조 변경 Chapter 17 연쇄적인 정리 보호 구분 보호 구분을 통해 코드 정리를 진행하면 조건이 설명하는 도우미로
Part 1 코드 정리법
Part 1 코드 정리법 Chapter 1 보호 구문 중첩된 조건은 헷갈린다 보호 구문은 코드를 읽기 쉽게 만든다 Chapter 2 안 쓰는 코드 삭제 하라 Chapter 3 대칭으로 맞추기 같은 문제라도 시대와 사람에 따라 다른 모습으로 해결된다 자연스러운 일이지만 이것이 코드를 읽기 어렵게 만들기도 한다 코드를 읽는
LoRa 학습용 tool
LoRa 학습용 tool lora scripts a.k.a SD Trainer 중국에서 로라 학습용으로 만든 gui와 script를 동시에 지원하는 툴 중국어만 지원함 SD script accelerate 라이브러리를 활용해서 미세조정 스크립트 kohya ss 툴에서 사용중 kohya ss windows에서 동작하는 툴
Semantic Matching 2
Semantic Matching 2 Semantic Flow UCN(Universal Correspondence Networks) Fully convolutional NN STNs L2 Normalization Proposal Flow Comparisons 매칭 알고리즘 Semantic Correspondence dens
Semantic Matching 1
Semantic Matching 1 Semantic Alignment Spatial Transformer Networks Differentiable spatial transformation Localisation network Parameterised Sampling Grid Differentiable Image Samp
CHAPTER 8 행동 디자인 패턴 PART1
CHAPTER 8 행동 디자인 패턴 PART1 생성 디자인 패턴 : 주로 객체의 생성에 관련된 문제 해결 구조 디자인 패턴 : 주로 클래스나 객체의 결합 문제를 해결 행동 디자인 패턴 : 주로 클래스나 객체의 상호작용 문제를 해결 8.1 옵서버 패턴 8.1.1 옵서버 패턴의 정의 발행 구독 패턴이라고도 한다 많은 객체들
CHAPTER 7 구조 디자인 패턴_PART_1
CHAPTER 7 구조 디자인 패턴 PART 2 7.3.4 래퍼 패턴 프록시 패턴 데커레이터 패턴 어뎁터 패턴 코드 구조 측면에서 이 세가지 디자인 패턴을 통틀어 래퍼 패턴으로 구분 원본 클래스를 래퍼 클래스를 통해 두 번 캡슐화하는 패턴 7.4 브리지 패턴 상속 대신 합성을 사용 복잡한 상속 관계를 간단한 합성 관계로
CHAPTER 7 구조 디자인 패턴_PART_1
CHAPTER 7 구조 디자인 패턴 PART 1 프록시 패턴 : 원본기술가 연관 없는 기능을 추가할 때 사용 데커레이터 패턴: 원본 클래스와 관련 있거나 향산된 기능을 추가할 때 사용 어댑터 패턴: 코드 호환성 문제 해결 브리지 패턴 : 합성의 폭발문제를 해결하는 데 사용 퍼사드 패턴 : 인터페이스 설계에 사용 복합체 패
Multiview geometry 2
Multiview geometry 2 Wide Baseline Matching Patch based model L2 Net HardNet SOSNet HyNet Dense Imaging Model GIFT GLU Net Joint Detection and Description LIFT LF Net SuperPoint Se
CHAPTER 6 생성 디자인 패턴
CHAPTER 6 생성 디자인 패턴 6.1 싱글턴 패턴 (1) 6.1.1 싱글턴 패턴의 정의 어떤 클래스의 객체 또는 인스턴스를 단 하나만 생성할 수 있다면, 해당 클래스는 싱글턴 클래스이며, 이 디자인 패턴을 싱글턴 패턴이라고 한다 클레스안에 시스템에 한 번만 저장되어야 하는 데이터가 포함된 경우 해당 클래스는 싱글턴
Multiview geometry 1
Multiview geometry 1 Local Features 이미지에 중요한 부분 Image representation Object appearance modeling Finding matches between multiple views Model Fitting and RANSAC Finding vanishing po
CHAPTER 5 리팩터링 기법
CHAPTER 5 리팩터링 기법 5.1 리팩터링의 네 가지 요소: 목적, 대상, 시기, 방법 5.1.1 리팩터링의 목적 코드에 대한 이해를 쉽게 하기 위해 소프트웨어의 내부 구조를 개선하는 것으로 소프트웨어의 외부 동작을 변경하지 않고 수정 비용을 줄이는 것을 목적으로 한다 고품질 코드는 훌륭한 설계 한 번에 나오는 것이
Object Detection & Segmentation 2
Object Detection & Segmentation 2 Additional Object Detection Techniques Feature Pyramid Netowrk (FPN) 충분히 빠르다 다양한 크기의 물체를 잘 찾아낸다 scale robustness 는 object detection에 중요하다. Image p
CHAPTER 4 코딩 규칙
CHAPTER 4 코딩 규칙 4.1 명명과 주석 명명은 코드 가독성에 큰 영향을 미치며 프로그래머의 기본 능력과 소양을 반영 하기도 한다 4.1.1 긴 이름과 짧은 이름 긴 이름 : 가급적 이름이 그 의미를 자세하기 표현하기 원함 그래야 한눈에 설계 의도를 파악할수 있기 때문 짧은 이름 : 코드가 간결하다 명명시 일반적인
Object Detection & Segmentation 1
Object Detection & Segmentation 1 Object Detection : 이미지 내에서 특정 객체의 위치를 찾아내는 것 Segmentation : 이미지 내에서 특정 객체의 픽셀을 찾아내는 것 Object Detection = Box localization + Box classification Reg
CHAPTER 3 설계 원칙
CHAPTER 3 설계 원칙 3.1 단일 책임 원칙 3.1.1 단일 책임 원칙의 정의 및 해석 단일 책임 원칙(single responsibility principle, SRP)은 클래스와 모듈은 하나의 책임 또는 기능만을 가지고 있어야 된다 주의할 점은 단일 책임 원칙이 설명하는 대상에는 클래스와 모듈이라는 두가지 종류
Representation Learning (Self-Supervised Learning)
Representation Learning (Self Supervised Learning) 학습 기법의 label에 따른 분류 딥러닝 모델 학습을 위해서는 많은 레이블이 필요하다. 하지만, 비싼 레이블링 없이도 모델을 잘 학습시키는 것은 중요하다. Supervised learning의 단점 "레이블" 데이터가 많아야 함
Representation Learning 2
Representation Learning 2 place recognition(NetVLAD) Vector of Locally Aggregated Descriptors (VLAD) VLAD는 이미지의 특징점을 클러스터링하여 각 클러스터에 대한 특징점의 차이를 계산한 후 이를 이용하여 이미지를 표현하는 방법이다. NetVL
CHAPTER 2 객체지향 프로그래밍 패러다임
CHAPTER 2 객체지향 프로그래밍 패러다임 객체지향 프로그래밍은 현 시점에 가장 대중적인 프로그래밍 패턴이다 2.1 객체지향이란 무엇인가? 2.1.1 객체지향 프로그래밍과 객체지향 프로그래밍 언어 객체지향 프로그래밍이란? 프로그래밍 패러다임 또는 프로그래밍 스타일을 의미한다 코드를 구성하는 기본 단위로 클래스 와 객체
Representation Learning 1
Representation Learning 1 Metric Learning 메트릭이란 거리를 측정하는 함수를 말한다. 메트릭 러닝은 데이터의 표현을 학습하는 것이다. 이는 데이터의 표현을 학습하여 거리를 측정하는 함수를 학습하는 것이다. 유사도(Similarity) 거리(Distance)의 관계를 학습하는 것이다. Inf
CHAPTER 1 개요
CHAPTER 1 개요 1.1 코드 설계를 배우는 이유 코드 설계에 대한 지식은 확장성과 가독성이 높아 유지 보수가 용이한 고품질 코드를 작성할때 필요하다 1.1.1 고품질의 코드 작성 속도와 확장성을 맹목적으로 추구하는 현재의 개발 환경에서 안타깝게도 대다수의 소프트웨어 엔지니어는 고품질의 코드를 작성하는 방법에 대한
CHAPTER 18 반응형 아키텍처와 어니언 아키텍처
CHAPTER 18 반응형 아키텍처와 어니언 아키텍처 반응형 아키텍처(reactive architecture)는 순차적인 액션을 표현하는 방식을 뒤집습니다 어니언 아키텍처(onion architecture)는 함수형 프로그래밍으로 현실 세계를 다루기 위한 고수준의 개념입니다 두 아키텍처 패턴은 독립적입니다 반응형 아키텍처
Deep Learning-2
Deep Learning 2 Beyond ResNet DenseNet : Add Dense Connection ResNet의 단점을 보완하기 위해 제안된 방법 ResNet은 입력과 출력을 더하는 방식으로 연결을 만들었지만, DenseNet은 입력과 출력을 Concatenation하는 방식으로 연결을 만듬 SENet : S
AnimateDiff: Stable Diffusion for Animation Generation with ComfyUI
AnimateDiff: Stable Diffusion for Animation Generation with ComfyUI 지금 까지 comfyui에 AnimateDiff를 사용하여 애니메이션을 생성하는 플러그인은 2개 정도 인데 플러그인은 img2img를 사용하여 애니메이션을 생성하지 못한다 그래서 플러그인을 사용하여 애
CHAPTER 17 타임라인 조율하기
CHAPTER 17 타임라인 조율하기 타임라인을 나누기 위한 동시성 기본형 경쟁조건(race condition)은 어떤 동작이 먼저 끝나는 타임라인에 의존할 때 발생합니다 코드에 Cut() 적용하기 딱 한 번만 호출하는 기본형 최초 한 번만 효과가 발생하는 액션을 멱등원(idempotent)이라고 합니다. 요약: 타임라인
CHAPTER 16 타임라인 사이에 자원 공유하기
CHAPTER 16 타임라인 사이에 자원 공유하기 좋은 타임라인의 원칙 타임라인은 적을수록 이해하기 쉽다 타임라인은 짧을수록 이해하기 쉽다 공유하는 자원이 적을수록 이해하기 쉽다 자원을 공유한다면 서로 조율해야 한다 시간을 일급으로 다룬다 자바스크립트에서 큐 만들기 큐는 자료 구조지만 타임라인 조율에 사용한다면 동시성 기
Deep Learning-1
Deep Learning 1 Perceptron, MLP 인공신경망의 기초 단위 activation function을 통해 입력값을 출력값으로 변환 binary threshold function sigmoid function rectified linear unit (ReLU) loss 값을 최소화하는 방향으로 가중치를 조
CHAPTER 15 타임라인 격리하기
CHAPTER 15 타임라인 격리하기 타임라인 다이어그램은 시간에 따라 어떤 일이 일어나는지 보여줍니다 두 가지 타임라인 다이어그램 기본 규칙 두 액션이 순서대로 나타나면 같은 타임라인에 넣는다 두 액션이 동시에 실행되거나 순서를 예상할 수 없다면 분리된 타임라인에 넣는다 액션은 순서대로 실행되거나 동시에 실행된다 순서대
고전적인 컴퓨터 비전
Classical Computer Vision Local Image Features Image Feature 이미지를 수치적 값의 관점에서 추출한 정보 좋은 로컬 피처란?(interest point) saliency 눈에 띄는 정도가 높을수록 좋은 피처 Locality 이미지의 작은 부분에 대한 특징을 잘 나타내는 피처
CHAPTER 14 중첩된 데이터에 함수형 도구 사용하기
CHAPTER 14 중첩된 데이터에 함수형 도구 사용하기 함수형 도구: update() 객체를 다루는 함수형 도구 update2() 도출하기 incrementSizeByName()을 만드는 네 가지 방법 옵션1: update()와 incrementSize()로 만들기 옵션2: update()와 update2()로 만들기
컴퓨터 비전 이것만 알고 가자
Computer Vision 선형대수학(Linear algebra) Image description(Vector) + Decision Making(Function) = Image Understanding Vector 크기와 방향을 가진 기학적 오브젝트 연산(Operations) 내적(inner product) 외적(out
CHAPTER 13 함수형 도구 체이닝
CHAPTER 13 함수형 도구 체이닝 여러 단계를 하나로 조합하는것을 체이닝(chaining)이라고 합니다. 체인을 명확하게 만들기 1: 단계에 이름 붙이기 체인을 명확하게 만들기 2: 콜백에 이름 붙이기 체인을 명확하게 만들기 3: 두 방법을 비교 일반적으로는 콜백에 이름 붙이기가 더 명확하다 반복문을 함수형 도구로
합성곱(Convolution)
합성곱(Convolution) grayscale 0 255 사이의 값을 가지는 이미지를 사용한다. RGB 이미지는 channel이 3개 필터 연산 : 이미지에 필터를 적용하는 연산 방법 필터 : 3x3, 5x5, 7x7 등의 크기를 가지는 행렬 연산 : weighted sum 이미지 정보를 나열하면 지역적 특성이 사라져서
CHAPTER 12 함수형 반복
CHAPTER 12 함수형 반복 함수형 도구: map() X 값이 있는 배열을 받아서 Y 값이 있는 배열로 변환 한다 함수를 전달하는 세 가지 방법 전역으로 정의하기 지역적으로 정의하기 인라인으로 정의하기 함수형 도구: filter() 배열에서 일부 항목을 선택하는 함수 함수형 도구: reduce() 배열을 순회하면서 값
CHAPTER 11 일급 함수 II
CHAPTER 11 일급 함수 II 코드 냄새 하나와 리팩터링 두 개 코드의 냄새: 함수 이름에 있는 암묵적 인자 거의 똑같이 구현된 함수가 있다 함수 이름이 구현에 있는 다른 부분을 가르킨다 리팩터링: 암묵적 인자 드러내기 리팩터링: 함수를 본문을 콜백으로 바꾸기 카피 온 라이트 리팩터링하기 함수 본문을 콜백으로 바꾸기
CHAPTER 10 일급 함수 I
CHAPTER 10 일급 함수 I 코드의 냄새: 함수 이름에 있는 암묵적 인자 특징 거의 똑같이 구현된 함수가 있다 함수 이름이 구현에 있는 다른 부분을 가리킨다 리팩터링: 암묵적 인자를 드러내기 단계 함수 이름에 있는 암묵적 인자를 확인한다 명시적인 인자를 추가한다 함수 본문에 하드 코딩된 값을 새로운 인자로 바꾼다 함
선형 회귀(Linear Regression)
선형 회귀(Linear Regression) Linear 선을 그려 Regression 값을 예측 회귀(Regression)는 통계학과 머신러닝에서 사용되는 용어로, 어떤 변수의 값을 다른 변수의 값으로 예측하거나 설명하는 모델 데이터를 일반화하는 선을 찾는다 그 선을 이용해 새로운 데이터를 예측한다 y = ax+b 가증
신경망(Neural Networks)
신경망(Neural Networks) 행렬곱 one hot encoding 통해서 행렬을 만들고 가중치 행렬과 행렬곱을 수행하여 예측값을 만들어낸다. 경사 하강법(Gradient Descent) 경사 하강법은 함수의 기울기를 구하고, 기울기가 낮은 쪽으로 이동시키면서 최소값을 찾는 방법이다. (최소 cost/loss를 찾
CHAPTER 9 계층형 설계 II
CHAPTER 9 계층형 설계 II 계층형 설계 패턴 패턴 1: 직접구현 패턴 2: 추상화 벽 패턴 3: 작은 인터페이스 패턴 4: 편리한 계층 패턴 2: 추상화 벽 추상화의 벽(abstraction barrier)은 세부 구현을 감춘 함수로 이루어진 계층 팀 간 책임을 명확하게 나누는 것 세부적인 것을 감추는 것은 대칭
CHAPTER 8 계층형 설계 I
CHAPTER 8 계층형 설계 I 소프트웨어 설계란 무엇입니까? 소프트 웨어 설계 : 코드를 만들고, 테스트하고, 유지보수하기 쉬운 프로그래밍 방법을 선택하기 위해 미적 감각을 사용하는 것 계층형 설계란 무엇인가요? 계층형 설계는 소프트웨어를 계층으로 구성하는 기술 각 계층에 있는 함수는 바로 아래 계층에 있는 함수를 이
CHAPTER 7 신뢰할 수 없는 코드를 쓰면서 불변성 지키기
CHAPTER 7 신뢰할 수 없는 코드를 쓰면서 불변성 지키기 레거시 코드와 불변성 방어적 복사 : 카피 온 라이트 원칙을 지키면서 안전하게 함수를 사용할수 있는 다른 원칙 우리가 만든 카피 온 라이트 코드는 신뢰할 수 없는 코드와 상호작용해야 합니다 모든 코드는 불변성이 지켜지는 안전지대에 있다 안전지대 밖으로 나가는
CHAPTER 6 변경 가능한 데이터 구조를 가진 언어에서 불변성 유지하기
CHAPTER 6 변경 가능한 데이터 구조를 가진 언어에서 불변성 유지하기 동작을 읽기, 쓰기 또는 둘 다로 분류하기 쓰기 동작은 불변성원칙에 따라 구현해야 한다 불변성 원칙은 카피 온 라이트(Copy On Write)라고 한다 카피 온 라이트 원칙 세 단계 복사본 만들기 복사본 변경하기 복사본 리턴하기 쓰기를 하면서 읽
CHAPTER 5 더 좋은 액션 만들기
CHAPTER 5 더 좋은 액션 만들기 비즈니스 요구 사항과 설계를 맞추기 액션에서 계산으로 리팩터링하는 과정은 단순하고 기계적이였다 기계적인 리팩터링이 항상 최선의 구조를 만들어 주는 것은 아니다 좋은 구조를 만들기 위해서 사람의 손길이 필요하다 중복이 항상 나쁜것은 아니지만 코드에서 나는 냄새이다. 코드 냄새는 나중에
CHAPTER 4 액션에서 계산 빼내기
CHAPTER 4 액션에서 계산 빼내기 테스트하기 쉽게 만들기 DOM 업데이트와 비즈니스 규칙은 분리되어야 한다 전역변수가 없어야 한다 재사용하기 쉽게 만들기 전역변수에 의존하지 않아야 한다 DOM을 사용할 수 있는 곳에서 실행된다고 가정하면 안됩니다 함수가 결과값을 리턴해야 한다 함수에는 입력과 출력이 있습니다 입력은
CHAPTER 3 액션과 계산, 데이터의 차이를 알기
CHAPTER 3 액션과 계산, 데이터의 차이를 알기 일반적으로 코드에 액션이 너무 많이 사용되고 있는 반면에 계산은 거의 찾아보기 힘든 이유를 알수 있다 액션과 계산, 데이터 함수형 프로그래머는 액션 계산 데이터를 구분한다 문제에 대해 생각할 때 문제에 대해 고민하고 있을 때도 문제를 액션과 계산 데이터로 나눠 생각해
CHAPTER 2 현실에서의 함수형 사고
CHAPTER 2 현실에서의 함수형 사고 토니 피자에 오신 것을 환영합니다 계층형 설계(stratifed design)원칙이 어떤것인지 알아 본다 분산시스템을 이해 하려고 타임라인 다이어그램(timeline diagram)을 사용 파트 I: 액션과 계산, 데이터 액션: 호출 횟수와 시점에 의존하는 것 계산: 어떤 것을 결
CHAPTER 1 쏙쏙 들어오는 함수형 코딩에 오신 것을 환영합니다
CHAPTER 1 쏙쏙 들어오는 함수형 코딩에 오신 것을 환영합니다 함수형 프로그래밍은 무엇인가요? 함수형 프로그래밍(functional programming) 수학 함수를 사용하고 부수 효과(side effect)를 피하는것이 특성인 프로그래밍 패러다임 부수 효과 없이 순수 함수(pure function)만 사용하는 프
11장. 단위 테스트 안티 패턴
11장. 단위 테스트 안티 패턴 비공개 메서드 단위 테스트 전혀 하지 말아야 된다 비공개 메서드와 테스트 취약성 단위 테스트를 하려고 비공개 메서드를 노출하는 경우에는 식별할수 있는 동작만 테스트하는 것을 위반한다 비공개 메서드와 불필요한 커버리지 죽은 코드다 추상화가 누락되어 있다 비공개 메서드 테스트가 타당한 경우 비
10장. 데이터베이스 테스트
10장. 데이터베이스 테스트 통합 테스트라는 퍼즐의 마지막 조각은 프로세스 외부 관리 의존성이다. 가장 일반적인 예는 애플리케이션 데이터베이스다 실제 데이터베이스를 테스트하면 회귀 방지가 아주 뛰어나지만 설정하기 쉽지 않다 데이터베이스 테스트를 위한 전제 조건 형상 관리 시스템에 데이터베이스 유지 개발자마다 별도의 데이터
9장. 목 처리에 대한 모범 사례
9장. 목 처리에 대한 모범 사례 목은 테스트 대상 시스템과 의존성 간의 상호 작용을 모방하고 검사하는 데 도움이 되는 테스트 대역이다 목은 비관리 의존성에만 적용해야 된다 목의 가치를 극대화하기 비관리 의존성에만 목을 사용하게끔 제한하는 것이 중요하지만 이는 목의 가치를 극대화 하기 위한 첫 번째 단계일 뿐이다 시스템
8장. 통합 테스트를 하는 이유
8장. 통합 테스트를 하는 이유 단위 테스트에만 전적으로 의존하면 시스템이 전체적으로 잘 작동하는지 확신할 수 없다 단위 테스트가 비즈니스 로직을 확인하는데 좋지만 비즈니스 로직을 외부와 단절된 상태로 확인하는 것만으로는 충분하지 않다 통합 테스트는 무엇인가? 통합 테스트의 역할 단위 테스트는 세가지 요구사항을 충족하는
7장. 가치 있는 단위 테스트를 위한 리팩터링
7장. 가치 있는 단위 테스트를 위한 리팩터링 좋은 단위 테스트 스위트의 속성 개발 주기에 통합돼 있다 코드베이스 중 가장 중요한 부분만을 대상으로 한다 최소한의 유지비로 최대의 가치를 끌어낸다 가치 있는 테스트 가치 있는 테스트 작성하기 리팩터링할 코드 식별하기 코드의 네 가지 유형 복잡도 또는 도메인 유의성 코드 복잡
6장. 단위 테스트 스타일
6장. 단위 테스트 스타일 단위테스트 스타일 출력 기반 테스트 가장 품질이 좋음 상태 기반 테스트 두번째 통신 기반 테스트 가장 품질이 낮음 단위 테스트의 세 가지 스타일 출력 기반 테스트(output based testing) 상태 기반 테스트(state based testing) 통신 기반 테스트(communicati
5장. 목과 테스트 취약성
5장. 목과 테스트 취약성 런던파는 테스트 대상 코드 조각을 서로 분리하고 불변 의존성을 제외한 모든 의존성에 테스트 대역을 써서 격리하고자 한다 고전파는 단위 테스트를 분리해서 병렬로 실행할 수 있게 하자고 한다 테스트 간에 공유하는 의존성에 대해서만 테스트 대역을 사용한다 목과 스텁 구분 테스트 대역의 종류 목(moc
4장. 좋은 단위 테스트의 4대 요소
4장. 좋은 단위 테스트의 4대 요소 좋은 단위 테스트 스위트의 특성 개발 주기에 통합돼 있다 코드베이스의 가장 중요한 부분만을 대상으로 한다 최소한의 유지비로 최대 가치를 끌어낸다 가치 있는 테스트 식별 가치 있는 테스트 작성 좋은 단위 테스트의 4대 요소 자세히 살펴보기 회귀 방지 리팩터링 내성 빠른 피드백 유지 보수
3장. 단위 테스트 구조
3장. 단위 테스트 구조 단위 테스트를 구성하는 방법 AAA(arrange act assert) 패턴 사용 3A 패턴은 테스트를 준비(arrange), 실행(act), 검증(assert) 세 단계로 나누는 것을 의미한다. AAA 패턴은 스위트 내 모든 테스트가 단순하고 균일한 구조를 갖는데 도움이 된다 일관성이 이 패턴의
2장. 단위 테스트란 무엇인가
2장. 단위 테스트란 무엇인가 고전파(classical school)는 단위 테스트와 테스트 주도 개발에 원론적으로 접근하는 방식 런던파(London school)는 단위 테스트와 테스트 주도 개발에 실용적으로 접근하는 방식 ‘단위 테스트’의 정의 단위 테스트의 속성 작은 코드 조각을 검증하고 빠르게 수행하고 격리된 방식
1장. 단위 테스트 목표
1장. 단위 테스트 목표 단위 테스트를 배우는 것은 테스트 프레임워크나 목 라이브러리등과 같은 기술적인 부분을 익히는 것에 그치지 않는다 단위 테스트를 매우 많이 작성하더라도 많은 버그와 유지비로 프로젝트 진행이 느려지게 된다 단위 테스트 현황 대부분의 프로그래머는 단위 테스트를 실천하고 중요성을 알고 있다 보통 제품코드
13장: 나쁜 코드를 식별 가능하게 만들기
13장: 나쁜 코드를 식별 가능하게 만들기 나쁜 코드를 딱 봐도 않좋아 보이게 만들어 품질의 수준을 명확히 표시하는 방법 안티 리팩터링 나쁜 코드에 대처하는 자세 코드를 원하는 수준으로 리팩터링하지 못할 때가 많다 이런 상황에서 끔찍하지만 않게 약깐의 리팩터링을 수행하기도 한다 하지만 이렇게 하는것은 실수다 나쁜 코드를
12장: 최적화 및 일반화 회피
12장: 최적화 및 일반화 회피 성능 최적화와 일반화는 프로그래머가 하는 두가지 게임으로 도움이 되기보다 큰 상처를 입히는 경우가 많다 일반화 해야 되는것은 컨텍스트뿐 단순성 추구 단순함을 추구하는것은 소프트웨어 개발의 이상 중 하나 인간의 인지능력은 제한적이기 때문에 단순함이 필수 불변속성을 활용하는 최적화 단순함을 희
11장: 코드 구조 따르기
11장: 코드 구조 따르기 소프트웨어는 현실 세계의 한 측면에 대한 모델 입니다 범위와 출처에 따른 구조 분류 구조의 분류를 4가지로 나눈다 딤간 팀내 코드에 있는 경우 사람에 있는 경우 매크로 아키텍처는 팀 간 구조에 관한 것 마이크로 아키텍처는 팀 내 구조에 관한것 조직 구성과 그 조직이 만든 시스템 구조는 닮는 경향
10장: 코드 추가에 대한 두려움 떨쳐내기
10장: 코드 추가에 대한 두려움 떨쳐내기 코드 추가가 두려운 경우는 비현실적인 목표나 코드가 비용을 추가해서이다 불확실성 받아들이기: 위험 감수 겁을 먹으면 효과적으로 일할 수 없다. 지식을 구축하는 가장 효과적인 방법은 실험이지만 거기에는 요기가 필요하다 두려움 극복을 위한 스파이크 사용 스파이크는 자신감과 함께 첫
9장: 코드 삭제의 미학
9장: 코드 삭제의 미학 시간이나 노력을 들였기 때문에 어떤 것에 가치를 부여하는 것을 메몰 비용의 오류(sunk cost fallacy)라고 합니다. 단 한 가지만 말하라면 바로 적은 것이 더 낫다 다음 시대는 코드를 지우는 시대일 것이다 우리는 아직 코드 삭제에 익숙하지 않는다 이것이 다음에 해결해야 할 큰 과제 라고
8장: 주석 자제하기
8장: 주석 자제하기 메서드 내부에 있으면서 javadoc과 같은 외부도구에서 사용하지 않는 주석을 대상으로 함 주석을 없에는것이 좋을수 있는 이유 코드가 명확하고 좋은 타입명과 변수명을 사용하는 경우 주석은 컴파일러가 확인하지 않으므로 특히 코드가 수정된 후에는 주석이 맞다고 보장할 수 없다 주석이 스멜을 가진 코드 위
7장: 컴파일러와의 협업
7장: 컴파일러와의 협업 컴파일러에 익숙해지면 컴파일러와 함께 정확성에 대한 책임을 공유함으로써 컴파일러를 팀원으로 받아들이고 컴파일러가 소프트웨어를 제대로 빌드하는데 도움이 되게 해야 된다 컴파일러에 대해 알아보기 컴파일러는 의심이 가면 물어보라 라는 일번적인 관용구를 따른다 약점: 정지 문제는 컴파일 시 알 수 있는
6장: 데이터 보호
6장: 데이터 보호 데이터와 기능에 대한 접근을 제한하는 캡슐화에 초점을 맞춰 불변속성이 지역에만 영향을 주게 만드는데 중점 getter 없이 캡슐화하기 규칙: getter와 setter를 사용하지 말 것 부울(Boolean)이 아닌 필드에 setter나 getter를 사용하지 말 것 필드를 비공개로 하는 것의 가장 큰
5장: 유사한 코드 융합하기
5장: 유사한 코드 융합하기 유사한 클래스 통합하기 리팩터링 패턴: 유사 클래스 통합 일련의 상수 메서드를 공통으로 가진 두개 이상의 클래스에서 이 일련의 상수 메서드가 클래스에 따라 다른 값을 반환 할 때마다 이 리팩터링 패턴을 사용해 통합할수 있다 단순한 조건 통합하기 단순한 조건은 통합한다 이건 어떠한 판단을 하지
4장: 타입 코드 처리하기
4장: 타입 코드 처리하기 간단한 if 문 리팩터링 규칙: if 문에서 else를 사용하지 말 것 결정은 어렵다 if문은 검사 로 간주 if else 를 사용하면 의사결정으로 간주 규칙 적용 클래스로 타입 코드 대체 한다 리팩터링 패턴: 클래스로 타입 코드 대체 클래스로 타입 코드를 바꾼다 클래스로 코드 이관하기 클래스로
pyproject.toml
pyproject.toml pyproject.tomlPEP 518 에 정의되고 PEP 621 및 PEP 660 에서 확장된 새로운 구성 파일입니다. 빌드 시스템 요구 사항을 저장하도록 설계되었지만 Python 프로젝트에 대한 모든 도구 구성을 저장할 수도 있어 필요하거나 setup.cfg다른 도구 관련 파일을 대체할 수도
3장: 긴 코드 조각내기
3장: 긴 코드 조각내기 DRY(Don't Repeat Yourself) KISS(Keep it simple, stupid) 위에 지침을 따라도 코드는 쉽게 지저분해지고 혼란스러울수 있다 메서드 추출로 가독성을 올린다 첫 번째 규칙: 왜 다섯 줄인가? 이 지침을 엄수하는것으로 엄청난 개선이다 규칙: 다섯 줄 제한 메서드는
2장: 리팩터링 깊게 들여다보기
2장: 리팩터링 깊게 들여다보기 가독성 및 유지보수성 향상 리팩터링 더 나은 코드를 만드는것 코드가 하는 일은 변경하지 않는것 코드 개선 가독성 : 의도를 전달하기 위한 코드의 성질 유지보수성 : 코드를 변경하기 쉽게 만드는 성질 함께 변하는건 함께 있어야 된다(localizing ivariants) 취약성의 근원은 전역
Stable Diffusion Samplers
Stable Diffusion Samplers Old School ODE solvers 상미분 방정식(ODE) Euler : 가장 간단한 해결 입니다. Heun : 오일러의 더 정확하지만 느린 버전입니다. LMS(Linear multi step method) : 오일러와 속도는 동일하지만 (아마도) 더 정확합니다. Anc
Classifier-Free Guidance : CFG
Classifier Free Guidance : CFG Classifier guidance(분류자 지침) Classifier guidance은 확산 모델에 이미지 와 라벨을 통합하는 방법입니다. 라벨을 사용하여 확산 과정을 안내할 수 있습니다. 예를 들어, "고양이"라는 라벨은 역확산 과정을 조종하여 고양이 사진을 생성합
1장: 리팩터링 리팩터링하기
이 책에서 소개된 규칙 다섯중 제한 호출 또는 전달 한가지만 할것 if문은 함수의 시작에만 배치 if문은 else를 사용하지 말것 switch를 사용하지 말것 인터페이스에서만 상속 받을것 순수 조건 사용 구현체가 하나뿐인 인터페이스를 만들지 말것 getter/setter를 사용하지 말것 공통 접사를 사용하지 말것 1장:
12장: 데이터 시스템의 미래
파생 데이터 12장: 데이터 시스템의 미래 데이터 통합 문제가 주어졌을때 모든 문제를 만족하는 하나의 해결책은 없지만 상황에 따라 적절한 서로 다른 접근법이 많이 있다 파생 데이터에 특화된 도구의 결합 포스트그레스큐엘 같은 디비는 간단한 애플리케이션 만들기에 충분한 전문 색인 기능이 포함되어 있지만 더 복잡한 검색 기능을
Simple Python Version Management: pyenv
Simple Python Version Management: pyenv jenv와 같은 역할을 하는 pyenv를 소개한다. 설치 사용법 업그레이드 참조
11장: 스트림 처리
파생 데이터 11장: 스트림 처리 "복잡하지만 잘 작동하는 시스템은 예외 없이 간단하지만 잘 작동하는 시스템으로부터 발전한다. 이 명제는 역도 참이다. 처음부터 복잡하게 설계된 시스템은 절대 작동할 리도 없고 작동하게 만들지도 못한다." 존갈, 체계론 일괄처리는 입력으로 파일 집합을 읽어 출력으로 새로운 파일 집합을 생성
10장: 일괄 처리
파생 데이터 1부와 2부에서는 디스크에 저장된 데이터의 레이아웃부터 결함이 있는 상황에서의 분산된 일관성의 한계까지 분산 데이터베이스로 가기위해 고려해야 할 모든 주요사항을 밑바닥부터 다뤘다 데이터를 저장하고 처리하는 시스템 레코드 시스템 : 데이터를 레코드 단위로 저장하고 읽는다 파생 데이터 시스템 : 데이터를 레코드
github 여러 계정 관리(ssh)
github 여러 계정 관리(ssh) ssh 키 생성 ssh 키 등록 등록된 ssh 키 등록 확인 키등록 ssh config 설정 설정 후 테스트 참조
09장: 일관성과 합의
분산 데이터 09장: 일관성과 합의 결함의 가장 간단한 해결방법은 서비스가 실패하도록 두고 사용자에게 오류메시지를 보내는것 내결함성을 지닌 시스템을 구축하는 가장 좋은 방법은 유용한 보장을 해주는 범용 추상화를 찾아 이를 구현하고 애플리케이션에서 이 보장에 의존하게 하는것 분산시스템에 가장 중용한 추상화 중 하나는 합의
08장: 분산 시스템의 골칫거리
분산 데이터 08장: 분산 시스템의 골칫거리 엔지니어로서의 우리의 임무는 모든 게 잘못되더라도 제 역할을 해내는 시스템을 구축하는것 결함과 부분 장애 하드웨어가 올바르게 동작하면 같은 연산은 항상 같은 결과를 낸다(결정적이다) 부분 장애(partial failure) : 분산시스템에서는 시스템의 어떤 부분은 잘 동작하지만
07장: 트랜잭션
분산 데이터 07장: 트랜잭션 트렌젝션은 데이터베이스의 여러문제를 단순화하는 메커니즘으로 채택돼 왔다 트랜젝션은 애플리케이션에서 몇개의 읽기와 쓰기를 하나의 논리적 단위로 묶는 방법이다. 데이터베이스에 접속하는 애플리케이션에서 프로그래밍 모델을 단순화하려는 목적으로 만든것이다 트랜잭션 격리 수준(isolation leve
06장: 파티셔닝
분산 데이터 06장: 파티셔닝 데이터셋이 매우 크거나 질의 처리량이 매우 높다면 복제만으로는 부족하고 데이터를 파티션으로 쪼갤 필요가 있다 이작업을 샤딩이라고도 한다 파티션을 나눌때 보통 각 데이터 단위가 하나의 파티션에 속한다 파티셔닝의 주된 이유 : 확장성 파티셔닝과 복제 보통 복제와 파티셔닝을 함께 적용해 각 파티션
우분투 NVIDIA 드라이버 설치(ubuntu-drivers 사용)
우분투 NVIDIA 드라이버 설치(ubuntu drivers 사용) ubuntu drivers를 사용하여 NVIDIA 드라이버를 설치하는 방법을 알아보자. 드라이버 버전 확인 드라이버 확인 데스크탑 서버 일반 용도(예: 데스크탑 및 게임)용 드라이버 설치 가장 적합한 드라이버를 설치한다 특정 버전설치 설치 GPGPU 용도
update-alternatives (기본값 심볼릭 링크 관리)
update alternatives (기본값 심볼릭 링크 관리) 우분투를 사용할때 여러버전의 자바와 파이썬을 사용해야 할때가 있다. 이럴때 update alternatives를 사용하면 편리하다. 조회 방법 등록 방법 등록 방법은 아래와 같다. 설정 방법 설정 방법은 아래와 같다. 삭제 방법 삭제 방법은 아래와 같다. 참
05장: 복제
분산 데이터 기술이 성공하기 위해서 홍보보다 현실이 우선돼야 한다. 자연을 속일 수는 없기 때문이다 Richard Feynman 여러 장비 간 분산된 데이터베이스를 필요로 하는 이유 확장성 내결함성/고가용성 지연시간 고부하로 확장 수직확장, 용량확장, 공유메모리 아키텍처 비공유 아키텍처 수평확장 복제 대 파티셔닝 여러 노
04장: 부호화와 발전
데이터 시스템의 기초 04장: 부호화와 발전 만물은 변한다 그대로 있는 것은 아무것도 없다 헤라클레이토스 시스템이 계속 원활하게 실행되게 하려면 양방향 호환성을 유지해야 된다 하위호환성 (backwards compatibility) 새로운 코드는 예전 코드가 기록한 데이터를 읽을수 있어야 된다 상위호환성 (forward
03장: 저장소와 검색
데이터 시스템의 기초 03장: 저장소와 검색 데이터베이스의 두가지 작업 데이터를 저장하고 데이터를 조회하는 것 로그 구조 계열 저장소 엔진, 페이지 지향 계열 저장소 엔진 데이터베이스를 강력하게 만드는 데이터 구조 데이터베이스에서 특정 키의 값을 효율적으로 찾기 위해서 필요한 데이터 구조는 색인 이다 색인의 일반적인 개념
02장: 데이터 모델과 질의 언어
데이터 시스템의 기초 02장: 데이터 모델과 질의 언어 대부분의 애플리케이션은 하나의 데이터 모델 위에 다른 데이터 모델을 계층을 둬서 만듬 관계형 모델과 문서 모델 가장 잘알려진 데이터 모델은 1970년 에드가 코드가 제안한 관계형 모델을 기반으로 한 SQL 데이터는 관계로(테이블) 구성되고 각 관계는 튜플(로우) 모음
01장: 신뢰할 수 있고 확장 가능하며 유지보수하기 쉬운 애플리케이션
데이터 시스템의 기초 01장: 신뢰할 수 있고 확장 가능하며 유지보수하기 쉬운 애플리케이션 오늘날 소프트웨어는 계산 중심 과는 다르게 데이터 중심적이다 데이터 베이스 캐시 검색 색인 스트림 처리 일괄 처리 소프트웨어 시스템의 관심사 신뢰성 확장성 유지보수성 신뢰성 애플리케이션은 사용자가 기대한 기능을 수행한다 시스템은 사
Stable Diffusion 이해를 위한 자료 모음
Stable Diffusion 이해를 위한 자료 모음 Diffusion Model https://arxiv.org/abs/1503.03585 2015년 발표 Diffusion(확산)은 액체나 기체에 다른 물질이 섞이고, 그것이 조금씩 번져가다가 마지막에는 일률적인 농도로 바뀌는 현상이다. 위키피디아 물리의 확산 현상에 영
Diffusion Models 이란
Diffusion Models 이란? 이글을 번역한 내용 입니다 지금까지 세 가지 유형의 생성 모델, 즉 GAN, VAE 및 흐름 기반(FLOW based) 모델에 대해 작성했습니다. 이 모델들은 고품질 샘플을 생성하는 데 큰 성공을 거두었지만 각각 몇 가지 한계가 있습니다. GAN 모델은 적대적 훈련 특성으로 인해 잠재
FirebaseError Installations: Could not process request. Application offline.
FirebaseError Installations: Could not process request. Application offline. 갑자기 특정 페이지에서 에러가나면서 랜더링이 되지 않은 이슈가 있었다 콘솔 로그를 보니 아래에 에러메시지가 나오고 있었다 플러그인 문제인줄 알고 모든 플러그인 삭제 및 캐쉬 삭제 후에도
stable-diffusion-webui docker 설치
stable diffusion webui docker 설치 먼저 docker를 설치해야 한다. docker 설치 도커의 자동 설치 스크립트 사용 우분투 직접 설치 도커 권한 부여 docker compose 설치 여기에서 최신버전을 확인후에 설치한다. 권한추가 NVIDIA Container Toolkit 설치 그리고 엔비디
Please make sure you have the correct access rights and the repository exists
Please make sure you have the correct access rights and the repository exists 에러 위에 명령어를 실행했을때 아래의 메시지가 나오면 아래의 명령어로 등록을 하면 좋다 참조
PEP 405 – Python Virtual Environments
Python Virtual Environments Abstract 이 PEP는 자체 사이트 디렉토리가 있는 경량 "가상 환경"을 위한 메커니즘을 Python에 추가하고 선택적으로 시스템 사이트 디렉토리에서 격리할 것을 제안합니다. 각 가상 환경에는 고유한 Python 바이너리(다양한 Python 버전으로 환경 생성 가능)
stable-diffusion-webui 우분투에 설치
stable diffusion webui 우분투에 설치 시작 방법 외부에서 접속가능하게 설정 팁 아래 처럼 모델 다운로드시에는 꼭 lfs로 해야 된다 플러그인 설치는 외부로 오픈된 상태에서는 설정이 되지 않는다 오류 아래 오류에서 저는 모델 이 잘못됨 참조
getting started with conda
getting started with conda Conda는 Windows용 Anaconda Prompt나 macOS 또는 Linux용 터미널 창에서 명령줄 명령과 함께 사용하는 강력한 패키지 관리자이자 환경 관리자입니다. Conda 시작을 위한 이 20분 가이드를 통해 Conda의 주요 기능을 시험해 볼 수 있습니다.
우분투에 CUDA 12.3 설치
우분투에 CUDA 12.3 설치 GPU가 있는지 확인 기존의 설치된것 삭제 system update install other import packages PPA repository driver 추가 install nvidia driver with dependencies system update installing CUDA
mybatis 멀티 모듈 셋팅시 Invalid bound statement (not found) 오류
mybatis 멀티 모듈 셋팅시 Invalid bound statement (not found) 오류 gradle 멀티 모듈을 셋팅하고 slice test로 mybatis 모듈이 정상적으로 기동이 되는데 여러 모듈에 mybatis xml이 나눠줘있고 root 프로젝트에서 모듈을 추가 받아서 처리 하면 아래 와 같이 해당
오픈렌즈(OpenLens) 자동 업데이트 막기
오픈렌즈(OpenLens) 자동 업데이트 막기 오픈렌즈는 렌즈를 빌드해주는 프로젝트인데 오픈소스다 보니 업데이트가 되는데 에러가 생기는 버전이 존재한다 그럴때 유용한 방법으로 업데이트를 막는 방법이다 업데이트 막기 업데이트 풀기 참조
실용주의 프로그래머 20주년 기념판 3장
실용주의 프로그래머 3장. 기본도구 16. 일반 텍스트의 힘 일반 텍스트로는 데이터 그자체로 의미가 드러나는 데이터를 만들수 있다. 지식을 일반 텍스트로 저장하라 일반텍스트의 장점 지원 중단에 대한 보험 기존 도구의 활용 더 쉬운 테스트 17. 셀 가지고 놀기 명령어 셀의 힘들 사용하라 18. 파워 에디팅 에디터를 유창하
JEP 425: Virtual Threads (Preview)
JEP 425: Virtual Threads (Preview) Summary Java 플랫폼에 가상 스레드를 도입합니다. 가상 스레드는 처리량이 많은 동시 응용 프로그램을 작성, 유지 관리 및 관찰하는 노력을 크게 줄이는 경량 스레드입니다. 이것은 미리보기 API 입니다. Goals 간단한 요청당 스레드 스타일로 작성된
실용주의 프로그래머 20주년 기념판 1장 ~ 2장
실용주의 프로그래머 1장. 실용주의 철학 항목 1. 당신의 인생이다 주도적으로 행동해서 기회를 잡아라 항목 2. 고양이가 내 소스 코드를 삼켰어요 팀 내 신뢰를 얻어야 된다 책임지기 어설픈 변명 보다는 대안을 제시 항목 3. 소프트웨어 엔트로피 깨진 창문을 내버려 두지 말자 우선 망가 뜨리지 말자 항목 4. 돌멩이 수프와
아이템 52: mutable 컬렉션 사용을 고려하라
이펙티브 코틀린(효율성) 아이템 52: mutable 컬렉션 사용을 고려하라 immutable 컬렉션 보다 mutable 컬렉션이 좋은 점은 성능적인 측면에서 더 빠르다 컬렉션 복제는 처리 비용이 많이 든다 참조
아이템 51: 성능이 중요한 부분에는 기본 자료형 배열을 사용하라
이펙티브 코틀린(효율성) 아이템 51: 성능이 중요한 부분에는 기본 자료형 배열을 사용하라 기본 자료형의 특징 가볍다 일반적인 객체와 다르게 추가적으로 포함되는것이 없기 때문 빠르다 값에 접근할 때 추가비용이 들지 않는다 일반적으로 array보다 list나 set을 사용하는 것이 좋다 하지만 기본 자료형 컬렉션을 굉장히
아이템 50: 컬렉션 처리 단계 수를 제한하라
이펙티브 코틀린(효율성) 아이템 50: 컬렉션 처리 단계 수를 제한하라 전체 컬렉션에 대한 반복과 중간 컬렉션 생성이라는 비용이 발생함 이 비용은 적절한 컬렉션 처리 함수들을 활용해서 줄일 수 있다. 참조
아이템 49: 하나 이상의 처리 단계를 가진 경우에는 시퀀스를 사용하라
이펙티브 코틀린(효율성) 아이템 49: 하나 이상의 처리 단계를 가진 경우에는 시퀀스를 사용하라 Iterable 과 Sequence 는 완전히 다른 목적으로 설계되어서 완전히 다른 형태로 동작한다 Sequence 는 지연 처리 된다 시퀀스 지연처리의 장점 자연스러운 처리 순서를 유지함 최소한만 연산함 무한 시컨스 형태로
아이템 48: 더 이상 사용하지 않는 객체의 레퍼런스를 제거하라
이펙티브 코틀린(효율성) 아이템 48: 더 이상 사용하지 않는 객체의 레퍼런스를 제거하라 상태를 유지할 때는 메모리 관리를 염두에 두어야 한다는 것 코드를 작성할때는 메모리와 성능 뿐 아니라 가독성과 확장성을 항상 고려해야 한다 일반적으로는 가독성과 확장성이 더욱 중요하지만 라이브러리를 구현할 때는 메모리와 성능이 중요하
아이템 47: 인라인 클래스의 사용을 고려하라
이펙티브 코틀린(효율성) 아이템 47: 인라인 클래스의 사용을 고려하라 inline 으로 만들수 있는것은 함수뿐만 아니다 하나의 값을 보유하는 객체도 inline 으로 만들수 있다 inline 클래스는 아래 상황에 많이 쓰인다 측정 단위를 표현할때 타입 오용으로 발생하는 문제를 막을때 인터페이스를 구현하는 인라인 클래스는
아이템 46: 함수 타입 파라미터를 갖는 함수에 inline 한정자를 붙여라
이펙티브 코틀린(효율성) 아이템 46: 함수 타입 파라미터를 갖는 함수에 inline 한정자를 붙여라 inline 한정자의 역활은 컴파일 시점에 함수를 호출하는 부분을 함수의 본문으로 대체하는것 inline 한정자의 장점 타입 아규먼트에 reified 한정자를 붙여서 사용할수 있다 reified 한정자를 지정하면 타입 파
아이템 45: 불필요한 객체 생성을 피하라
이펙티브 코틀린(효율성) 오늘날에는 코드 효율성을 관대 하게 바라본다 개발자가 비싸지고 메모리는 싸졌기 때문이다 장기적으로 효율성은 중요하다 아이템 45: 불필요한 객체 생성을 피하라 객체 생성에는 언제나 비용이 든다 객체를 wrap 하면 크게 3가지 비용이든다 객체는 더 많은 용량을 차지한다 요소가 캡슐화 되어 있다면
아이템 44: 멤버 확장 함수의 사용을 피하라
이펙티브 코틀린(클래스설계) 아이템 44: 멤버 확장 함수의 사용을 피하라 확장함수는 첫 번째 아규먼트로 리시버를 받는 단순한 일반 함수로 컴파일된다 맴버 확장을 피해야 하는 이유 레퍼런스를 지원하지 않는다 암묵적으로 접근할때 두 리시버중에 어떤 리시버를 선택할지 혼동된다 확장 함수가 외부에 있는 다른 클래스를 리시버로
아이템 43: API의 필수적이지 않는 부분을 확장 함수로 추출하라
이펙티브 코틀린(클래스설계) 아이템 43: API의 필수적이지 않는 부분을 확장 함수로 추출하라 클래스 메서드를 정의할때 멤버로 정의할 것인지 확장 함수로 정의할 것인지 결정해야 된다 맴버와 확장 방식의 차이점 따로 가져와서 사용해야 된다 일반적으로 확장은 다른 패키지에 위치한다 확장은 우리가 직접 멤버를 추가할 수 없는
EKS에서 HTTP를 HTTPS로 Redirect
EKS에서 HTTP를 HTTPS로 Redirect alb.ingress.kubernetes.io/listen ports 설정에 [{"HTTP": 80}, {"HTTPS": 443}] 2개 포트를 열어야 됨 alb.ingress.kubernetes.io/certificate arn 설정이 되어 있어야 됨 alb.ingres
CHAPTER 11 단위 테스트의 실제
좋은코드 나쁜코드: 프로그래머의 코드 품질 개선법(PART III 단위 테스트) CHAPTER 11 단위 테스트의 실제 좋은 단위 테스트의 특징 코드의 문제를 정확하게 감지한다 구현 세부 정보에 구애받지 않는다 실패는 잘 설명된다 테스트 코드가 이해하기 쉽다 테스트를 쉽고 빠르게 실행할 수 있다 11.1 기능뿐만 아니라
CHAPTER 10 단위 테스트의 원칙
좋은코드 나쁜코드: 프로그래머의 코드 품질 개선법(PART III 단위 테스트) CHAPTER 10 단위 테스트의 원칙 10.1 단위 테스트 기초 테스트 중인 코드 테스트 코드 테스트 케이스 준비 실행 단언 테스트 러너 10.2 좋은 단위 테스트는 어떻게 작성할 수 있는가? 좋은 단위 테스트가 가져야 할 주요 기능 훼손의
CHAPTER 9 코드를 재사용하고 일반화할 수 있도록 하라
좋은코드 나쁜코드: 프로그래머의 코드 품질 개선법(PART II 실전) CHAPTER 9 코드를 재사용하고 일반화할 수 있도록 하라 9.1 가정을 주의하라 가정은 코드 재사용 시 버그를 초래할 수 있다 해결책 불필요한 가정을 피하라 가정이 필요하면 강제적으로 하라 가정이 깨지지 않게 만들라 오류 전달 기술을 사용하라 문제
CHAPTER 8 코드를 모듈화하라
좋은코드 나쁜코드: 프로그래머의 코드 품질 개선법(PART II 실전) CHAPTER 8 코드를 모듈화하라 모듈화의 목적 코드가 어떻게 변경되거나 재구성 될지 모르는 상태에서 변경가 재구성이 용이한 코드를 작성 8.1 의존성 주입의 사용을 고려하라 일반적으로 클래스는 다른 클래스에 의존한다 하드 코드화된 의존성은 문제가
CHAPTER 7 코드를 오용하기 어렵게 만들라
좋은코드 나쁜코드: 프로그래머의 코드 품질 개선법(PART II 실전) CHAPTER 7 코드를 오용하기 어렵게 만들라 코드를 잘못 사용할수 있는 몇가지 일반적인 경우 호출하는 쪽에서 잘못된 입력을 제공 다른 코드의 부수효과 정확한 시간이나 순서에 따라 함수를 호출하지 않음 관련 코드에서 가정과 맞지 않게 수정이 이루어짐
CHAPTER 6 예측 가능한 코드를 작성하라
좋은코드 나쁜코드: 프로그래머의 코드 품질 개선법(PART II 실전) CHAPTER 6 예측 가능한 코드를 작성하라 6.1 매직값을 반환하지 말아야 한다 매직값 magic value는 함수의 정상적인 반환 유형에 적합하지만 특별한 의미를 가지고 있다 매직값의 일반적인 예는 값이 ㅇ벗거나 오류가 발생 했음을 나타내기 위해
argocd 사용자 추가
argocd 사용자 추가 먼저 admin 패스워드 확인 방법은 아래의 방법을 사용하면 조회가 된다. argocd CLI 인스톨 방법 CLI로 접속 argocd cm configmap 다운로드 위 처럼 사용자 추가 사용자 확인 패스워드 업데이트 참조
CHAPTER 5 가독성 높은 코드를 작성하라
좋은코드 나쁜코드: 프로그래머의 코드 품질 개선법(PART II 실전) CHAPTER 5 가독성 높은 코드를 작성하라 가독성은 주관적인것 서술형 명칭 사용 서술적이지 않은 이름은 코드를 읽기 어렵게 만든다 주석문으로 서술적인 이름을 대체할수 없다 주석도 유지보수 해야된다 주석문의 적절한 사용 주석문의 목적 코드가 무엇을
15장 구글 드라이브 설계
가상면접으로 배우는 대규모 시스템 설계 기초 15장 구글 드라이브 설계 블록 저장소 서버 큰 파일 업데이트시 해결방법 델타 동기화 : 수정이 일어난 블록만 동기화 압축 : 블록단위로 압축하면 크기를 많이 줄일수 있다 높은 일관성 요구사항 ACID 를 지원하는 데이터베이스 선택 알림 서비스 롱폴링 : 드랍박스 웹소켓 저장소
14장 유튜브 설계
가상면접으로 배우는 대규모 시스템 설계 기초 14장 유튜브 설계 비디오 트렌스 코딩 비디오 트랜스 코딩의 중요성 가공되지 않은 원본 비디오는 저장 공간을 많이 차지한다 상당수의 단말과 브라우저는 특정 종류의 비디오 포멧만 지원한다 사용자에게 끊김 없는 고화질 비디오 재생을 보장하려면 네트워크 대역폭에 따라 다른 화질을 보
13장 검색어 자동완성 시스템
가상면접으로 배우는 대규모 시스템 설계 기초 13장 검색어 자동완성 시스템 트라이 자료구조 트리형태의 자료구조 트리의 루트노드는 빈문자열을 나타낸다 각 노드는 글자 하나를 저장하며 26개의 자식 노드를 가질수 있다 각 트리노드는 하나의 단어 또는 접두어 문자열을 나타낸다 성능 향샹 접두어 길이 제한 노드의 인기 검색어 캐
12장 채팅 시스템 설계
가상면접으로 배우는 대규모 시스템 설계 기초 12장 채팅 시스템 설계 메시지 수신 시나리오 폴링 : 주기적으로 서버에 물어 보는 방법 단점 서버에 응답이 없어도 물어봐야 되어서 자원이 낭비됨 롱폴링 : 새메시지를 반환 하거나 타임아웃이 될때 까지 대기 단점 메시지를 보내는 클라이언트와 수신하는 클라이언트가 같은 채팅 서버
11장 뉴스 피드 시스템 설계
가상면접으로 배우는 대규모 시스템 설계 기초 11장 뉴스 피드 시스템 설계 피드 발행 : 피드를 생성하면 데이터 베이스에 저장하고 새 포스팅은 친구들의 뉴스피드에도 전송 된다 뉴스 피드 생성 : 모든 친구의 포스팅을 시간 흐름 역순으로 모아서 만든다 팬아웃 : 어떤 사용자의 새 포스팅을 그 사용자와 친구관계에 있는 모든
10장 알림 시스템 설계
가상면접으로 배우는 대규모 시스템 설계 기초 10장 알림 시스템 설계 알림 시스템 모바일 푸시 알림 SMS 메시지 이메일 알림 유형별 지원 방안 IOS 푸시 알림 알림 제공자 : 애플 푸시 알림 서비스(APNS) 단말 토큰 페이로드 APNS : 애플이 제공하는 원격 서비스 IOS 단말 안드로이드 푸시 알림 FCM : fi
9장 웹 크롤러 설계
가상면접으로 배우는 대규모 시스템 설계 기초 9장 웹 크롤러 설계 웹 크롤러는 로봇 또는 스파이더라고도 부른다 검색엔진에 널리 쓰이는 기술로 웹에 새로 올라오거나 갱신된 컨텐츠를 찾는것이 주된 일이다. 크롤러의 용도 검색 엔진 인덱싱 웹 아카이빙 웹 마이닝 웹 모니터링 크롤러의 속성 규모 확장성 안정성 예절 확장성 시작
CHAPTER 4 오류
좋은코드 나쁜코드: 프로그래머의 코드 품질 개선법(PART I 이론) CHAPTER 4 오류 코드가 실행되는 환경은 불완전 하다. 사용자가 잘못된 입력을 제공하고, 외부 시스템이 다운되며, 자신이 작성한 코드와 다른 개발자가 작성한 코드가 종종 버그를 가질수 있다. 오류에 대해서 특히 어떻게 알리고 대처해야 하는지 논의해
CHAPTER 3 다른 개발자와 코드 계약
좋은코드 나쁜코드: 프로그래머의 코드 품질 개선법(PART I 이론) CHAPTER 3 다른 개발자와 코드 계약 예측 가능한 코드를 작성하라, 코드를 오용하기 어렵게 만들라 두가지 원칙은 다른 사람이 작성한 코드와 상호작용할 때 일어날수 있는 일과 관련 있다 자신의 코드와 다른 개발자의 코드 1인 개발자 회사에서 일하지
8장 URL 단축기 설계
가상면접으로 배우는 대규모 시스템 설계 기초 8장 URL 단축기 설계 API 엔드포인트 URL 단축용 엔드포인트 URL 리다이렉션 엔드포인트 URL 리다이렉션 301 Moved Permanently : Location 헤더가 가르키는 주소로 영구 이동됨 302 Found : Location 헤더가 가르키는 주소로 일시적으
7장 분산 시스템을 위한 유일 ID 생성기 설계
가상면접으로 배우는 대규모 시스템 설계 기초 7장 분산 시스템을 위한 유일 ID 생성기 설계 분산 시스템에서 유일성이 보장되는 id를 만드는 방법 다중 마스터 복제(multi master replication) 데이터 베이스의 auto increment 기능을 활용함, 서버 마다 증가하는 값을 다르게 셋팅함 단점 여러 데
6장 키-값 저장소 설계
가상면접으로 배우는 대규모 시스템 설계 기초 6장 키 값 저장소 설계 키 값 저장소는 키 값 데이터베이스라고도 불리는 비관계형 데이터베이스다 키는 유일해야 되며 성능상의 이슈로 키는 짧을수록 좋다 값은 보통 무엇이 오던 상관하지 않는다 분산 키 값 저장소는 분산 해시 테이블이라고도 불린다. CAP 정리 데이터 일관성(co
5장 안정 해시 설계
가상면접으로 배우는 대규모 시스템 설계 기초 5장 안정 해시 설계 수평적 규모 확장성을 달성하기 위해서 요청 또는 데이터를 서버에 균등하게 나누는게 중요하다 해시키 재배치 문제 n개의 캐시서버의 부하를 균등하게 나누는 보편적인 방법은 serverindex = hash(key) % n(서버 갯수) 위에 방법은 서버 풀이 고
CHAPTER 2 추상화 계층
좋은코드 나쁜코드: 프로그래머의 코드 품질 개선법(PART I 이론) CHAPTER 2 추상화 계층 문제와 하위 문제를 어떻게 해결하는가도 중요하지만 그것들을 해결하는 코드를 어떻게 구성하는가도 중요하다 코드를 잘 구성한다는 것은 간결한 추상화 계층을 만드는 것으로 귀결될 때가 많다 널값 및 의사코드 규약 많은 프로그래밍
CHAPTER 1 코드 품질
좋은코드 나쁜코드: 프로그래머의 코드 품질 개선법(PART I 이론) CHAPTER 1 코드 품질 고품질 코드는 좀 더 신뢰할 수 있다 유지보수가 쉽다 버그가 적은 소프트웨어를 생산 좋은 코드는 좋은 소프트웨어를 만들기 위한 유일한 조건은 아니지만 중요한 조건중에 하나다 코드는 어떻게 소프트웨어가 되는가 코드베이스 : 소
4장 처리율 제한 장치 설계
가상면접으로 배우는 대규모 시스템 설계 기초 4장 처리율 제한 장치 설계 토큰 버킷 알고리즘 인자 버킷 크기 토큰 공급율 장점 구현이 쉽다 메모리 사용 측면에서도 효율적이다. 짧은 시간에 집중되는 트래픽도 처리가능하다 단점 버킷 크기와 토큰 공급률이라는 두개의 인자를 가지고 있는데 이값을 적절하게 튜닝하는게 어렵다. 누출
3장 시스템 설계 면접 공략법
가상면접으로 배우는 대규모 시스템 설계 기초 3장 시스템 설계 면접 공략법 효과적 면접을 위한 4단계 접근법 문제 이해 및 설계 범위 확정 깊이 생각하고 질문하여 요구사항과 가정들을 분명히 하라 구체적으로 어떤 기능들을 만들어야 하나? 제품 사용자 수는 얼마나 되나? 회사의 규모는 얼마나 빨리 커지리라 예상되나? 회사가
2장 개략적인 규모 추정
가상면접으로 배우는 대규모 시스템 설계 기초 2장 개략적인 규모 추정 2의 제곱수 : 데이터 볼륨의 단위 1바이트, 1킬로바이트, 1메가바이트... 응답 지연값 : 구글의 제프 딘이 응답지연값을 공개한것이 있다. 메모리는 빠르지만 디스크는 아직도 느리다 디스크 탐색(seek)는 가능한 피하라 단순한 압축 알고리즘은 빠르다
1장 사용자 수에 따른 규모 확장성
가상면접으로 배우는 대규모 시스템 설계 기초 1장 사용자 수에 따른 규모 확장성 단일 서버 데이터베이스 분리 수평적 확장 vs 수직적 확장 수직적 확장 : 스케일업 단점 : 한계가 존재함, 장애 복구에 대한 방안이나 다중화 방안을 제시하지 않는다. 수평적 확장 : 스케일 아웃 로드벨런서 : L2(Data link 계층을
mysql (mariaDB) 성능 튜닝 (performance tuning)
mysql (mariaDB) 성능 튜닝 (performance tuning) DB server 성능 튜닝 max connections : 데이터베이스 서버에 대한 최대 동시 연결 수를 제어합니다. 이 값을 너무 낮게 설정하면 연결 오류가 발생할 수 있고 너무 높게 설정하면 너무 많은 메모리를 사용하여 전체 성능이 저하될
이펙티브 코틀린 아이템 42: compareTo의 규약을 지켜라
이펙티브 코틀린(클래스설계) 아이템 42: compareTo의 규약을 지켜라 compareTo는 Any에 있는 메소드가 아니라 부등식으로 변환되는 연산자이다. 비대칭적 동작: a≥b 이고 b≥a 라면 a==b이다. 연속적 동작: a≥b 이고 b≥c라면 a≥c이다. 코넥스적 동작(connex relation): a≥b 또는
이펙티브 코틀린 아이템 41: hashCode의 규약을 지켜라
이펙티브 코틀린(클래스설계) 아이템 41: hashCode의 규약을 지켜라 해시 테이블 Map, Set : 컬렉션에 요소를 빠르게 추가하고 컬렉션에서 요소를 빠르게 추출해야한다고 할때 사용할 수 있는 자료구조 Map, Set은 중복 비허용 성능을 좋게 만드는 해결 방법 해시 테이블 해시 테이블은 각 요소에 숫자를 할당하는
이펙티브 코틀린 아이템 40: equals 의 규약을 지켜라
이펙티브 코틀린(클래스설계) 아이템 40: equals 의 규약을 지켜라 동등성 코틀린에는 두 가지 종류의 동등성(equality)이 있다. 구조적 동등성(structural equality) : equals 메서드와 이를 기반으로 만들어진 == 연산자(!= 포함)로 확인하는 동등성이다. 레퍼런스적 동등성(referent
이펙티브 코틀린 아이템 39: 태그 클래스보다는 클래스 계층을 사용하라
이펙티브 코틀린(클래스설계) 아이템 39: 태그 클래스보다는 클래스 계층을 사용하라 상수(constant) 모드를 가진 클래스를 많이 볼수 있다. 이러한 상수 모드를 태그(tag)라고 부르며 태크를 포함한 클래스를 태그 클래스라고 부른다. 태그 클래스는 서로다른 책임을 한 클래스에 태그로 넣는 문제를 가진다. 태그 클래스
이펙티브 코틀린 아이템 38: 연산 또는 액션을 전달할 때는 인터페이스 대신 함수 타입을 사용하라
이펙티브 코틀린(클래스설계) 아이템 38: 연산 또는 액션을 전달할 때는 인터페이스 대신 함수 타입을 사용하라 대부분의 프로그래밍 언어에서는 함수 타입이 없다. 그래서 액션을 전달할때 메서드가 하나만 있는 인터페이스를 전달한다 이러한 인터페이스를 SAM(Single Abstract Method)이라 부른다. 파라미터 전달
이펙티브 코틀린 아이템 37: 데이터 집합표현에 data 한정자를 사용하라
이펙티브 코틀린(클래스설계) 아이템 37: 데이터 집합표현에 data 한정자를 사용하라 떄로는 데이터를 한번에 전달해야 되는데 이럴때는 data 한정자를 사용해서 class를 만들면 좋다 toString equals와 hashcode copy : immutable 클래스를 만들때 유용하다. compoentN : 위치 기반
이펙티브 코틀린 아이템 36: 상속보다는 컴포지션을 사용하라
이펙티브 코틀린(클래스설계) 아이템 36: 상속보다는 컴포지션을 사용하라 단순하게 코드 추출 또는 재사용을 위해 상속을 하려고 한다면, 조금 더 신중하게 생각해야 한다. 간단한 행위 재사용 상속의 단점 상속은 하나의 클래스만을 대상으로 할 수 있다. 상속을 사용해서 행위를 추출하다 보면 거대한 Base 클래스를 만들게 되
쿠버네티스용 유용한 툴
쿠버네티스용 유용한 툴 : 로컬에서 쿠버네티스 테스트용 : 쿠버네티스 네임스페이스/컨텍스트 변경 : 쿠버네티스 커멘드라인 gui tool : 쿠버네티스 IDE : 원격 개발 환경을 설정할 수 있는 오픈 소스 도구 : 명령 줄 플러그인 : 쿠버네티스 yml 검증 : 쿠버네티스 로그 툴 as tail 참조
쿠버네티스 워크로드 크론잡 테스트
쿠버네티스 워크로드 크론잡 테스트 로컬에서 테스트 하기 위해 를 인스톨 한다. jobTemplate 아래는 job 과 완전 똑같은 스팩이다. 바로 직전에 테스트 해본 잡을 가지고 테스트 해보면 된다. 참조
argo workflows 설치
argo workflows 설치 로컬에서 테스트 하기 위해 를 인스톨 한다. 최신 릴리즈 버전을 인스톨 한다 아래처럼 포트 포워딩후에 https://localhost:2746/ 접속한다. 참조
이펙티브 코틀린 아이템 33: 생성자 대신 팩토리 함수를 사용하라
이펙티브 코틀린(객체생성) 아이템 33: 생성자 대신 팩토리 함수를 사용하라 생성자 역활을 대신해주는 함수를 팩토리 함수 팩토리 함수의 장점 함수의 이름을 붙일수 있다 함수가 원하는 타입을 리턴할 수 있다 호출될때 마다 새객체를 만들 필요가 없다 아직 존재하지 않는 객체를 리턴할 수 있다 객체 외부에 팩토리 함수를 만들면
이펙티브 코틀린 아이템 34: 기본 생성자에 이름 있는 옵션 아규먼트를 사용하라
이펙티브 코틀린(객체생성) 아이템 34: 기본 생성자에 이름 있는 옵션 아규먼트를 사용하라 기본 생성자 : 객체를 정의하고 생성하는 방법을 지정할때 사용하는 가장 기본적인 방법 점층적 생성자 패턴(telescoping constructor pattern) 코틀린은 디폴트 아규먼트(default argument)를 사용할
이펙티브 코틀린 아이템 35: 복잡한 객체를 생성하기 위한 DSL을 정의하라
이펙티브 코틀린(객체생성) 아이템 35: 복잡한 객체를 생성하기 위한 DSL을 정의하라 함수 타입의 몇가지 예 () Unit : 아규먼트를 갖지 않고, Unit을 리턴하는 함수 (Int) Unit : Int를 아규먼트로 받고, Unit을 리턴하는 함수 (Int) Int : Int를 아규먼트로 받고, Int를 리턴하는 함수
이펙티브 코틀린 아이템 32: 추상화 규약을 지켜라
이펙티브 코틀린(추상화 설계) 아이템 32: 추상화 규약을 지켜라 규약은 개발자들의 단순한 합의 무언가를 할 수 있다는 것이 그것을 해도 괜찮다는 의미는 아니다. 상속된 규약 클래스를 상속하거나 다른 라이브러리의 인터페이스를 구현할 때는 규약을 반드시 지켜야 된다. 프로그램을 안정적으로 유지하고 싶으면 규약을 지켜야 된다
이펙티브 코틀린 아이템 31: 문서로 규약을 정의하라
이펙티브 코틀린(추상화 설계) 아이템 31: 문서로 규약을 정의하라 함수가 무슨일을 하는지 명확하게 설명하고 싶다면 KDoc 주석을 붙혀주는것이 좋다. 일반적인 문제는 행위가 문서화 되지 않고 요소의 이름이 명확하지 않다면 이를 사용하는 사용자는 현재 구현에만 의존하게 된다. 이러한 문제는 예상되는 행위를 문서화만 잘해도
이펙티브 코틀린 아이템 30: 요소의 가시성을 최소화하라
이펙티브 코틀린(추상화 설계) 아이템 30: 요소의 가시성을 최소화하라 API를 설계할때 간결한 API를 선호하는 이유 작은 인터페이스는 배우기 쉽고 유지하기 쉽다. 기능이 많은 클래스보다 작은 클래스이 이해하기 쉽다. 유지보수가 편하다. 변경을 가할떄는 기존것을 숨기는것 보다 새로운것을 만드는것이 편하다 그래서 가시성을
이펙티브 코틀린 아이템 29: 외부 API를 랩(wrap)해서 사용하라
이펙티브 코틀린(추상화 설계) 아이템 29: 외부 API를 랩(wrap)해서 사용하라 랩(wrap) 해서 API를 사용할떄 장점 문제가 있다면 래버(wrapper)만 변경하면 되서 변화에 쉽게 대응 할수 있다. 프로젝트 스타일에 맞춰서 API의 형태를 조절할수 있다. 특정 라이브러리에서 문제가 발생하면 래퍼를 수정해서 다
이펙티브 코틀린 아이템 28: API 안정성을 확인하라
이펙티브 코틀린(추상화 설계) 아이템 28: API 안정성을 확인하라 시멘틱 버저닝 MAJOR 버전: 호환되지 않는 수준의 API 변경 MINOR 버전: 이전 변경과 호환되는 기능을 추가 PATCH 버전: 간단한 버그 수정 어노테이션 @Experimental: 안정적이지 않음 @Deprecated: 더 이상 사용되지 않음
이펙티브 코틀린 아이템 27: 변화로부터 코드를 보호하려면 추상화를 사용하라
이펙티브 코틀린(추상화 설계) 아이템 27: 변화로부터 코드를 보호하려면 추상화를 사용하라 상수 이름을 붙일 수 있다. 나중에 값을 쉽게 변경 가능하다. 함수 일반적인 알고리즘을 함수로 추출 하면 코드를 항상 기억해 두지 않아도 된다 함수의 단점 함수는 상태를 유지 하지 않는다. 함수 시그니처를 변경하면 프로그램 전체에
이펙티브 코틀린 아이템 26: 함수 내부의 추상화 레벨을 통일하라
이펙티브 코틀린(추상화 설계) 추상화란 : 복잡한 자료, 모듈, 시스템 등으로 부터 핵심적인 개념 또는 기능을 간추려 내는것을 말한다. 추상화를 설계한다는 것은 단순하게 모듈 또는 라이브러리로 분리한다는 의미가 아니라 함수를 정의할 때는 그 구현을 함수 시그니처 뒤에 숨기게 되는데 이것이 바로 추상화다. 추상화의 목적 복
이펙티브 코틀린 아이템 25: 공통 모듈을 추출해서 여러 플랫폼에서 재사용하라
이펙티브 코틀린(재사용성) 아이템 25: 공통 모듈을 추출해서 여러 플랫폼에서 재사용하라 코틀린은 멀티플랫폼을 지원해서 코드를 서로 다른 플랫폼에서 공유가 가능하다 공통 모듈을 추출해서 재사용하면 좋다. 참조
이펙티브 코틀린 아이템 24: 제네렉 타입과 variance 한정자를 활용하라
이펙티브 코틀린(재사용성) 아이템 24: 제네렉 타입과 variance 한정자를 활용하라 위에 코드에서 파라미터 T는 variance 한정자(out 또는 in)이 없으므로 기본적으로 invariant(불공변성) 입니다. 제네릭 타입으로 들어가는 타입들이 서로 관련성이 없다는 의미 만약 어떠한 관련성을 원한다면 out 또는
이펙티브 코틀린 아이템 23: 타입 파라미터의 섀도잉을 피하라
이펙티브 코틀린(재사용성) 아이템 23: 타입 파라미터의 섀도잉을 피하라 지역 파라미터가 외부 스코프에 있는 프로퍼티를 가린다. 이를 새도잉이라고 한다. 위와 같이 선언하면 타입 파라미터가 새도잉된다. 하지만 위처럼 독립적으로 동작합니다. 위처럼 선언해야 의도한 방식대로 동작할것입니다. 독립적으로 선언하고 싶으면 이름을
이펙티브 코틀린 아이템 22: 일반적인 알고리즘을 구현할 때 제네릭을 사용하라
이펙티브 코틀린(재사용성) 아이템 22: 일반적인 알고리즘을 구현할 때 제네릭을 사용하라 타입 아규먼트를 사용하는 함수를 제네릭 함수라고 부른다.(예 stdlib에 있는 filter 함수) 타입 파라미터는 컴파일러에 타입과 관련된 정보를 제공하여 컴파일러가 타입을 정확하게 추측할수 있다. 제네릭 제한 타입 파라미터의 중요
이펙티브 코틀린 아이템 21: 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라
이펙티브 코틀린(재사용성) 아이템 21: 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라 property delegate 를 사용하는것이 property delegation 이라고 부른다. 코틀린에서 lazy 함수 제공 프로퍼티 위임을 사용하면 변화가 있을때 이를 감지하는 observable 패턴을 쉽게 만들수 있다.
이펙티브 코틀린 아이템 20: 일반적인 알고리즘을 반복해서 구현하지 말라
이펙티브 코틀린(재사용성) 아이템 20: 일반적인 알고리즘을 반복해서 구현하지 말라 기존에 구현된 내용을 활용하면 장점 코드가 짧아진다. 코드 작성 속도가 빨라진다. 직접구현할때의 실수를 줄일수 있다. 제작자가 한번만 최적화하면 사용하는 모든곳에서 혜택을 받을수 있다. 표준라이브러리 살펴보기 stdlib는 확장함수를 활용
이펙티브 코틀린 아이템 19: knowledge를 반복하지 말라
이펙티브 코틀린(재사용성) 재사용성 : 프로그램 언어의 핵심 특성 아이템 19: knowledge를 반복하지 말라 프로젝트에서 이미 있던 코드를 복사해서 붙여넣고 있다면, 무언가가 잘못된 것이다. knowledge 를 반복하여 사용하지 말라 DRY 규칙, WET 안티패턴, SSOT(Singe Source of Truth)
이펙티브 코틀린 아이템 18: 코딩 컨벤션 지켜라
이펙티브 코틀린(가독성) 아이템 18: 코딩 컨벤션 지켜라 문서를 보면 알수 있듯이 잘 정리된 코딩 컨벤션을 가지고 있다. 코틀린 커뮤니티에 속한 사람이면 이러한 코딩 컨벤션에 익숙해지는것이 좋다. 장점 어떠한 프로젝트도 쉽게 이해 할수 이다. 다른 외부 개발자도 프로젝트 코드를 쉽게 이해할수 있다. 다른 개발자도 코드
이펙티브 코틀린 아이템 17: 이름 있는 아규먼트를 사용하라
이펙티브 코틀린(가독성) 아이템 17: 이름 있는 아규먼트를 사용하라 메소드의 Argument 용도가 분명하게 보이지 않을경우가 있다. 위처럼 joinToString에 | 값이 무엇을 뜻하는지 분명하지 않다. 코틀린에서는 이름있는 아규먼트를 지원한다. 물론 위와 같은 코드도 의미를 명확하게 알수 있다. 이름있는 아규먼트는
이펙티브 코틀린 아이템 16: 프로퍼티는 동작이 아니라 상태를 나타내야 한다
이펙티브 코틀린(가독성) 아이템 16: 프로퍼티는 동작이 아니라 상태를 나타내야 한다 프로퍼티는 사용자 정의 게터와 세터를 가질수 있다. 파생 프로퍼티 (derrived property) : var을 사용해서 만든 읽고 쓸 수 있는 프로퍼티는 게터와 세터 정의가 가능, val 로 읽기 전용 프로퍼티를 만들때는 field가
이펙티브 코틀린 아이템 15: 리시버를 명시적으로 참조하라
이펙티브 코틀린(가독성) 아이템 15: 리시버를 명시적으로 참조하라 무언가를 더 자세하기 설명하기 위해 명시적으로 긴코드를 사용할때가 있다. 대표적으로 함수와 프로퍼티 지역 또는 톱레벨 변수가 아닌 다른 리시버로부터 가지고 온다는것을 나타낼때가 있다. 예를 들면 클래스의 메서드라는것을 나타내기 위한 this가 있다. 리시
이펙티브 코틀린 아이템 14: 변수 타입이 명확하지 않은 경우 확실하게 지정하라
이펙티브 코틀린(가독성) 아이템 14: 변수 타입이 명확하지 않은 경우 확실하게 지정하라 코틀린은 개발자가 타입을 지정하지 않아도 타입을 지정해서 넣어주는 굉장히 수준 높은 타입 추론 시스템을 가지고 있다. 이는 개발시간을 줄여주거나 코드를 줄여줘서 가독성이 크게 향상 된다. 하지만 유형이 명확하지 않을때 남용하지 말자.
이펙티브 코틀린 아이템 13: Unit? 을 리턴하지 말라
이펙티브 코틀린(가독성) 아이템 13: Unit? 을 리턴하지 말라 Unit? 은 Unit 과 null을 반환할수 있다. 하지만 읽을때 오해의 소지가 있으며 예측하기 어려운 오류를 만들수 있다. Unit? 이 붙은 함수가 만들어지면 아래와 같은 코드가 나올수 있다. 이부분은 가독성 측면에서 이해하기 어렵다. 참조
이펙티브 코틀린 아이템 12: 연산자 오버로드를 할 때는 의미에 맞게 사용하라
이펙티브 코틀린(가독성) 아이템 12: 연산자 오버로드를 할 때는 의미에 맞게 사용하라 연산자 오버로딩 할때는 항상 신중 해야 된다. 코틀린에서는 각 연산자의 의미는 항상 같게 유지된다. 그래서 오버로딩해서 연산자의 의미를 바꾸면 혼란스럽게 된다. 분명하지 않는 경우 Infix functions(두개의 변수 가운데 오는
spring cloud wiremock m1 issues
spring cloud wiremock m1 issues spring cloud를 사용할때 아래와 같은 오류가 발생한다. 이슈는 wiremock 관련해서 나오는 에러이며 spring cloud 버전을 2021.0.2 이상으로 업그레이드 하던지 wiremock 버전을 2.32.0 버전으로 업데이트 하면 해결이 된다. gra
이펙티브 코틀린 아이템 11: 가독성을 목표로 설계하라
이펙티브 코틀린(가독성) 아이템 11: 가독성을 목표로 설계하라 코틀린은 간결성을 목표로 설계된 언어가 아니다 가독성을 항상 신경쓰자. 개발자가 코드를 작성하는데 1분 읽는데 10분 걸린다. 인식 부하 감소 가독성은 사람마다 다르게 느낄수 있다. 이해하기 쉬운지는 읽는 사람이 얼마나 많은 관용구(구조, 함수, 패턴)에 익
이펙티브 코틀린 아이템 10: 단위 테스트를 만들어라
이펙티브 코틀린(안정성) 아이템 10: 단위 테스트를 만들어라 지금 까지 코드를 안전하게 만드는 방법에 대해 이야기 했다 코드를 안전하게 만드는 가장 좋은 방법은 다양한 테스트를 해보는것이다. 단위 테스트의 일반적인 내용 일반적인 유즈케이스(happy path) 일반적인 오류케이스 와 잠재적 문제 에지 케이스와 잘못된 아
이펙티브 코틀린 아이템 9: use를 사용해 리소스를 닫아라
이펙티브 코틀린(안정성) 아이템 9: use를 사용해 리소스를 닫아라 Closeable를 구현하고 있는 클래스들을 처리 할때 try finally 를 사용해서 close 메소드를 호출 java의 try with resource 대신 use 와 Reader.useLines 확장 메소드를 제공한다. 참조
이펙티브 코틀린 아이템 8: 적절하게 null을 처리하라
이펙티브 코틀린(안정성) 아이템 8: 적절하게 null을 처리하라 null 은 값이 부족하다(lack of value)는 것을 나타낸다. String.toIntOrNull() String을 Int로 적절하게 변환할수 없을때 null을 반환 Iterable<T .firstOrNull(() Boolean) 주어진 조건에 맞는
이펙티브 코틀린 아이템 7: 결과 부족이 발생할 경우 null과 Failure를 사용하라
이펙티브 코틀린(안정성) 아이템 7: 결과 부족이 발생할 경우 null과 Failure를 사용하라 함수가 원하는 결과를 만들어 낼 수 없을때 이러한 상황을 처리하는 방법은 크게 두가지가 있다. null 또는 실패를 나타내는 sealed 클래스를 리턴한다. 예외를 throw 한다 예외는 예외 적인 상황이 발생했을때 사용하는
이펙티브 코틀린 아이템 6: 사용자 정의 오류보다는 표준 오류를 사용하라
이펙티브 코틀린(안정성) 아이템 6: 사용자 정의 오류보다는 표준 오류를 사용하라 IllegalArgumentException 과 IllegalStateException 는 require 와 check 를 사용해 throw 할수 있는 예외 IndexOutOfBoundsException : 인덱스 파라미터 값이 범위를 벗어
이펙티브 코틀린 아이템 5: 예외를 활용해 코드에 제한을 걸어라.
이펙티브 코틀린(안정성) 아이템 5: 예외를 활용해 코드에 제한을 걸어라 확실하게 어떤 형태로 동작해야 하는 코드가 있다면 예외를 활용해 제한을 거는것이 좋다. require 블록 : 아규먼트를 제한할 수 있다. check 블록 : 상태와 관련된 동작을 제한할 수 있다. assert 블록 : 어떤것이 true인지 확인할수
이펙티브 코틀린 아이템 4: inferred 타입으로 리턴하지 말라
이펙티브 코틀린(안정성) 아이템 4: inferred 타입으로 리턴하지 말라 코틀린의 타입 추론은 가장 널리 알려진 코틀린의 특징이다. 타입추론을 사용할 때는 몇 가지 위험한 부분이 있다. 우선 할당 떄 inferred 타입은 정확하게 오른쪽에 있는 피연산자에 맞게 설정된다 절대로 슈퍼 클래스 또는 인터페이스로 설정되지
이펙티브 코틀린 아이템 3: 최대한 플랫폼 타입을 사용하지 말라
이펙티브 코틀린(안정성) 아이템 3: 최대한 플랫폼 타입을 사용하지 말라 코틀린에서는 null safety 메커니즘을 사용해 NPE는 거의 찾아 보기 힘들다. 코틀린에서 자바 코드를 사용할때 @Nullable 어노테이션이 붙어 있으면 String?으로 변경하고 @NotNull 이면 String으로 선언하면 되는데 아무 어
이펙티브 코틀린 아이템 2: 변수의 스코프를 최소화하라
이펙티브 코틀린(안정성) 아이템 2: 변수의 스코프를 최소화하라 상태를 정의할 때는 변수와 프로퍼티는 스코프를 최소화 하는것이 좋다. 프로퍼티보다 지역 변수를 사용하는것이 좋다. 최대한 좁은 스코프를 갖게 변수를 사용하자. 여러 프로퍼티를 한꺼번에 설정해야 하는 경우에는 구조분해 선언을 사용하는 것이 좋다. 스코프를 좁게
이펙티브 코틀린 아이템 1: 가변성을 제한하라
이펙티브 코틀린(안정성) 아이템 1: 가변성을 제한하라 var 나 mutable 객체를 사용하면 상태를 가질수 있다. 상태를 가지는것은 양날의 검이다. 그래서 가변성을 제한하는것을 추천한다. 코틀린은 가변성을 제한하는것이 쉽게 만들어져 있다. 읽기 전용 프로퍼티(val) 가변 컬렉션과 읽기 전용 컬렉션 구분 데이터 클래스
testcontainers macbook m1 error
testcontainers macbook m1 error 잘 동작하던 테스트 코드가 동작이 안되서 확인 했더니 테스트 컨테이너에서 위와같은 오류가 나고 있었다. 그래서 도커허브에서 mysql 이미지를 찾아보니 linux/arm64/v8 이미지는 존재하지 않았다. m1 맥북 이슈 인것 같아서 테스트 컨테이너 이슈를 찾아보니
JEP 408: Simple Web Server
JEP 408: Simple Web Server Summary 정적 파일만 제공하는 최소 웹 서버를 시작하는 명령줄 도구를 제공합니다. CGI 또는 서블릿과 유사한 기능을 사용할 수 없습니다. 이 도구는 특히 교육적 맥락에서 프로토타이핑, 임시 코딩 및 테스트 목적에 유용합니다. Goals 간편한 설정과 최소한의 기능으로
JEP 400: UTF-8 by Default
JEP 400: UTF 8 by Default Summary 표준 Java API의 기본 문자 집합으로 UTF 8을 지정합니다. 이 변경으로 기본 문자 집합에 의존하는 API는 모든 구현, 운영 체제, 로케일 및 구성에서 일관되게 작동합니다. Goals 1. 코드가 기본 문자 집합에 의존할 때 Java 프로그램을 보다 예
JEP 390: Warnings for Value-Based Classes
JEP 390: Warnings for Value Based Classes Summary 기본 래퍼 클래스를 값 기반 으로 지정하고 제거를 위해 해당 생성자를 더 이상 사용하지 않으며, 새로운 사용 중단 경고가 표시됩니다. Java 플랫폼에서 값 기반 클래스의 인스턴스에서 동기화하려는 부적절한 시도에 대한 경고를 제공합니
JEP 387: Elastic Metaspace
JEP 387: Elastic Metaspace Summary 사용하지 않은 HotSpot 클래스 메타데이터(즉, 메타 스페이스 ) 메모리를 운영 체제에 보다 신속하게 반환하고, 메타스페이스 공간을 줄이고, 메타스페이스 코드를 단순화하여 유지 관리 비용을 줄입니다. Non Goals 압축된 클래스 포인터 인코딩이 작동하는
kustomize 소개
kustomize 소개. Kubernetes를 위한 템플릿이 필요 없는 구성 사용자 지정 Kubernetes 환경을 실행하는 경우 Kubernetes 구성을 사용자 정의했을 가능성이 있습니다. 일부 API 객체 YAML 파일을 복사하고 필요에 맞게 편집했습니다. 그러나 이 접근 방식에는 단점이 있습니다. 소스 자료로 돌아
spring kafka dead letter queue 설정
spring kafka dead letter queue 설정 kafka 커넥터를 사용해서 dlq를 설정하는 방법이 있고 spring을 사용해서 컨슈머를 만들었으면 스프링을 통해서 dlq를 설정 하는 방법이 있다. spring에서 dlq를 설정하는 방법에 대해서 알아 보겠다. 스프링 부트를 사용하면 위와 같은 코드를 통해서
ErrorHandlingDeserializer 설정
ErrorHandlingDeserializer 설정 poll() 시에 deserializer가 메시지를 deserialize하는 데 실패하면 반환 전에 발생하기 때문에 Spring은 문제를 처리할 방법이 없다. 에러 메시지 위에 코드처럼 처음부터 객체를 받을때를 말하는것이다. 이런 문제를 해결하기 위해 ErrorHandl
AmazonS3Exception 처리
AmazonS3Exception 처리 spring boot starter actuator 에서 /actuator/health 호출시에 config server의 경우 아래 처럼 repositories에 대한 설정을 하거나 spring.cloud.config.server.health.enabled=false 설정을 통해서
카프카 send 시 에러
카프카 send 시 에러 org.apache.kafka.common.InvalidRecordException: This record has failed the validation on broker and hence will be rejected. 위에 에러메시지시가 발생하면서 send가 되지 않았다 확인해 보니 kafka
쿠버네티스에서 command를 활용해서 APM agent 설치하기
쿠버네티스에서 command를 활용해서 APM agent 설치하기 command를 활용해서 해당 파일을 pod에 다운로드 하는 방법을 적어 놓는다. 위처럼 간단하네 커멘드 내용을 활용해서 처리를 했다 커멘드를 사용시에 주의사항은 dockerfile에 ENTRYPOINT가 사용되지 않아서 실제 실행까지 시켜줘야 된다. 참고
Docker 에서 JAVA_OPTS 환경 변수 선언하기
Docker 에서 JAVA OPTS 환경 변수 선언하기 아래 처럼 도커 ENTRYPOINT 에 JAVA OPTS 환경변수를 선언하면 could not find or load main class $java opts 오류가 나온다. exec 명령어를 사용하면 오류 없이 정상동작이 된다. 참고자료
kubernetes alb ingress health check path 서비스마다 다르게 설정하기
kubernetes alb ingress health check path 서비스마다 다르게 설정하기 위와 같이 Ingress를 설정하면 공통적으로 healthcheck path를 지정하는데 이것을 서비스마다 바꾸려면 아래 처럼 서비스에서 지정해주면 된다. 참고자료
org.yaml.snakeyaml.error.YAMLException: java.io.IOException: Stream closed
org.yaml.snakeyaml.error.YAMLException: java.io.IOException: Stream closed 이렇게 ClassLoader 에서 Stream을 얻어서 사용하고 있었다 이렇게 했을때 test code도 모두 통과 하고 정상적인것 처럼 보였다. 서버에서 실행을 해봤더니 error가 나왔
postgresql에서 jpa 자동 키 생성 오류
postgresql에서 jpa 자동 키 생성 오류 jpa에서 insert를 하는데 계속 오류메시지를 내뱉었다. 일단 구현체는 hibernate를 사용했는데 내가 무슨 관계를 잘못 맺은줄 알고 무려 이틀을 소모한뒤 동료들과 논의 했을때도 오류를 찾지 못했다. 내가 잘 모르고 사용했던것 같다 여기서 자동 키 맵핑 전략을 가지
mapstruct에서 프로퍼티 값을 로드해서 맵핑하기
mapstruct에서 프로퍼티 값을 로드해서 맵핑하기 mapper의 componentModel = "spring" 으로 사용하면 bean으로 등록하고 di를 사용할수 있다. 이 내용을 활용해서 @Component로 등록한 다른 mapper를 uses에 등록해주면 해당 부분을 di 활용해서 사용할수 있다. 컴파일후 빌드된
junit mockmvc 한글깨짐 처리시 restdocs 에러
junit mockmvc 한글깨짐 처리시 restdocs 에러 일반적으로 한글깨짐 처리시 위에처럼 mockMvc를 생성할때 필터를 동작시키는 방법으로 처리를 한다. 그런데 rest docs를 같이 사용하면 아래의 에러를 볼수 있다. 처리 방안은 아래처럼 하나를 추가해주면 된다. 위처럼 수정해주면 에러 없이 정상 동작을 한
spring restdocs 문서에 context-path 표현하기
spring restdocs 문서에 context path 표현하기 restdoc를 할때 test code에 contextPath를 지정해 주면된다. 실제 rest 코드에는 context path가 지정되지 않는다. 참고자료
aws ecr에 이미지 등록시키기
aws ecr에 이미지 등록시키기 아래 처럼 도커이미지 빌드를 완성한후에 위와 같은 명령어로 처리를 하면 ecr에 이미지가 등록이 된다. 참고자료
mapstruct Ignoring Unmapped Properties
mapstruct Ignoring Unmapped Properties mapstruct를 사용하다 보면 아래같은 오류가 발생한다. mapper에서 맴핑되지 않은 속성이 있으면 메시지가 출력된다 해결방법 @Mapping에 속성으로 ignore = true 로 처리 unmappedTargetPolicy 적용 ERROR : 매
테스트 컨테이너를 통해서 단위 테스트 실행하기
테스트 컨테이너를 통해서 데이터베이스 단위 테스트 실행하기 Testcontainers 를 통하면 H2가 에뮬레이트하지 않는 데이터베이스 기능에 의존하는 DAO 단위 테스트 지원 할수 있다. 가장 간단하게 spring에 적용하는 법으로 jdbc url을 바꿔주는 방법이 있다. 위와 같이 간단한 선언 만으로 db를 실행시켜서
gradle build 속도
gradle build 속도 멀티 모듈 프로젝트로 모듈이 많아 지고 테스트 코드가 나눠지면서 빌드 속도가 오래 걸리기 시작했다 조금 찾아 보니 병렬 실행 옵션이 존재한다. gradle.properties 위에 욥션을 주거나 명령줄에 parallel을 주면 속도가 빨라진다. 여기서 성능 관련해서 몇가지 옵션들이 있는데 보면
com.amazonaws.SdkClientException: Failed to connect to service endpoint: 에러
com.amazonaws.SdkClientException: Failed to connect to service endpoint: 에러 EC2 메타데이터 서비스는 애플리케이션이 AWS 환경에서 실행 중인지 여부를 식별하는 데 권장되는 방법입니다. 2.3.0 버전에서 cloud.aws.instance.data.enabled
Data Mapper
Data Mapper 객체와 데이터베이스 간에 데이터를 이동하는 매퍼(473) 계층으로 객체와 데이터베이스를 서로 독립적으로 유지하고 매퍼 자체를 유지합니다. 개체와 관계형 데이터베이스는 데이터를 구조화하는 메커니즘이 다릅니다. 컬렉션 및 상속과 같은 개체의 많은 부분은 관계형 데이터베이스에 없습니다. 많은 비즈니스 논리
Active Record
Active Record 데이터베이스 테이블 또는 뷰의 행을 래핑하고 데이터베이스 액세스를 캡슐화하고 해당 데이터에 도메인 논리를 추가하는 개체입니다. 개체는 데이터와 동작을 모두 전달합니다. 이 데이터의 대부분은 영구적이며 데이터베이스에 저장해야 합니다. Active Record는 가장 확실한 접근 방식을 사용하여 데이
헥사고날 아키텍처에서 패키지 구조
헥사고날 아키텍처에서 패키지 구조 모듈 설명 core : 실제 도메인 처리 모듈 클린아카텍처의 엔티티 영역(port & entities) presentation : UI 담당 인터페이스(adapter) infrastructure : 백엔드 인프라 담당 인터페이스(adapter) external : 외부 시스템 API 연동
java 와 spring 을 이용한 헥사고날 아키텍처(hexagonal architecture)
java 와 spring 을 이용한 헥사고날 아키텍처(hexagonal architecture) Hexagonal Architecture 의 주요 기능은 구성 요소 간의 종속성이 도메인 개체 안쪽 으로 향한다는 것입니다. 도메인 개체는 외부 종속성이 없어야 된다. 순수 java 로 만들어야 하며 유즈케이스에 대한 인터페이
ssh config 설정
ssh config 설정 설정 /.ssh/ 폴더에 config 파일 설정으로 편하게 접속가능하게 설정 할수 있다. 권한 설정 chmod 440 /.ssh/config 참고자료
kubectl 다중 클러스터 접근 구성(aws eks)
kubectl 다중 클러스터 접근 구성(aws eks) 먼저 를 설치해야 된다. 설치후에 eks 접속 권한이 있는 key와 secret을 설정해야 된다. 위에 commend를 설정 하면 kubeconfig를 업데이트 하게 된다. 아래 의 명령어로 contexts가 잘등록 된지 확인할수 있다. 전체 context 목록 확인
aws 커멘드라인 툴(cli) 설치
aws 커멘드라인 툴(cli) 설치 커멘드 라인툴을 설치 하면 config를 설정해야 되는데 위에 명령어를 치면 아래처럼 Access key와 Secret를 그리고 리전을 입력하는 창이 나오는데 자신의 키를 입력하면 된다. Access key와 secret은 최초 계정생성시 발급이 된다. Access key는 확인이 가능
단위 테스트 모범사례
단위 테스트 모범사례 위 내용을 보고 조금 정리 해 보았다. 단위 테스트 이유 기능 테스트 수행 시간 단축 : 사소한 변경에 몇 초가 걸리거나 큰 변경에는 몇분이 걸릴 수도 있습니다. 하지만 단위테스트는 몇 밀리세컨드 밖에 걸리지 않고 확인도 test runner의 몫입니다. 회귀에 대한 보호 : 회귀 오류는 애플리게이션
테스트 더블(TestDouble)
테스트 더블(TestDouble) 테스트더블의 용어는 스턴트더블를 생각하면 된다. 영화 촬영시 위험한 액션씬을 찍을때 스턴트 더블을 사용하기도 한다. 테스트도 테스트 하기 어려운것을 테스트 하기 위해 테스트 더블을 사용한다.(Gerard Meszaros가 사용한 어휘) Dummy : 오브젝트는 전달되지만 실제로 사용되지는
자체 테스트 코드(SelfTestingCode)
자체 테스트 코드(SelfTestingCode) 자체 테스트 코드는 기능 소프트웨어와 함께 포괄적 인 자동화 테스트를 작성하는 관행을 참조하기 위해 리팩토링 책 에서 사용한 이름 코드베이스에 대해 일련의 자동화 된 테스트를 실행할 수있을 때 자체 테스트 코드가 있고 테스트를 통과하면 코드에 상당한 결함이 없음을 확신 할
단위 테스트(UnitTest)
단위 테스트(UnitTest) 단위 테스트의 공통요소 단위 테스트가 소프트웨어 시스템의 작은 부분에 초점을 맞춘 저수준이라는 개념 단위 테스트는 일반적으로 프로그래머가 일반 도구를 사용하여 작성 단위 테스트는 다른 종류의 테스트보다 훨씬 빠를 것으로 예상 사람마다 다른 단위의 범위를 가지고 있다. 객체지향설계에서는 클래스
젠킨스 파이프라인(jenkinsfile)에서 /usr/local/bin 인식 시키기
젠킨스 파이프라인(jenkinsfile)에서 /usr/local/bin 인식 시키기 젠킨스 파이프 라인에서 sh 을 실행시킬려고 하는데 docker compose 명령을 인식하지 못한다 위처럼 $PATH를 찍어 보니 /usr/local/bin 이 경로에 없었다. withEnv 라는 함수를 사용해 아래와 같이 활용할수도 있
scouter-paper 설치
scouter paper 설치 먼저 스카우터 서버에 scouter.conf 값을 설정해줘야 된다. scouter/server/conf/scouter.conf 에 아래의 설정값을 주면서 활성화를 시켜줘야 된다. 위 처럼 설정해주면 스카우터의 웹 API를 사용할수 있게 된다. 테스트는 브라우저에 http://{SERVER A
java 모니터링 툴 scouter 클라이언트 BigSur(macos) 오류
java 모니터링 툴 scouter 클라이언트 BigSur(macos) 오류 실행이 안되는 오류 실행이 안되는 오류는 java 경로 오류로 일단 brew로 자바를 인스톨 했을때는 일어나지 않았다. 해결 방법 링크는 scouter.client 패키지 내용 보기 Contents Info.plist 파일에 내용을 수정하면 된다
Spring Dynamic DataSource Routing
Spring Dynamic DataSource Routing(AbstractRoutingDataSource) AbstractRoutingDataSource.java 클래스에 abstract 메소드로 determineCurrentLookupKey 존재한다. 대충 코드를 보면 위와같은 내용인데 getConnection 할때
QuerydslRepositorySupport 상속 받은 클래스 @DataJpaTest 로 테스트 하기
QuerydslRepositorySupport 상속 받은 클래스 @DataJpaTest 로 테스트 하기 @DataJpaTest 기본적으로 in memory embedded database를 생성하고 @Entity 클래스를 스캔합니다. 일반적인 다른 컴포넌트들은 스캔하지 않습니다. 다른 설정값들을 스캔하는 방법으로는 @Im
minikube 시작하기
minikube 시작하기 주요목표 minikube의 기본 목표는 일상적인 개발 워크 플로 및 학습 목적을 위해 Kubernetes를 로컬에서 간단하게 실행하는 것입니다. 다음은 minikube의 기본 원칙입니다. 우선 순위는 다음과 같습니다. 포용적이고 커뮤니티 중심 사용자 친화적 모든 Kubernetes 기능 지원 크로
멀티 모듈로 @DataJpaTest 진행할때 오류
멀티 모듈로 @DataJpaTest 진행할때 오류 Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test 멀티 모듈에서 실제 @SpringBootAp
포스트그레스큐엘(PostgreSQL) 도커 실행시 sql 파일 같이 실행 시키기
포스트그레스큐엘(PostgreSQL) 도커 실행시 sql 파일 같이 실행 시키기 Initialization scripts 이 하나에서 파생 된 이미지에서 추가 초기화 작업을 수행하려는 경우, 하나 이상의 추가 .sql, .sql.gz또는 .sh아래 스크립트를 /docker entrypoint initdb.d(필요하면 디렉
레디스(redis)
레디스(redis) 개발 용이성 자료구조가 atomic 하다.(race condition을 피할수 있다.) collection을 제공 한다. replication primary 와 secondary 구조로 replication을 셋팅할수 있다. DB의 statement replication(명령어로 동기화 되기 때문에 r
서비스 스텍(ServiceStack) 테스트코드 작성
서비스 스텍(ServiceStack) 테스트코드 작성 서비스 스텍을 사용해서 개발을 했으면 아래같은 코드를 사용해 간단하게 테스트 해볼수 있다. 참조
c# 환경변수 설정
c 환경변수 설정 launchSettings.json 에 설정된 환경 변수값을 받아서 처리를 하는데 테스트 코드 작성시 특정 환경 변수에서 동작하고 싶을때 아래처럼 Environment.SetEnvironmentVariable 메소드를 사용하면 환경 변수를 셋팅할수 있다. 참조
이펙티브 c# (6)
이펙티브 c 아이템 21: 타입 매개변수가 IDisposable을 지원할 경우를 대비하여 제네릭 클래스를 작성하라 제네릭의 역활 런타임 오류가 발생할 가능성이 있는 부분을 컴파일 타임 오류로 대체 가능 타입 매개변수로 사용할 수있는 타입을 명확히 규정하여 사용자에게 도움을 준다. 타입 매개변수로 지정하는 타입이 IDisp
dotnet-ef 명령 사용 하기
dotnet ef 명령 사용 하기 비주얼 스튜디오에서는 패키지 관리자 콘솔을 제공해서 엔티티프레임워크 마이그레이션을 실행할수 있다. 하지만 다른 IDE에서는 제공하지 않아서 콘솔창에서 직접 실행하는 방법을 알아 보겠다. 먼저 dotnet core sdk가 설치가 되어 있으면 donet 명령어가 실행이 된다. dotnet
이펙티브 c# (5)
이펙티브 c 아이템 18: 반드시 필요한 제약 조건만 설정하라 제약 조건은 제네릭 타입에 대해 우리가 가정하고 있는 사실을 컴파일러와 다른 개발자에게 알려주는 용도로 사용된다. 컴파일러에게 제약조건을 알려준다는것은 System.Object에서 노출하는 수준 이상으로 사용할 수 있음을 알려주는것이다. 제네릭 사용시 컴파일러
이펙티브 c# (4)
이펙티브 c 아이템 13: 정적 클래스 멤버를 올바르게 초기화하라 정적 멤버 변수 초기화 하는 방법엔 2가지 정적 멤버 초기화 구분 정적 생성자: 타입내에 정의된 모든 메서드, 변수, 속성에 최초로 접근하기 전에 자동으로 호출되는 특이한 메서드다. 아이템 14: 초기화 코드가 중복되는 것을 최소화하라 위처럼 하면 여러개의
이펙티브 c# (3)
이펙티브 c 아이템 10: 베이스 클래스가 업그레이드된 경우에만 new 한정자를 사용하라 override 키워드는 virtual 선언된 멤버를 재정의 할때 쓸수있다. new 한정자는 virtual로 선언되지 않은 멤버를 재정의 할때 쓸수있다. 하지만 위처럼 코드를 작성하면 혼돈스러울 수 밖에 없다 동일한 객체를 이용하여
이펙티브 c# (2)
이펙티브 c 아이템 5: 문화권별로 다른 문자열을 생성하려면 FormattableString을 사용하라 아이템 6: nameof() 연산자를 적극 활용하라 nameof 식은 변수, 형식 또는 멤버의 이름을 문자열 상수로 가져옵니다. nameof를 활용하면 인수 검사 코드를 좀더 쉽게 유지 할수 있다. nameof 연산자를
이펙티브 c# (1)
이펙티브 c 아이템1: 지역변수를 선언할 때는 var를 사용하는 것이 낫다. 코드를 읽을때 타입을 명시적으로 드러내야 하는 경우가 아니라면 var를 사용하는것이 더 좋을수도 있다. 다만 내장 숫자 타입(int,float,double 등..)을 선언할 때는 명시적으로 타입을 선언하는 편이 낫다. 아이템 2: const보다는
.NET 테스크 기반 비동기 패턴(Task-based async model)의 사용
.NET 테스크 기반 비동기 패턴(Task based async model)의 사용 TAP(Task based asynchronous pattern)을 사용하여 비동기 작업을 수행할 경우 콜백을 사용하면 차단 없이 대기를 진행할 수 있습니다. Task의 경우 이는 Task.ContinueWith와 같은 메서드를 통해 수행
.NET 테스크 기반 비동기 패턴 (Task-based async model)
.NET 테스크 기반 비동기 패턴 (Task based async model) .NET 태스크 기반 비동기 모델을 사용하면 I/O 및 CPU 바인딩된 비동기 코드를 간단하게 작성할 수 있습니다. 모델은 C 및 Visual Basic에서 Task 및 Task<T 형식과 async 및 await 키워드로 표시됩니다. Task
LINQ(Language-Integrated Query) 쿼리 결과 Object로 반환
LINQ(Language Integrated Query) 쿼리 결과 Object로 반환 간단하게 테스트 가능한 코드를 보여준다. 참조
LINQ(Language-Integrated Query) in C#
LINQ(Language Integrated Query) in C LINQ(Language Integrated Query)는 C 언어에 직접 쿼리 기능을 통합하는 방식을 기반으로 하는 기술 집합 이름입니다. LINQ를 사용할 경우 쿼리는 클래스, 메서드, 이벤트와 같은 고급 언어 구문이 됩니다 쿼리식을 사용해서 데이터소스
닷넷(dotnet) 엔티티 프레임워크(Entity Framework) sqlite no such table error
닷넷(dotnet) 엔티티 프레임워크(Entity Framework) sqlite no such table error 엔티티 프레임워크에 sqllite를 사용해서 프로그램을 만들어서 update database 까지 문제 없이 완료 했지만 실행시 계속 no such table error 가 나온다. 처음에는 이해가 가지
닷넷(dotnet) 엔티티 프레임워크(Entity Framework) DbContext
닷넷(dotnet) 엔티티 프레임워크(Entity Framework) DbContext Entity Framework를 사용 하 여 .NET 개체를 사용 하 여 데이터를 쿼리, 삽입, 업데이트 및 삭제 하려면 먼저 모델에 정의 된 엔터티와 관계를 데이터베이스의 테이블에 매핑하는 모델을 만들어야 합니다. 모델이 있으면 응용
닷넷(dotnet) 엔티티 프레임워크(Entity Framework)에서 패키지 관리자 콘솔 명령어 정리
닷넷(dotnet) 엔티티 프레임워크(Entity Framework)에서 패키지 관리자 콘솔 명령어 정리 인스톨 명령 업데이트 명령 사용법 및 정상동작하는지 확인하기 위한 명령 마이그레이션 파일 생성(Add Migration) 엔티티 프레임워크 모델을 생성후에 마이그레이션 파일을 생성 하는 커멘드이다. 위처럼 Add Mi
닷넷(dotnet) 엔티티 프레임워크(Entity Framework)에서 enum 사용하기
닷넷(dotnet) 엔티티 프레임워크(Entity Framework)에서 enum 사용하기 엔티티 프레임워크를 사용해서 개발을 하다 보면 특정 컬럼에 값을 한정지어야 할 필요가 있다. 이럴때 enum을 활용 할 텐데 해당 값을 사용해서 처리 하는 방법은 위에 모델은 영화를 모델링 한것이고 영화에 관람등급이 존재한다. 해당
C# 개념 (2)-속성 (Properties)
C 개념 (2) 속성 (Properties) 속성 (Properties) 위에 표시된 구분은 자동 속성 구문 입니다. 컴파일러가 get및 set 접근자의 본문을 구현함 FirstName 필드에 초기 값을 null 대신 빈문자열로 설정하려면 아래와 같이 한다. 특성 초기화는 읽기 전용 속성에 가장 유용하다. 아래 처럼 직접
C# 개념 (1)-네임스페이스,튜플,형식분해
C 개념 (1) 네임스페이스,튜플,형식분해 네임스페이스(namespace) 위 코드에서 System 은 네임스페이스고 Console 은 네임스페이스에 클래스입니다. 위처럼 using 키워드를 사용해서 사용할수도 있습니다. 고유한 네임스페이스를 선언하면 대규모 프로그래밍 프로젝트에서 클래스 및 메서드 이름에 범위를 지정할수
닷넷코어 자습서-Visual Studio 사용
닷넷코어 자습서 Visual Studio 사용 앱 실행 ctrl + f5 를 사용하면 디버깅 없이 프로그램을 실행할수 있다. 디버그 빌드 구성 사용 컴파일러가 디버그 버전으로 컴파일하도록 구성되어 있어야 한다. Breakpoint 설정은 f9키를 사용해서 설정 할 수 있다. 물론 마우스로 클릭해서도 가능 그 다음 f5로
java 15 preview 기능 테스트를 위한 gradle 설정
java 15 preview 기능 테스트를 위한 gradle 설정 java preview 기능은 jep12로써 java12버전 부터 도입되었다. 해당 preview 기능을 사용하려면 java, javac,javadoc, jshell, jlink 명령시에 enable preview 인자값을 주는것이다. gradle에서 해당
mybatis에서 N+1 문제 해결
mybatis에서 N+1 문제 해결 바로 직전처럼 Mybatis를 사용해서 oneToMany 상황에 설정해서 쓸수 있는 방법이 있습니다. 하지만 첫번째 상황은 N+1 문제에 직면하게 됩니다. 이부분을 조인 쿼리를 통해서 해결 할수 있습니다. 먼저 mybatis xml 설정은 위처럼 조인 쿼리를 사용하면 한번에 쿼리에 필요
mybatis에서 oneToMany 형태의 객체를 조회 할때 사용할수 있는 기능
mybatis에서 oneToMany 형태의 객체를 조회 할때 사용할수 있는 기능 JPA에서 OneToMany를 사용하면 객체의 구조적으로 하위 테이블 정보를 select 할수 있다. Mybatis에서도 가능한데 해당 기능은 아래 처럼 2가지 방법으로 설정 할수 있다. 먼저 테이블 생성을 위해 Entity를 만들면 Memb
spring security test code 작성시 UserDetails가 필요할때
spring security test code 작성시 UserDetails가 필요할때 스프링 시큐리티 테스트 코드 작성시 '@WithMockUser' 어너테이션을 사용해서 인증을 통과 시킨다 하지만 어떤 API는 UserDetails를 필요로 할수 있다 그럴때 커스텀 어너테이션을 만들어서 사용할수 있다. 위처럼 간단하게
GRASP(General Responsibility Assignment Software Patterns)
GRASP(General Responsibility Assignment Software Patterns) GRASP는 클래스와 객체에 책임을 할당하기위한 지침으로 구성됩니다. 모든 패턴은 일부 소프트웨어 문제에 대한 답을 제공 하며 이러한 문제는 거의 모든 소프트웨어 개발 프로젝트에 공통적 입니다. 이러한 기술은 새로운
Data Classes and Sealed Types for Java
Data Classes and Sealed Types for Java 이 문서는 Java 언어의 데이터 클래스 및 봉인 유형 에 대한 가능한 방향을 탐색 하고 Java의 데이터 클래스에 대한 업데이트 입니다. 이것은 탐색 적 문서 일 뿐이며 특정 버전의 Java 언어의 특정 기능에 대한 계획을 구성하지 않습니다. Back
AWS Command Line Interface
AWS Command Line Interface AWS Command Line Interface (AWS CLI)는 AWS 명령줄 셸에서 명령을 사용하는 서비스입니다. macOS 를 사용할때는 homebrew를 사용하여 install 할수 있다. 위 처럼 인스톨후에 명령어를 입력하면 Access key ID 와 Secre
Background: how we got the generics we have
Background: how we got the generics we have (Or, how I learned to stop worrying and love erasure) Brian Goetz, June 2020 제네릭이 어디로 가는지 이야기하기 전에 먼저 그들이 어디에 있는지, 어떻게 거기에 도달했는지 이야기해야합니
JEP 378: Text Blocks
JEP 378: Text Blocks Summary java 언어에 텍스트 블록 을 추가하십시오. 텍스트 블록은 대부분의 이스케이프 시퀀스가 필요하지 않고 예측 가능한 방식으로 문자열의 형식을 자동으로 지정하며 개발자가 원하는 경우 형식을 제어 할 수있는 여러 줄 문자열 리터럴입니다. History 텍스트 블록은 2019
JEP 375: Pattern Matching for instanceof (Second Preview)
JEP 375: Pattern Matching for instanceof (Second Preview) Summary instanceof 연산자에 대한 패턴 일치 로 Java 프로그래밍 언어를 향상시킵니다. 패턴 매칭을 사용하면 프로그램의 공통 논리, 즉 개체에서 구성 요소의 조건부 추출을보다 간결하고 안전하게 표현할 수
spring에서 form으로 전송시 setter 없이 bind 하기
spring에서 form으로 전송시 setter 없이 bind 하기 위 처럼 컨트롤러 어드바이스에 등록시키면 setter 없이도 바인드가 된다 참조
도메인 주도 설계 구현-애플리케이션
도메인 주도 설계 구현 애플리케이션(Application) 핵심 도메인 모델과 상호 교류하며 이를 지원하기 위해 잘 조합된 컴포넌트의 집합 사용자 인터페이스 도메인 객체 랜더링 애그리게잇 인스턴스로 부터 데이터 전송 객체(DTO) 랜더링하기 애그리게잇 내부 상태를 발행하기 위해 중재자를 사용하자 도메인 페이로드 객체로부터
도메인 주도 설계 구현-바운디드 컨텍스트 통합
도메인 주도 설계 구현 바운디드 컨텍스트 통합(Integrating Bounded Contexts) 통합의 기본 1. 하나의 바운디드 컨텍스트가 애플리케이션 프로그래밍 인터페이스(API)를 노출하고 다른 바운디드 컨텍스트가 원격 프로시저 호출(RPC)을 통해 해당 API를 사용하는 방법 2. 메시징 메커니즘을 사용하는 것
도메인 주도 설계 구현-리파지토리
도메인 주도 설계 구현 리파지토리(repository) 리파지토리는 보통 저장소의 위치를 말하는데 주로 그안에 저장된 항목의 안전이나 보존을 위한 장소로 여긴다. 이런 기본적인 원리들은 DDD 리파지토리에도 적용된다. 일반적으로 애그리게잇 타입과 리파지토리 사이에는 일대일의 관계가 성립한다. 정확히 말하자면 애그리게잇만이
도메인 주도 설계 구현-팩토리
도메인 주도 설계 구현 팩토리(factory) 도메인 모델 내의 팩토리 팩토리는 도메인 모델 내에서 객체 생성외의 추가적인 책임을 가질수도 있고 그럴지 않을 수도 있다. 애그리게잇 루트상의 팩토리 메소드 신중한 생성 과정을 통해 클라이언트가 짊어져야 하는 부담을 줄이고 모델의 표현력을 얻을수 있다. 서비스의 팩토리 서비스
도메인 주도 설계 구현-애그리게잇(2)
도메인 주도 설계 구현 애그리게잇(aggregate) 규칙 : 경계의 밖에선 결과적 일관성을 사용하라 하나의 애그리게잇 인스턴스에서 커맨드를 수행할 때 하나 이상의 애그리게잇에서 추가적인 비즈니스 규칙이 수행돼야 한다면 결과적 일관성을 사용하자 큰 규모의 트래픽이 많은 엔터프라이즈에선 애그리게잇 인스턴스가 절대적이고 완전
도메인 주도 설계 구현-애그리게잇(1)
도메인 주도 설계 구현 애그리게잇(aggregate) 스크럼 핵심 도메인에서 애그리게잇 사용하기 큰 클러스터의 애그리게잇 크기가 큰 애그리게잇은 처음엔 그럴싸해 보이지만 실제론 실용적이지 않다. 의도치 않게 트랜젝션이 주기적으로 실패하는데 실패의 원인은 실제 비즈니스 규칙이 아닌 잘못된 고정자를 기준으로 설계 하여 실패
도메인 주도 설계 구현-모듈
도메인 주도 설계 구현 모듈(module) 모듈 설계하기 DDD 컨텍스트에서 모델 안의 모듈은 서로 간에 높은 응집도를 갖고 있는 도메인 객체를 담는 이름이 붙여진 컨테이너 역활을 수행하며 각이 다른 모듈에 있는 클래스 사이에 낮은 결합도를 유지하는 것이 목표가 돼야 한다. 모듈 설계의 간단한 규칙 1. 모델링 개념에 맞
rabbitmq 설치후 prometheus 플러그인 port 변경
rabbitmq 설치후 prometheus 플러그인 port 변경 advanced.config 참조
도메인 주도 설계 구현-도메인 이벤트(4)
도메인 주도 설계 구현 도메인 이벤트(Domain Events) 이벤트 저장소 한 바운디드 컨텍스트에 모든 도메인 이벤트를 하나의 저장소에 유지 관리할때 장점 1. 이벤트 저장소를 큐를 사용해 메시징 인프라를 통해 모든 도메인 이벤트를 발행한다. 2. 폴링 중인 클라이언트에게 REST 기반 이벤트 알림을 전달하기 위해 같
도메인 주도 설계 구현-도메인 이벤트(3)
도메인 주도 설계 구현 도메인 이벤트(Domain Events) 도메인 모델에서 이벤트 발행하기 구독자 어떤 컴포넌트가 도메인 이벤트에 구독자를 등록하는가? 일반적으로 애플리케이션 서비스에서 등록이 이뤄지며 때론 도메인 서비스에서도 등록할 수 있다. 헥사고날 아키텍처를 사용할 땐 애플리케이션 서비스가 도메인 모델의 직접적
도메인 주도 설계 구현-도메인 이벤트(2)
도메인 주도 설계 구현 도메인 이벤트(Domain Events) 이벤트의 모델링 이벤트를 모델링할 땐 해당 이벤트가 속한 바운디드 컨텍스트의 유비쿼터스 언어에 따라 이벤트와 속성을 명명하 애그리게잇의 커맨드 오퍼레이션 실행에 따른 결과로 그 이름은 보통 커맨드로 부터 파생된다 이벤트가 제공하는 행동적 오퍼레이션은 어떻게
도메인 주도 설계 구현-도메인 이벤트(1)
도메인 주도 설계 구현 도메인 이벤트(Domain Events) 도메인이 발생한 사건을 위해 도메인 이벤트를 사용하자. 이벤트는 아주 강력한 모델링 도구이다. 일단 도메인 이벤트를 사용하는 법을 알고 나면 여러분은 이에 중독돼서 어떻게 여지껏 도메인 이벤트 없이 살아 왔는지 의아 해질 것이다. 언제 그리고 왜 도메인 이벤
도메인 주도 설계 구현-서비스
도메인 주도 설계 구현 서비스(Service) 도메인 내에서 서비스란 도메인 고유의 작업을 수행하는 무상태의 오퍼레이션이다. 도메인 모델에서 서비스를 생성할 필요가 있음을 알리는 가장 정확한 지표는 에그리게잇이나 값 객체 상에 수행해야 하는 오퍼레이션이 메소드로는 부적절하게 느껴질때이다. DDD를 사용하면 이런 전술의 코
도메인 주도 설계 구현-값 객체(3)
도메인 주도 설계 구현 값 객체(Value Objects) 값 객체의 저장 데이터 모델 누수의 부정적 영향을 거부하라. 값 객체를 데이터 저장소로 저장하는 대부분의 경우는 비정규화된 방식으로 저장된다. 즉 해당 특성은 부모 엔터티 객체와 같은 데이터 베이스 테이블 행에 저장된다. 이는 데이터베이스에서 값을 가지고 오는 과
도메인 주도 설계 구현-값 객체(2)
도메인 주도 설계 구현 값 객체(Value Objects) 미니멀리즘으로 통합하기 값 객체를 사용해 유입되는 업스트림 컨텍스트로부터 다운스트림 컨텍스트의 개념을 모델링하자 불변값을 결과로 사용한다면 책임을 덜 수 있다. 값으로 표현되는 표준 타입 여러 시스템과 애플리케이션에선 표준타입이 필요하다. 표준 타입은 대상의 타입
도메인 주도 설계 구현-값 객체(1)
도메인 주도 설계 구현 값 객체(Value Objects) 종종 엔터티에 관한 고민의 그늘에 가려지긴 하지만 값 객체란 DDD의 필수적인 구성 요소이다. 가능한 위치 에서 엔터티 대신 값 객체를 사용해 모델링하도록 노력해야 한다 심지어 도메인 개념이 엔터티로 모델링돼야 할때도 엔터티의 설계는 자식 엔터티의 컨테이너보다는
도메인 주도 설계 구현-엔터티(4)
도메인 주도 설계 구현 엔터티(entity) 엔터티의 발견과 그들의 내부적인 특징 유효성 검사 모델 내의 유효성 검사를 사용하는 주 이유는 하나의 특성/속성, 전체 객체, 객체의 컴포지션 등의 정확성을 확인하기 위해서다 우리는 하나 이상의 단계로 이뤄진 유효성 검사를 통해 가능한 모든 문제를 다뤄야 한다. 특성/속성의 유
도메인 주도 설계 구현-엔터티(3)
도메인 주도 설계 구현 엔터티(entity) 엔터티의 발견과 그들의 내부적인 특징 분명하게 구분된 바운디드 컨텍스트의 유비쿼터스 언어는 도메인 모델의 설계에 필요한 개념과 용어를 제공한다. 엔터티와 속성을 알아내기 팀은 기술적이고 전술적인 모델링의 늪에 빠지길 원치 않는다 토론을 계속한 후에 팀은 단어를 만들어내여 요구사
도메인 주도 설계 구현-엔터티(2)
도메인 주도 설계 구현 엔터티(entity) 고유 식별자 사용자가 식별자를 제공한다. 사용자가 직접 고유 식별자의 세부사항을 입력할때 몇가지 문제점이 있다. 양질의 식별자를 생성하는 일을 사용자에게 의지한다는 점 애플리케이션이 식별자를 생성한다. 고유식별자를 생성하는 식별자 생성패턴 고유 식별자 (UUID) 전역 고유 식
데이터 베이스 아웃터 조인시 실수
데이터 베이스 아웃터 조인시 실수 위처럼 아웃터 조인을 실행을 시키면서 실행계획을 보면 아래 처럼 나온다. 위처럼 아우터 걸리는 테이블에 조건이 where 절에 걸리게 되면 해당 조인은 inner join으로 실행 된다. 아웃터를 걸고 싶으면 아래처럼 조건을 on 절에 포함 시켜야 된다 제대로 아웃터 조인이 걸리게 된다.
도메인 주도 설계 구현-엔터티(1)
도메인 주도 설계 구현 엔터티(entity) 개발자는 도메인 보다 데이터에 초점을 맞추는 경향이 있다. 소프트웨어 개발에 관한 대부분의 접근법이 데이터베이스에 중점을 두기 때문에 DDD를 처음 접하는 사람에게 일어날 수 있는 현상이다. 풍부한 행동을 바탕으로 도메인 개념을 설계 하지 않고 주로 데이터의 속성과 연결을 먼저
도메인 주도 설계 구현-아키텍쳐(5)
도메인 주도 설계 구현 아키텍처 이벤트 주도 아키텍처 장기 실행 프로세스 실행자와 추적자? 일부 사람들은 실행자(executive)와 추적자(tracker)를 하나의 객체(애그리게잇)의 개념으로 합치는 편이 가장 간단한 접근법이라는 점을 발견했다. 장기 실행 프로세스는 종종 분산 병렬 처리와 관련이 있을 수 있지만, 분산
도메인 주도 설계 구현-아키텍쳐(4)
도메인 주도 설계 구현 아키텍처 커맨드 퀴리 책임 분리(CQRS) 버트랜드 마이어에 의해 고안된 이원리는 다음과 같은 내용을 따르고 있다. 객체 수준에서 이는 다음을 의미 한다. 1. 메소드가 객체의 상태를 수정한다면, 이 메소드는 커맨드이며 값을 반환하면 안된다. 2. 메소드가 값을 반환한다면 이 메소드는 쿼리이며 직접
도메인 주도 설계 구현-아키텍쳐(3)
도메인 주도 설계 구현 아키텍처 REST : 표현 상태 전송 REST는 웹의 아키텍처가 형성된 이후 웹 아키텍처 자체를 기반으로둔 추론을 바탕으로 얻어진 이론적 결과이다. RESTful HTTP 서버의 주요 특징 리소스가 핵심개념이다. 자술적 메시지를 사용해 무상태로 의사소통한다 일부 HTTP 메소드는 멱등한데 이는 오류
도메인 주도 설계 구현-아키텍쳐(2)
도메인 주도 설계 구현 아키텍처 의존성 역행 원리 의존성이 영향을 주는 방식을 조정함으로써 전통적인 계층 아키텍처를 개선하는 방법이 하나 있다. 로버트 C 마틴에 의해 제안되었다. 상위 수준의 모듈은 하위 수준 모듈에 의존해선 안된다. 둘 모두 반드시 추상화에 의존해야 한다. 헥사고날 또는 포트와 어댑터 앨리스테이 콕빈은
인텔리제이에서 특정 파일이 열리지 않음
인텔리제이에서 특정 파일이 열리지 않음 갑자기 인텔리제이에서 특정 파일 하나만 열리지 않고 아래 처럼 아이콘이 바뀌면 shift 키를 두번 누른후 file type 으로 검색하면 아래의 associate file type 메뉴를 볼수 있다. 여기서 해당 파일에 맞는 에디터를 선택해주면 된다. shift 키를 두번이 편하지
도메인 주도 설계 구현-아키텍쳐(1)
도메인 주도 설계 구현 아키텍처 DDD의 가장 큰 장점 중 하나는 특정 아키텍처의 사용을 요구하지 않는다는 점이다. 핵심 도메인이 바운디드 컨텍스트의 중심에 머무르기 때문에 하나 이상의 아키텍처적 영향력이 전체 애플리케이션이나 전체 시스템에 영향을 미칠 수 있도록 해준다. 사용중인 모든 아키텍처의 영향을 정당화하고 정당화
G1 Garbage Collector 시작하기
G1 Garbage Collector 시작하기 개요 JAVA 7 업데이트 9 이상 JDK가 필요함 자바 기술과 JVM 자바 가상 머신 JVM (Java Virtual Machine)은 추상 컴퓨팅 시스템입니다. JVM은 실행되도록 작성된 프로그램에 대한 기계처럼 보이는 프로그램입니다. 이런 식으로 Java 프로그램은 동일
도메인 주도 설계 구현-컨텍스트 맵(2)
도메인 주도 설계 구현 컨텍스트 맵 컨텍스트 맵이 필수적인 이유 세가지 컨텍스트를 매핑하기 모델의 경우엔 반갑지 않은 방문자 때문에 일반적으로 혼란과 버그를 발생시킨다. 모델러라면 따뜻하게 환영하지만, 질서와 조화를 존중한다는 조건을 지킬 때만 그렇다. 경계에 진입하는 모든 개념은 자신이 갖고 있는 권리를 설명 해야 하며
도메인 주도 설계 구현-컨텍스트 맵(1)
도메인 주도 설계 구현 컨텍스트 맵 둘 이상의 기존 바운디드 컨텍스트들 사이의 매핑을 보여주는 단순한 다이어그램을 그리는 방법이다. 컨텍스트 맵이 필수적인 이유 DDD를 위한 노력을 처음 시작할때 현재 프로젝트 상황의 시각적 컨텍스트 맵을 먼저 그리자 컨텍스트 맵은 상호 교류해야 할 시스템의 목록 뿐 아니라 팀 내부의 의
도메인 주도 설계 구현-도메인, 서브도메인, 바운디드 컨텍스트(4)
도메인 주도 설계 구현 도메인, 서브도메인, 바운디드 컨텍스트 샘플 컨텍스트 모델을 안정적으로 만들수 있는 임시 개선 방안 모델을 책임 계층으로 리팩토링해 보안과 권한 기능을 현존하는 모델 아래의 논리적 계층으로 내려서 구분할 수 있다. 또 다른 대안으로, 분리된 핵심에 맞춰 작업할 수도 있다. 참조
도메인 주도 설계 구현-도메인, 서브도메인, 바운디드 컨텍스트(3)
도메인 주도 설계 구현 도메인, 서브도메인, 바운디드 컨텍스트 바운디드 컨텍스트 이해하기 바운디드 컨텍스트는 그 안에 도메인 모델이 존재하는 명시적인 경계 명시적으로 다른 두 모델 내부에선 같거나 비슷한 이름의 객체임에도 서로 다른의미를 갖는 경우가 종종 있다. 두 모델을 명시적인 경계로 둘러싸면 각 컨텍스트 안의 각 개
원도우 자바 로그 파일 깨짐
원도우 자바 로그 파일 깨짐 OS 마다 기본 문자열 셋트가 틀리므로 아래의 JVM 옵션으로 통일시킬수 있다. 위처럼 실행 옵션에도 UTF 8을 넣고 위처럼 로그백에도 charset을 지정하면 된다. 참조
도메인 주도 설계 구현-도메인, 서브도메인, 바운디드 컨텍스트(2)
도메인 주도 설계 구현 도메인, 서브도메인, 바운디드 컨텍스트 왜 전략적 설계가 엄청나게 필수적인가 팀은 반듯이 비즈니스 도메인과 그에 따른 서브도메인은 물론 이고 그들이 개발하고 있는 바운디드 컨텍스을 이해하고 있어야 된다. 현실의 도메인과 서브도메인 도메인은 문제점 공간과 해결책 공간을 모두 갖고 있다. 문제점 공간은
도메인 주도 설계 구현-도메인, 서브도메인, 바운디드 컨텍스트(1)
도메인 주도 설계 구현 도메인, 서브도메인, 바운디드 컨텍스트 큰그림 넓은 의미에서 도메인이란 한 조직이 행하는 일과 그 조직 안의 세계를 일컫는다. 조직이 무엇을 어떻게 하는지에 관한 모든 것을 하나의 도메인 모델에 포함해선 안된다 거의 모든 소프트웨어 도메인에는 다수의 서브 도메인이 있다. 서브도메인과 바운디드 컨텍스
인텔리제이에서 JPA: Cannot resolve Table 표시하지 않기
인텔리제이에서 JPA: Cannot resolve Table 표시하지 않기 위처럼 인텔리제이에서 JPA를 쓸때 에러처럼 표시를 하는데 그에 대한 해결방법이 2가지가 있다 첫번째 방법: 코드스타일에서 벨리데이션 하는 부분을 언체크를 한다. 위에 이미지처럼 해당 부분을 언체크 한다 두번째 방법: 데이터 베이스를 연결한다. 위
도메인 주도 설계 구현-DDD를 시작하며(4)
도메인 주도 설계 구현 DDD를 시작하며 DDD 적용 난관 일반적인 문제점 유비쿼터스 언어를 만드는 데 드는 시간과 노력을 계산하는 것 도메인 전문가를 시작부터 참여시키고 프로젝트 내내 함께하는것 도메인 내의 해결책에 관한 개발자의 사고방식을 바꾸는것 DDD를 할때는 도메인 전문가의 참여가 필수이다. 많은 개발자가 DDD
도메인 주도 설계 구현-DDD를 시작하며(3)
도메인 주도 설계 구현 DDD를 시작하며 DDD는 어떻게 하는가 유비쿼터스 언어 : 팀내에 공유된 언어 도메인 전문가와 개발자간에 같이 공유된다. 메소드 명에도 고민을 해서 이름을 정함 해당 부분을 유비쿼터스 언어로 사용하여 코딩 문서도 시간이지나면 수정되지 않는다 코드상의 모델이 가장 지속적이고 유일하게 보장 되는 유비
도메인 주도 설계 구현-DDD를 시작하며(2)
도메인 주도 설계 구현 DDD를 시작하며 DDD가 해줄수 있는 일 DDD는 도메인 전문가와 소프트웨어 개발자가 비즈니스 전문가의 심적 모델을 반영한 소프트웨어를 함께 개발할 수 있게 해준다. 이팀은 도메인 전문가와 소프트웨어 개발자를 모두 포함하고 절대로 우리와 그들을 나누지 않는다. DDD는 비즈니스의 전략적 이니셔티브
도메인 주도 설계 구현-DDD를 시작하며(1)
도메인 주도 설계 구현 DDD를 시작하며 도메인 주도 설계라고 불리는 소프트웨어 개발 접근법은 우리가 높은 품질의 소프트웨어 모델을 설계 할수 있도록 해준다. DDD는 전략적인 동시에 전술적인 모델링 도구로서 중요한 비즈니스 목적을 달성시킬 수 있는 양질의 소프트웨어를 설계 할수 있게 해준다. 도메인 전문가는 단순한 직책
SQL Server Management Studio isolation level 바꾸기
SQL Server Management Studio isolation level 바꾸기 위에 메뉴에서 옵션을 클릭후 SQL Server 고급 메뉴에 보면 수정할수 있습니다 한가지 기본이 READ COMMITTED 인데 아래에 옵션에 보면 SET LOCK TIMEOUT 옵션이 1이라서 해당 정보를 select 하더라도 대기
MediaType.APPLICATION_JSON_UTF8 Deprecated
MediaType.APPLICATION JSON UTF8 Deprecated MediaType APPLICATION JSON UTF8 이 위처럼 Deprecated 되었다 기본적으로 스프링에서 mockMvc를 사용할때는 UTF8설정 없이도 한글이 깨지진 않았다 테스트 코드에서 다른 부분에서 한글이 문제가 되는것이 아니라
HttpMessageNotReadableException 에러
HttpMessageNotReadableException 에러 먼저 아래의 에러가 나는 이유는 request를 2번 읽어서 처리 할려고 해서 나는 에러 이다. 위에 에러는 톰켓의 아래의 코드를 보면 이해 할수 있다. 코드를 보면 inputStream 이나 reader 는 두 번 읽어서 처리 할수 없게 되어 있습니다. 하지
AMQP 0-9-1 모델 설명
AMQP 0 9 1 모델 설명 AMQP 0 9 1은 무엇입니까? AMQP 0 9 1 (고급 메시지 큐 프로토콜)은 적합한 클라이언트 응용 프로그램이 적합한 메시징 미들웨어 브로커와 통신 할 수 있도록하는 메시징 프로토콜입니다. 브로커과 그들의 역할 메시징 브로커는 게시자 ( 게시자 라고도하는 게시 된 응용 프로그램) 로부
SET NOCOUNT ON
SET NOCOUNT ON SET NOCOUNT OFF 가 기본설정이가 해당 설정이 되어 있으면 아래처럼 프로시저의 응답에서 응답된 행 count를 보여준다. 간단한 테스트 프로시저를 하나 만들어 보면 위에 프로시저를 생성후 테스트를 하면 영향 받은 행수를 반환하지만 SET NOCOUNT ON 설정을 하면 메시지가 com
mssql like [
mssql like brackets([) mssql 에서 like 검색을 하는데 키워드가 [안녕]하하하 위와같이 대괄호가 있다 해당 대괄호는 조회가 되지 않았다. 찾아 보니 와일드 카드로 % , , [] , [^] 4개가 존재하고 있었다. 괄호 검색을 위해선 앞 괄호를 이런식으로 표현을 해야 된다. [[] 위 키워드에 적
JEP 361: Switch Expressions (Standard)
Switch Expressions (Standard) Summary 확장 switch하여 명령문 또는 표현식으로 사용할 수 있도록하여 두 형식 모두 기존 case ... :레이블 (전파 포함) 또는 새 case ... 레이블 (전파 없음)을 사용하고, switch표현 새 레이블을 사용하여 값을 산출합니다. 이러한 swit
rabbitmq 커넥션 에러
rabbitmq 커넥션 에러 rabbitmq 에는 기본사용자인 guest가 있는데 해당 사용자는 localhost에서만 연결할수 있도록 연결제한이 걸려 있습니다. 위 처럼 코드를 실행시키면 아래의 에러가 난다 guest가 아닌 계정을 생성후에 factory에 넣어주면 정상적으로 실행이 된다. 사용자 계정 생성 위처럼 명령
스프링을 활용한 쿼리와 명령간에 데이터 동기화
스프링을 활용한 쿼리와 명령간에 데이터 동기화 CQRS 란 무엇입니까? 이 패턴은 시스템을 서로 다른 두 부분으로 나눕니다. CQRS는 쓰기 (실행 명령)에 사용되는 구성 요소와 조회 구성 요소를 분리합니다. 따라서 명령 서비스 와 쿼리 서비스 는 분리되어 있으며 별도로 운영 할 수 있습니다. CQS로 시작합시다 (나중에
회계야학 4기
회계야학 4기 자산 거래란 무엇인가? 재산이란 무엇인가? 거래와 재산을 구성하는 5가지 원소중 하나 자산이란? 과거의 거래의 결과로 현재에 가지고 있는 미래의 경제적 효익을 주는 권리 돈 돈으로 바꿀 수 있는 것 돈을 벌 수 있는 것 라는 사이트는 한국에서 자산이 150억 이상 기업은 무조건 등록해야 함 해당 사이트에서
인텔리제이 High Contrast Theme 에서 Code Vision 이 보이지 않을때 해결 방법
인텔리제이 High Contrast Theme 에서 Code Vision 이 보이지 않을때 해결 방법 인텔리제이 2020.1 버전에 코드에 관한 추가 정보 얻으면서 코드에 쉽게 집중할 수 있는 Code Vision이 처음으로 구현되었습니다. 해당 기능을 할성화 시키려면 아래 처럼 설정 화면으로 진입후에 Preference
fortiClient VPN 시작 프로그램에서 제거 하기
fortiClient VPN 시작 프로그램에서 제거 하기 위에 폴더에 접속하면 아래의 파일들이 존재 한다. 해당 파일을 열어서 RunAtLoad 에 <true/ 를 <false/ 로 수정해주면 시작되지 않는다. 참조
스프링 부트에서 GET 메소드로 LocalDate, LocalDateTime 받기
스프링 부트에서 GET 메소드로 LocalDate, LocalDateTime 받기 위에 코드를 실행시키니 아래의 에러가 나옴 위에 프로퍼티를 추가해서 사용가능하게 처리 할려고 함 하지만 안됨 내가 사용하고 있는 버전은 2.0.1 버전으로 코드를 확인 해봄 org.springframework.boot.autoconfigur
JEP 360: Sealed Types (Preview)
Sealed Types (Preview) Summary Sealed Types 으로 Java 프로그래밍 언어를 향상 시키십시오. Sealed Types은 다른 클래스 또는 인터페이스가이를 확장하거나 구현할 수있는 제한을 부과하는 클래스 또는 인터페이스입니다. Motivation Java의 유형 시스템을 사용하면 "원은 일
JEP 359: Records (Preview)
Records (Preview) Summary 레코드 로 Java 프로그래밍 언어를 향상 시키십시오 . 레코드는 얕은 불변의 데이터를위한 투명한 홀더 인 클래스를 선언하기위한 간단한 구문을 제공합니다. 이것은 JDK 14 의 미리보기 언어 기능 입니다. Motivation and Goals "자바가 너무 장황하다"또는 "
JEP 353: Reimplement the Legacy Socket API
Reimplement the Legacy Socket API Summary java.net.Socketand java.net.ServerSocketAPI에서 사용하는 기본 구현 을 유지 관리 및 디버그하기 쉬운 더 단순하고 현대적인 구현으로 바꿉니다. 새로운 구현은 현재 Project Loom 에서 탐색중인 사용자 모드
JEP 355: Text Blocks (Preview)
JEP 355: Text Blocks (Preview) Summary Java 언어에 텍스트 블록 을 추가하십시오 . 텍스트 블록은 대부분의 이스케이프 시퀀스가 필요하지 않고 예측 가능한 방식으로 문자열의 형식을 자동으로 지정하며 개발자가 원하는 경우 형식을 제어 할 수있는 여러 줄 문자열 리터럴입니다. 이것은 JDK 1
Class Data Sharing
Class Data Sharing 간단한 java 파일로 테스트 위 명령어를 쓰면 아래의 classlist 파일(기본 클래스 목록) 과 classes.jsa 아카이브가 생성이 된다. 아카이브가 생성 되 있지 않으면 Xshare:on 옵션으로 실행하면 종료가 된다 오류 메시지 아카이브를 다시만들면 실행 Xlog:class+
JEP 354: Switch Expressions (Preview)
JEP 354: Switch Expressions (Preview) Summary s확장 switch하여 명령문 또는 표현식으로 사용할 수 있도록하여 두 형식 모두 기존 case ... :레이블 (전파 포함) 또는 새 case ... 레이블 (전파 없음)을 사용하고, 새 레이블을 사용하여 값을 산출합니다. switch표현
JEP 325: Switch Expressions (Preview)
JEP 325: Switch Expressions (Preview) Summary switch명령문을 명령문 또는 표현식으로 사용할 수 있도록 확장하고 두 양식 모두 "전통적인"또는 "단순화 된" 범위 지정 및 제어 플로우 동작을 사용할 수 있도록 명령문을 확장하십시오. 이러한 패턴 매칭 (JEP 305) 에서 switc
톰캣 리모트 디버깅 설정하기
톰캣 리모트 디버깅 설정하기 jpda(Java Platform Debugger Architecture)를 지원 하기 때문에 아래의 파라미터를 추가해서 해당 포트로 리모트 디버거를 실행 시킬수 있다. windows unix 위처럼 파라미터를 추가해도 된다. 참조
자바트러블슈팅-리눅스 진단하기(2)
왜 CPU를 모니터링 해야 하나 CPU가 병목이 가장 많이 발생하는 부분이다. 일반적인 자바 기반의 시스템의 CPU 사용량 User:System 비율은 10:1 8:1 정도 이다. 상세한 분석이 필요할때 mpstat를 사용하면 많은 도움이 된다. 전반적인 상황 모니터링 하기 vmstat를 사용하면 전반적으로 모니터링 할수
자바 개발자를 위한 C#
c 속성강의 정준석 지금은 폴리그랏 시대이다. 여러가지 언어를 습득함으로써 얻는것이 많다. namespace 자바의 패키지 개념 using 자바의 import 개념 (자동 자원 해제 기능 try with resources) Dictionary 자바의 hashmap SqlConnection 데이터베이스에 접근 SqlComm
자바트러블슈팅-리눅스 진단하기(1)
60,000 밀리초에 리눅스 시스템 분석하기 uptime uptime은 원래 서버가 시작한지 얼마나 되는지 확인하기 위한 명령이다. 근데 가장먼저 이 명령어를 실행하는 이유는 load average 때문이다. load average는 앞에서 부터 1분 5분 15분간의 평균값이다. 이값은 0에 가까우면 좋고, 클수록 좋지
thread_troubleshooting_arthas
layout: post title: "자바트러블슈팅 자바 종합 분석 도구 arthas" date: 2020 02 11 14:08 +0900 comments: true tags : ["자바트러블슈팅","자바 종합 분석 도구 arthas","arthas"] categories : ["books"] sitemap : chang
Pattern Matching for java
Pattern Matching for Java 이 문서는 Java 언어에서 패턴 일치 를 지원하기위한 가능한 방향을 탐구합니다. 이 문서는 설명 용 문서 일 뿐이며 특정 버전의 Java 언어에서 특정 기능에 대한 계획을 구성하지는 않습니다. 이 문서는 또한 탐색중인 다른 기능을 참조 할 수도 있습니다. 이는 순전히 설명을
자바트러블슈팅-메모리 진단하기(4)
메모리 진단하기 메모리 문제 시스템이 느리다고 항상 메모리 단면을 사용하는 것은 아니다. 먼저 스레드가 원인일지 모르니 스레드로 원인 분석을 먼저해보는것이 좋다. 메모리 문제로 인하여 응답시간이 느려질때는 원인 메모르 크기를 잡지 않거나 너무 작게 잡아 GC가 너무 자주 발생하는 경우 임시 메모리를 많이 사용하여 GC가
자바트러블슈팅-메모리 진단하기(3)
메모리 진단하기 잘라놓은 메모리 단면 분석하기 메모리 단면을 분석하는 도구 MAT IBM Heap Analyzer 위에 명령어로 덤프를 떠서 확인을 해볼수 있다 Leak Suspects Report Leak Suspects Report 를 선택해서 확인해보면 간단하게 가장 많은 메모리를 점유하고 있는 객체가 어떤부분인지
자바트러블슈팅-메모리 진단하기(2)
메모리 진단하기 메모리 단면은 언제 자르나? 힙 덤프는 메모리가 부족해지는 현상이 지속해서 발생할 때와 OutOfMemoryError가 발생했을 때 생성해야 한다. 이러한 메모리 문제가 아닌 다른 상황에서는 메모리 단면을 잘라 놓을 필요가 없다는 말이다. 메모리가 부족해지는 현상을 확인하는 방법 jstat로 확인 WAS의
자바트러블슈팅-메모리 진단하기(1)
메모리 진단하기 메모리 때문에 발생할 수 있는 문제 OutOfMemoryError가 발생하는 경우 가비지 컬렉터가 새로운 객체를 생성할 공간을 더 이상 만들어주지 못하고, 더이상 힙 영역의 메모리가 증가될 수 없을때 네이티브 라이브러리 코드에서 스왑 영역이 부족하여 더 이상 네이티브할당을 할수 없을때 두번째 경우는 순수
자바트러블슈팅-스레드 진단하기(5)
스레드 진단하기 스레드 문제 스레드 단면으로 어떤 문제를 확인할 수 있을까? 시스템이 죽는 경우는 스레드 단면으로 확인 할수 없는데 XX:OnError=string 명령 행 옵션을 사용하여 지정 여기서 string 은 단일 명령이거나 세미콜론으로 구분 된 명령 목록 예) java XX:OnError="gcore %p; d
자바트러블슈팅-스레드 진단하기(4)
스레드 진단하기 잘라 놓은 스레드 단면 분석하기 은 스레드 분석용으로 매우 강력한 기능을 제공하면서 전혀 복잡하지 않다. threadlogic의 특징은 여러 스레드 단면을 동시에 분석 할 수 있다. 잠김 현상이 발생한 스레드를 매우 쉽게 추적할수 있다. 오랫동안 수행되는 스레드가 있을 때 매우 쉽게 찾을수 있다. thre
자바트러블슈팅-스레드 진단하기(3)
스레드 진단하기 스레드 단면 잘라 놓기 스레드 단면을 분석하면 매우 빨리 원인을 찾을수 있다. 모든 시스템이 응답이 없을 때(시스템에 행이 걸렸을 경우) 사용자 수가 많지도 않은데, 시스템 cpu 사용량이 떨어지지 않을때 특정 애플리케이션을 수행했는데 전혀 응답이 없을때 기타 여러 가지 상황에서 시스템이 내 마음대로 작동
자바트러블슈팅-스레드 진단하기(2)
스레드 진단하기 록 경합을 피하는 10+1가지 방법 코드가 아닌 데이터를 보호 하라. 가장 간단하고 빠른 방법은 전체 함수 호출에 synchronized를 거는 것이다. 하지만 데이터 만 synchronized 블록으로 감싼다면 중요한 코드를 잠그는데 드는 시간을 줄일수 있을 것이다. 록 사용 부분에서는 비싼 계산을 하지
자바트러블슈팅-스레드 진단하기(1)
스레드 진단하기 스레드에서 발생하는 문제 중 가장 대표적인것 레이스 컨디션(race condition) 멀티 스레드 환경에서 하나이상의 공유데이터를 처리 할때 아무런 록처리를 하지 않을 경우 동시에 여러 스레드에서 데이터를 수정할수있다. 이런 상황에서 데이터가 꼬여서 무한대기하거나 무한 루프에 빠질수 있는데 이런 상황을
켄트백의 구현패턴-발전하는 프레임워크(2)
발전하는 프레임워크 호환성을 유지하는 업그레이드 객체 추상화 구현 스타일을 사용하려면 추상화된 개념은 인터페이스로 전달해야 하는지 상위클래스로 전달해야하는지 결정해야한다. 인터페이스 인터페이스를 클라이언트에게 제공할때의 이점은 세부사항을 가급적 적게 드러낸다는 것이다. 단점은 인터페이스가 수정이 되면 구현하지 않는 경우
켄트백의 구현패턴-발전하는 프레임워크(1)
발전하는 프레임워크 코드를 이해하고 커뮤니케이션하는 데 드는 비용에 비해 코드를 수정에 드는 비용이 훨씬 저렴하다고 가정했다. 애플리케이션 수정 없이 프레임워크 수정하기 프레임워크를 지속적으로 발전시켜야 하지만 기존 클라이언트 코드는 계속해서 동작하도록 해야한다는것 프레임워크 개발의 경제성을 향상시키려면 호환성이 유지되지
켄트백의 구현패턴-컬렉션(2)
컬렉션 구현 구현 클래스를 구현을 선택할때 요소 성능 컬렉션의 크기 Collection Collection 인터페이스에 기본 구현 클래스는 ArrayList 이다. ArrayList의 성능상 문제가 될만한 부분은 contains와 이 메소드를 이용하는 다른 메소드들이 있다. 성능이 문제가 된다면 HashSet으로 바꾸는것
켄트백의 구현패턴-컬렉션(1)
컬렉션 컬렉션의 개념은 여러가지 메타포를 혼합한 것이다. 과거 컬렉션과 유사한 행위는 자료구조 자체에 링크를 넣는 방식으로 구현 컬렉션은 프로그래밍에 있어 가장 근본적인 변형인 몇 개의 데이터를 사용하느냐를 표현한다는 점에서 중요하다. 로직의 변경은 조건문이나 다형성 메시지를 통해 표현할수 있다. 하지만 데이터 갯수의 변
켄트백의 구현패턴-메소드(4)
메소드 컬렉션 접근자 메소드 컬렉션에 대한 접근을 어떻게 제공할꺼냐? 간단한 방법은 getter 메소드를 제공해주는것인데 반환 하기전에 수정할수 없는 컬렉션으로 반환 하는것이다. 만약 하나씩 접근한다면 순차열람자를 반환하는 메소드를 제공해라 불린 설정 메소드 불린 살태를 설정하는 가장 좋은 프로토콜은 설정 메소드를 사용하
켄트백의 구현패턴-메소드(3)
메소드 오버라이드 오버라이드를 사용하면 변형 메소드를 명확하게 표현할 수 있다 상위 클래스에서 메소드를 abstract로 선언 했다면 이는 하위클래스에서 연산을 특화하라는 뜻이다. super.method() 이런식에 호출을 해서 사용할수있지만 하위 클래스의 같은 이름에 메소드에서만 사용하는 것이 좋다. 제어의 흐름을 재구
켄트백의 구현패턴-메소드(2)
메소드 조합 메소드 추상화 수준이 비슷한 메소드 호출로 하나의 메소드를 구성 읽기좋은 메소드의 길이 5 15줄을 넘어가면 안된다고 한다. 전체 구조를 읽을때는 긴메소드가 좋다 하지만 세부사항을 이해하려할때 긴메소드는 방해가 된다. 메소드의 크기를 결정하는 다른 요소는 특화 이다. 적당한 크기의 메소드면 메소드를 하위로 복
켄트백의 구현패턴-메소드(1)
메소드 로직은 하나의 덩어리가 아닌 여러 개의 메소드로 구성된다. 개념적으로 임의의 프로그램은 복잡한 제어 흐름이 들어 있는 커다란 루틴이라 볼수 있다. 가장 큰 문제는 코드를 읽기 어렵다는 것이다. 거대한 루틴으로 작성하면 코드 재사용이 어렵다. 프로그래밍 도중에 같은 기능을 구현하는 쪽을 분리하는 것도 어렵다. 프로그
켄트백의 구현패턴-행위
행위 행위를 표현하는 패턴 제어흐름 연산의 여러 단계로 나타낸다. 주요흐름 주요제어 흐름을 명확하게 표현 메시지 메시지를 보내서 제어 흐름을 표현 선택 메시지 여러 선택 사항을 나타내기 위해 메시지 구현자를 다양화 더블 디스패치 두가지 축으로 메시지 구현자를 다양화해서 중첩된 선택을 표현 분리 메시지 복잡한 연산은 밀접한
켄트백의 구현패턴-상태(2)
상태 지역 변수 지역 변수는 사용되기 직전에 가급적 최소 범위내에서 선언하라. 지역변수의 역할 컬렉터 이후 사용을 위한 정보를 모은다. 카운터 특정 객체의 수를 저장하는 특수 컬렉터 설명 복잡한 표현을 해야 하는 경우, 표현 내용을 지역 변수에 저장하면 독자가 좀더 쉽게 이해 재사용 값이 바뀌지만 기존 값을 다시 사용해야
켄트백의 구현패턴-상태(1)
상태 객체는 외부에 드러나는 행위와 행위를 지원하기 위한 상태를 묶어주는 편리한 단위다. 상태 시간에 따라 변화하는 값을 사용하여 연산 접근 상태에 대한 접근을 제한해서 유연성을 조절 직접 접근 객체 내의 상태를 직접 접근 간접 접근 좀더나은 유연성을 위해 메소드를 통해 상태에 접근 공용 상태 클래스의 모든 인스턴스에 적
켄트백의 구현패턴-클래스(2)
클래스 하위클래스 이 객체는 상위클래스와 같다. 이 부분만 제외 하면... 라고 말하는거와 같다. 하위 클래스의 문제점 일단 사용하면 되돌리기 어렵다. 하위 클래스를 이해하기 위해서 상위 클래스를 이해해야 한다. 하위 클래스가 상위 클래스 세부 구현 특성에 의존할 수 있으므로 상위클래스의 수정이 위험해진다. 클래스 상속
켄트백의 구현패턴-클래스(1)
클래스 플라톤은 현실 세계에 존재하는 것은 클래스의 인스턴스일 뿐이라고 이야기했다. 클래스 "이 데이터들은 함께 사용되는데, 그에 관련된 로직이 이것이다." 단순한 상위클래스 이름 클래스 계층의 최상위에 위치하는 클래스 이름은 단순하게 짓는다. 한정적 하위클래스 이름 상위클래스와의 유사점과 차이점을 분명히 드러내는 이름을
켄트백의 구현패턴-동기유발
동기유발 소프트웨어 설계의 원동력은 경제성이라고 이야기 했다. 소프트웨어 개발후 개발 보다 유지보수 비용이 더들어간다는 사실을 알고 놀랐다. 유지 비용 = 이해 비용 + 수정비용 + 테스트 비용 + 설치 비용 구현 패턴은 미래 코드 확장이나 수정이 쉬운 깔끔한 코드를 추구하면서도 당장 얻을 수 있는 이득에도 초점을 맞춘다
켄트백의 구현패턴-프로그래밍 이론
프로그래밍 이론 결정사항에 영향을 미치는 많은 동력이 있다 여기선 가치와 원칙 2가지로 나눈다. 가치는 모든 프로그래밍에 적용되는 주제 원칙은 가치처럼 언제나 적용되는 것은 아니지만 항상 중요하지만 때로는 직접 적용하기 어려운 가치와 적용법은 명확하지만 조금은 지엽적인 패턴사이의 가교 역활을 하는것 결정이 애매한 사항에
켄트백의 구현패턴-패턴
패턴 프로그램을 새로 짜는 경우보다는 기존 프로그램을 읽는 경우가 많다. 프로그램에 있어 완성은 없다. 수정에 대한 공수가 더 많이 든다. 프로그램 구조는 몇가지 상태와 제어 흐름 개념으로 결정된다. 프로그램을 읽는 사람은 개념과 더불어 세부 사항까지도 이해해야 한다. 패턴은 위와 같은 공통점을 기반으로 한다. 읽기 쉽과
JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
JEP 189: Shenandoah: A Low Pause Time Garbage Collector (Experimental) Summary 실행중인 Java 스레드와 동시에 대피 작업을 수행하여 GC 일시 정지 시간을 줄이는 Shenandoah라는 새 가비지 콜렉션 (GC) 알고리즘을 추가하십시오. Shenandoah의
jmeter에서 프로시저 call 하기
jmeter에서 프로시저 call 하기 JDBC Request에서 callalble statement 를 선택하면 된다 뒤에 2개는 out 파라미터인데 위 처럼 선언하고 아래 처럼 셋팅하면 정상적으로 동작한다. 참조
jmeter를 활용한 sql 평균 실행시간 체크
jmeter를 활용한 sql 평균 실행시간 체크 CSV Data Set Config 위에 설정에서 중요한 부분을 설명하면 Variable Name: 여기서 사용할 변수명을 입력해주면 된다. 위에 csv 파일은 3가지가 있으니 pid,username,count 로 설정함 Recycle on EOF: JMeter가 파일의 끝
클린아키텍쳐-프레임워크는 세부사항이다.
프레임워크는 세부사항이다. 아무리 해도 프레임워크는 아키텍처가 될수 없다. 프레임워크 제작자는 당신이 풀어야 할 특별한 관심사를 염두에 두지 않는다. 프레임워크와의 결합은 우리가 만들어 놓은 프로그램을 프레임워크에 틀에 맞춰 버린다. 이 상황에서 모든 위험과 부담은 우리가 감수한다. 프레임워크와 결혼하지 말라. 프레임워크
클린아키텍쳐-웹은 세부사항이다.
웹은 세부사항이다. 중앙집중식과 분산방식으로 끊임 없이 움직여 왔다. GUI는 세부사항이다. 웹은 GUI이다. UI와 애플리케이션은 서로 독립적이여야 한다. 참조
RestTemplate 으로 POST 전송시에 파라미터(application/x-www-form-urlencoded)로 메시지 보내기
RestTemplate 으로 POST 전송시에 파라미터(application/x www form urlencoded)로 메시지 보내기 위에처럼 객체를 전송하면 에러가 나지만 MultiValueMap에 맵핑을 시켜서 전송하면 문제가 없다. 참조
RestTemplate에 인터셉터 설정으로 데이터 확인하기
RestTemplate에 인터셉터 설정으로 데이터 확인하기 아래 코드를 통해서 인터셉터 설정을 할수 있다. 일단 위에 클래스에서 해당 값을 찍고 위처럼 factory를 바꿔줘야함 참조
클린아키텍쳐-데이터베이스는 세부사항이다
데이터베이스는 세부사항이다. 아키텍처 관점에서 볼 때 데이터베이스는 엔티티가 아니다. 즉 데이터베이스는 세부사항이라서 아키텍처의 구성요소 수준으로 끌어 올릴수 없다. 데이터 베이스는 데이터 모델이 아니다. 데이터 베이스는 일개 소프트웨어 일 뿐이다. 관계형 데이터베이스 애드거 커드는 1970년에 관계형 데이터 베이스의 원
클린아키텍쳐-클린 임베디드 아키텍처
클린 임베디드 아키텍처 먼저 동작하게 만들어라 소프트웨어가 동작하지 않는다면 사업은 망한다. 그리고 올바르게 만들어라 코드를 리팩터링해서 당신을 포함한 나머지 사람들이 이해할 수 있게 만들고 요구가 변경되거나 요구를 더 잘 이해하게 되었을 때 코드를 개선할 수 있게 만들어라. 그리고 빠르게 만들어라 코드를 리팩터링해서 요
클린아키텍쳐-테스트 경계
테스트 경계 테스트는 시스템의 일부이며 아키텍처에도 관여한다. 시스템 컴포넌트인 테스트 테스트는 태생적으로 의존성 규칙을 따른다. 테스트는 세부적이며 구체적인것 의존성은 항상 테스트 대상이 되는 코드를 향한다. 테스트는 시스템 컴포넌트 중에서 가장 고립되어 있다. 테스트를 고려한 설계 테스트가 지닌 극단적인 고립성이 테스
클린아키텍쳐-크고 작은 모든 서비스들
크고 작은 모든 서비스들 SOA 와 MSA가 최근 큰인기를 끌고 있다. 그 이유는? 서비스를 사용하면 상호 결합이 철저하게 분리되는 것처럼 보인다.(이는 일부만 맞는 말이다.) 서비스를 사용하면 개발과 배포 독립성을 지원하는 것처럼 보인다.(이는 일부만 맞는 말이다.) SOA 아키텍처 관점에서 꼭 중요하다보 볼수는 없다.
클린아키텍쳐-메인 컨포넌트
메인 컨포넌트 모든 시스템에는 최소한 하나의 컴포넌트가 존재하고 나머지 컴포넌트를 생성하고 조정하며 관리한다. 메인 컴포넌트는 궁극적인 세부사항으로 가장 낮은 수준의 정책이다. 메인은 시스템 초기 진입점이다. 운영체제를 제외하면 어떤 것도 메인에 의존하지 않는다. 의존성 주입 프레임워크를 이용해 의존성을 주입은 바로 이
클린아키텍쳐-계층과 경계
계층과 경계 시스템이 세가지 컴포넌트로(UI, 업무규칙, 데이터베이스)로만 구성된다고 생각하기 쉽다. 몇몇 단순한 시스템에서는 이 정도로 충분하다. 대다수의 시스템에서 컴포넌트의 개수는 이보다 훨씬 많다. 시스템에서 아키텍처의 경계를 발견하는 법을 차근차근 설명하고 있다. 변경의 축에서 정의되는 아키텍처 경계를 가로지르고
클린아키텍쳐-부분적 경계
부분적 경계 아키텍처 경계를 완벽하게 만드는 데는 비용이 많이 든다. 마지막 단계를 건너뛰기 부분적 경계를 생성하는 방법 하나는 독립적으로 컴파일하고 배포할 수 있는 컴포넌트를 만들기위한 작업은 모두 수행한 후, 단일 컴포넌트에 그대로 모아만 두는 것이다. 일차원 경계 완벽한 형태의 아키텍처 경계는 양방향으로 격리된 상태
nhn forward 2019
nhn forward 발표중 DDD Lite@Spring 를 들었는데 여기서 헥사고날 아키텍처형태를 이야기 했다. 해당 내용이 인상 깊었는데 찾아보니 클린아키텍쳐에서 말하는 부분과도 비슷하면서 좋았던 내용이였다. DDD를 통해서 복잡성을 줄이고 복잡도를 정복하자는 이야기 였는데 공감이 많이 되었다. 마지막 질문으로 myb
클린아키텍쳐-프레젠터와 험블객체
프레젠터와 험블객체 프레젠터는 험블 객체 패턴을 따른 형태로 아키텍처 경계를 식별하고 보호하는데 도움이 됨 험블 객체 패턴 디자인 패턴으로, 테스트하기 어려운 행위와 테스트하기 쉬운 행위를 단위 테스트 작성자가 분리하기 쉽게 하는 방법으로 고안 되었다. 프레젠터와 뷰 뷰는 험블 객체이고 테스트 하기 어렵다. 이 객체에 포
클린아키텍쳐-클린 아키텍처
클린 아키텍처 육각형 아키텍처 data context and interaction(DCI) boundary control entity(BCE) 이들 아키텍처는 세부적인 면에서는 다소 차이가 있더라도 그내용은 상당히 비슷하다. 이들의 목표는 같은데 바로 관심사의 분리이다. 이들 아키텍처는 모두 시스템이 다음과 같은 특징을
클린아키텍쳐-소리치는 아키텍처
소리치는 아키텍처 아키텍처의 테마 이바 야콥슨이 Object Oriented Software Engineering이란 책에서 소프트웨어 아키텍처도 애플리케이션 유스케이스에 대해 소리처야 한다라고 말한다. 아키텍처를 프레임워크 중심으로 만들어버리면 유스케이스가 중심이 되는 아키텍처는 절대 나올수 없다. 아키텍처의 목적 좋은
클린아키텍쳐-업무규칙
업무규칙 업무규칙은 사업적으로 수익을 얻거나 비용을 줄일 수 있는 규칙 또는 절차다. 컴퓨터상으로 구현했는지와 상관없이, 업무규칙은 사업적으로 수익을 얻거나 비용을 줄일 수 있어야 한다. 핵심 규칙과 핵심 데이터는 본질적으로 결합되어 있기 때문에 객체로 만들 좋은 후보가 된다. 우리는 이러한 유형의 객체를 엔티티라고 한다
클린아키텍쳐-정책과수준
정책과수준 소프트웨어 시스템이란 정책을 기술한것 동일한 이유로 동일한 시점에 변경되는 정책은 동일한 수준에 위치하며, 동일한 컴포넌트에 속해야 한다. 수준 수준을 엄밀하게 정의하자면 입력과 출력까지의 거리이다. 시스템의 임력과 출력 모두로부터 멀리 위치할수록 정책의 수준은 높아진다. 입력과 출력을 다루는 정책이라면 시스템
클린아키텍쳐-경계 해부학
경계 해부학 경계 횡단하기 런타임에 경계를 횡단한다. 적절한 위치에서 경계를 횡단하게 하는 비결은 소스코드 의존성 관리에 있다. 두려운 단일체 아키텍처 경계 중에서 가장 단순하며 가장 흔한 형태는 물리적으로 엄격하게 구분되지 않는 형태다. 이 형태에선 함수와 데이터가 단일 프로세서에서 같은 주소 공간을 공유하며 그저 나름
클린아키텍쳐-선긋기
선긋기(Boundaries) 소프트웨어 아키텍처는 선을 긋는 기술이며 이 선을 경계라 부른다. 관련이 있는 것과 없는 것 사이에 선을 긋는다. 경계는 변경의 축이 있는 지점에 그어진다. GUI와 업무 규칙과는 다른 시점에 다른 속도로 변경되므로 둘사이엔 반드시 경계가 필요하다. 단일 책임 원칙은 어디에 경계를 그어야 할지
클린아키텍쳐-독립성
독립성 좋은 아키텍처는 다음을 지원해야 된다. 시스템의 유즈케이스 시스템의 운영 시스템의 개발 시스템의 배포 유즈케이스 시스템의 아키텍처는 시스템의 의도를 지원해야 한다는 뜻이다. 운영 운영 관점에서는 덜 실질적이며 덜 피상적인 업무를 맡는다. 개발 시스템을 설계하는 조직이라면 어ㅣ뜬지 그 조직의 의사소통 구조와 동일한
클린아키텍쳐-아키텍처란?
아키텍처란? 소프트웨어 아키텍트는 프로그래머이며, 앞으로도 계속 프로그래머로 남는다. 아키텍처의 주된 목적은 시스템 생명주기를 지원하는 것이다. 시스템의 수명과 관련된 비용은 최소화하고, 프로그래머의 생산성은 최대화하는 데 있다. 개발 팀 구조가 다르다면 아키텍처 관련 결정에서도 차이가 난다. 일례로 팀이 개발자 다섯 명
클린아키텍쳐-컴포넌트 결합도
컴포넌트 결합도 ADP: 의존성 비순환 원칙 컴포넌트 의존성 그래프에 순환이 있어서는 안된다. 숙취 증후군은 많은 개발자가 동일한 소스파일을 수정하는 환경에서 발생한다. 해결책으로 두가지 방법이 있다 주단위 빌드 의존성 비순환 원칙 주 단위 빌드 일주일에 4일동안은 서로를 신경쓰지 않다가 금요일날 변경된 코드를 통합하여
ASCIIDOCTOR-PDF 변환 한글
ASCIIDOCTOR PDF 변환 한글 spring rest docs 를 가지고 PDF로 변환하는데 한글이 깨진다. 이부분은 원래 부터 문제가 있었나보다. asciidoctor maven plugin 가지고 삽질중 플러그인 지식이 없으니 안됨 ㅜㅜ 그래서 아래링크 내용으로 작업을 진행 모두 인스톨후에 실행 변환 잘 되어서
클린아키텍쳐-컴포넌트 응집도
컴포넌트 응집도 어떤 클래스는 어떤 컴포넌트에 포함시켜야 할까? REP : 재사용/릴리스 등가 원칙 CCP : 공통 폐쇄 원칙 CRP : 공통 재사용 원칙 REP : 재사용/릴리스 등가 원칙 재사용 단위는 릴리스 단위와 같다. 메이븐, 라이닝언, RVM 같은 모듈 관리 도구가 등장한 시기 이 기간에 재사용 가능한 컴포넌트
클린아키텍쳐-컴포넌트
컴포넌트(Components) 컴포넌트는 배포 단위다. 컴포넌트는 시스템의 구성 요소로 배포할 수 있는 가장 작은 단위다. 잘설계된 컴포넌트라면 반드시 독립적으로 배포 가능한 따라서 독립적으로 개발 가능한 능력을 갖춰야 한다. 링킹 로더의 등장으로 프로그래머는 프로그램을 개별적으로 컴파일하고 로드 할수있는 단위로 분할할수
클린아키텍쳐-인터페이스 분리 원칙
의존성 역전 원칙(DIP The Dependency Inversion Principle) 의존성이 추상에만 의존하며 구체에는 의존하지 않는 시스템 비현실적인 아이디어긴 하다. 자바 String은 구체 클래스이다. 이것을 추상클래스로 만들려는 시도는 없다 String은 매우 안정적이기 때문에 String 클래스가 변경되는일
클린아키텍쳐-인터페이스 분리 원칙
인터페이스 분리 원칙(ISP The Interface Segregation Principle) 언어와 ISP 정적 타입 언어 사용자가 import, use, include을 사용하도록 강제한다. 이렇게 소스 코드에 선언된 선언문으로 인해 소스코드 의존성이 발생한다.(자바는 약깐 틀리다.) 루비나 파이썬 같은 동적 타입언어
클린아키텍쳐-리스코프 치환 원칙
리스코프 치환 원칙(LSP Liskov Substitution Principle) 1988년 바바라 리스코프는 하위 타입을 아래와 같이 정의했다. 상속을 사용하도록 가이드하기 정사각형/ 직사각형 문제 아키텍처 관점에서 LSP를 이해하는 최선의 방법은 이원칙을 어겼을때 시스템 아키텍처에ㅓㅅ 무슨일이 일어나는지 관찰하는 것이
클린아키텍쳐-개방 폐쇄 원칙
개방 폐쇄 원칙(OCP, Open Closed Principle) 버트란트 마이어가 1988년에 만들었는데 컴포넌트의 의존성 방향은 단방향으로 할려고 해야 되고 화살표 방향은 변경으로부터 보호하려는 컴포넌트를 향하도록 그려야 한다. 컴포넌트의 방향성을 제어하기 위해 컴포넌트를 추가 하기도 한다. 시스템을 컴포넌트 단위로
MicroProfile-마이크로프로파일
MicroProfile 마이크로프로파일 MicroProfile은 여러 런타임에서 애플리케이션 이식성을 제공하는 마이크로 서비스를 함께 구성하는 Java EE API 및 기술 모음을 말합니다. 현제 기준으로 3.1을 제공하고 있습니다. Java EE의 성숙으로 인해 릴리스 케이던스가 느려져 마이크로 서비스 커뮤니티에 비해
클린아키텍쳐-단일책임원칙
단일책임원칙(SRP: The Single Responsibility Principle) 이름만으로 헷갈릴수가 있다 모듈이 하나의 일만 해야 된다는 것으로 하나의 일만 해야 되는것은 함수이다. 단일 모듈의 변경이유는 하나여야만 한다. 모듈이란 무엇인가? 응집된 집합 단일 책임을 묶어주는 힘은 응집성이다. 징후1: 우발적 중
클린아키텍쳐-설계원칙
클린아키텍쳐 설계원칙 좋은 소프트 웨어 시스템은 클린코드로 부터 시작한다. 좋은 벽돌로 좋은 아키텍쳐를 정의하는 원칙이 SOLID 이다. SOLID는 함수와 데이터구조를 클래스로 배치하는 방법 그리고 이들 클래스를 서로결합하는 방법을 설명해준다. SRP : 단일책임원칙 모듈의 변경이유는 단하나여야 한다. OCP : 개방폐
클린아키텍쳐-함수형 프로그래밍
클린아키텍쳐 함수형 프로그래밍 함수형 프로그래밍 개념은 프로그래밍 그 자체보다 앞서 등장했다. 이 패러다임에서 핵심이 되는 기반은 람다 계산법으로 알론조 처치가 1930년대 발명했다 클로저와 자바의 극단적인 차이를 집어보면 자바는 가변변수를 사용하는데 클로저는 불변변수를 사용한다. 함수형 언어에서 변수는 변경되지 않는다.
클린아키텍쳐-구조적 프로그래밍
클린아키텍쳐 객체지향 프로그래밍 객체 지향이란 무엇인가? 데이터와 함수의 조합? 이것은 만족스러운 대답이 아니다. 캡슐화, 상속, 다형성 캡슐화 OO를 정의하는 요소중 캡슐화를 언급하는 이유는 데이터와 함수를 쉽고 효과적으로 캡슐화 하는 방법을 OO언어가 제공하기 때문이다. 헤더와 구현체를 분리하는 방식을 버리면서 강력한
클린아키텍쳐-구조적 프로그래밍
클린아키텍쳐 구조적 프로그래밍 데이크스트라가 초기에 인식한 문제는 프로그래밍은 어렵고, 프로그래머는 프로그래밍을 잘하지 못한다는 사실이였다. 데이크스트라는 증명이라는 수학적인 원리를 적용하여 이문제를 해결하고자 했다. 그의 비전은 유클리드 계층구조를 만드는것이였다. 데이크스트라는 이연구를 진행하면서 goto문이 모듈을 더
원도우에 서비스르 등록하기
원도우에 서비스르 등록하기 Java Service Wrapper 가 있지만 winsw를 사용하려고 한다. 위에 내용으로 되어 있다. 사용 법은 간단하다 exe 파일을 다운받고 이름을 서비스 이름으로 바꾸고 같은 이름으로 xml을 선언하면 되는데 아래 와 같다. 위와 같이만 처리하면 된다. 위에 로그는 콘솔에 찍히는 로그에
클린아키텍쳐-패러다임 개요
클린아키텍쳐 패러다임 개요 구조적 프로그래밍 최초로 적용된 패러다임은 구조적 프로그래밍으로 데이크스트라가 발견했다. 데이크스트라는 점프(goto 문장)은 프로그램 구조에 해롭다는 사실을 제시 이러한 구조를 (if/then/else do/while/until)로 대채했다. 구조적 프로그래밍은 제어흐름의 직접적인 전환에 대해
클린아키텍쳐-두가지 가치에 대한 이야기
클린아키텍쳐 두가지 가치에 대한 이야기 행위 (Behavior) 첫번째 가치는 행위 기계가 수익을 창출하거나 비용을 절약하도록 만들기 위해서이다. 아키텍처 부드러운 제품 소프트웨어가 가진 본연의 목적을 추구하려면 소프트웨어는 부드러워야 한다. 다시 말해 변경하기 쉬워야 한다. 소프트웨어의 개발 비용의 증가를 결정짓는 주된
클린아키텍쳐-설계와 아키텍쳐란?
클린아키텍쳐 설계와 아키텍쳐란? 설계와 아키텍쳐와 차이점은 고수준이냐 저수준이냐의 차이일뿐 둘의 차이는 없다. 목표는? 소프트웨어 아키턱처의 목표는 필요한 시스템을 만들고 유지보수하는 데 투입되는 인력을 최소화하는 데 있다. 빨리가는 유일한 방법은 제대로 가는것이다. 참조
JPA missing table error
JPA missing table error 일단 아래처럼 에러가 나기 시작했다. 하지만 테이블인 이미 생성되 있는 상태였다. 이게 무슨 문제인지 한참을 찾았는데 해결방법은 간단했다 스프링에서 기본 전략은 1. 점을 밑줄로 교체 1. 카멜케이스를 스네이크 케이스로 바꾸고 1. 소문자 테이블 이름 위에 값을 설정하면 변수 이
Mybatis ENUM 사용법
Mybatis ENUM 사용법 Mybatis에는 타입 핸들러가 있어서 기본적으로 EnumTypeHandler와 EnumOrdinalTypeHandler를 제공하고 있다. EnumTypeHandler는 varchar 타입으로 컨버트 해주고 EnumOrdinalTypeHandler는 NUMERIC or DOUBLE으로 변경해
JPA ENUM 사용법
JPA ENUM 사용법 jpa에서 enum을 사용할때 기본적으로 Enumerated 어너테이션을 사용하여 EnumType을 String으로 사용할건지 ORDINAL으로 사용할건지 선택을 한다. 여기서 코드와 맵핑시켜서 사용하면 위와 같은 Enum을 만들어서 DB에는 code값이 들어가야 될때 converter를 선언해서
인텔리제이 데이터 베이스 툴 사용하기
인텔리제이 데이터 베이스 툴 사용하기 jetbrains에 datagrid라는 DB 툴이 따로 존재 한다. 하지만 인텔리제이 Ultimate edition 에 해당 기능을 사용할수 있게 제공해주고 있다. 하지만 프로젝트 마다 datasource를 공유가 되지 않아서 불편하다. 그래서 빈 프로젝트를 만들어서 해당 기능을 사용
mybatis localdatetime 사용하기
mybatis localdatetime 사용하기 위 처럼 타입 핸들러를 셋팅 하면 된다고 하는데 안된다 위 처럼 @MappedTypes(LocalDateTime.class) 선언을 해주니 정상적으로 잘된다. 참조
jakarta ee 8: Java EE의 새로운 시대 설명
jakarta ee 8: Java EE의 새로운 시대 설명 Java EE는 환상적인 프로젝트입니다. 그러나 1999 년에 J2EE라는 이름으로 만들어졌으며 20 년이 지났으므로 기업의 요구에 부응하는 데 어려움이 있습니다. 이제 Java EE에는 새로운 홈과 새로운 브랜드가 있습니다. 이 프로젝트는 Oracle에서 Ecl
인텔리제이 spring-boot JMX 확인
인텔리제이 spring boot JMX 확인 위와 같은 코드에서 @Managed 어너테이션은 JMX에서 확인을 하기위한 어너테이션이다. 위를 확인하는 방법은 Spring Boot는 Ultimate 버전에서만 사용할 수 있습니다. 위처럼 설정을 한후에 jmx 모니터링 툴을 이용하면 되는데 jconsole을 이용하는 방법이다
kafka meetup
kafka meetup kafka + elk 를 활용한 클로벌 서비스 쿼리 모니터링 현충헌 못들음 ㅜㅜ apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안 박상원 이부분은 너무 늦게 도착해서 마지막 QNA만 조금 들었다. 위에 발표자분 github 카프카 기반의 대규모 모니터링 플랫폼 개발이야기 임
Spring Integration Overview
Spring Integration Overview 스프링 통합은 스프링 프로그래밍 모델의 확장을 제공하여 잘 알려진 엔터프라이즈 통합 패턴 을 지원합니다. 스프링 기반 애플리케이션 내에서 경량 메시징을 사용하고 선언적 어댑터를 통해 외부 시스템과의 통합을 지원합니다. 이러한 어댑터는 원격 지원, 메시징 및 스케줄링에 대한
spring integration 용어
spring integration 용어 Component Message 페이로드와 헤더로 구성 Message Channel 파이프 및 필터 아키텍쳐에서 파이프를 뜻 함 Message Endpoints 파이프 및 필터 아키텍쳐에서 필터를 뜻 함 Message Send/Recieve Outbound Gateway ⇒ Mess
Enterprise Integration Patterns
Enterprise Integration Patterns 모든 통합 솔루션은 다음과 같은 몇 가지 근본적인 문제를 해결해야합니다. 네트워크는 신뢰할 수 없습니다. 통합 솔루션은 네트워크를 통해 한 컴퓨터에서 다른 컴퓨터로 데이터를 전송해야합니다. 단일 컴퓨터에서 실행되는 프로세스와 비교하여 분산 컴퓨팅은 훨씬 더 많은 가
sonarqube Code Smells Generic Serializable
sonarqube Code Smells Generic Serializable 소나 큐브에서 Generic 타입을 Serializable 할수 없다는 오류가 나왔다 위와 같은 클래스이다. 위처럼 바꾸면 될텐데 아니면 직렬화로 데이터 전달을 할것이 아니면 transient 키워드를 넣는것이 좋다 참조
if kakao 2019 day2
if kakao 2019 day2 기조 연설 카카오 AI 카카오 ai 많은 발전 카카오 i를 모바일에서 실행할수 있게 함 카카오는 정확한 답변을 주는것을 목표로 개발하고 있음 인터렉티브 ai를 하려고 하는데 룰베이스 와 딥러닝을 같이 사용함 블록체인 그라운드 X 디지털 농노제 owned 라는 책을 소개하면서 이야기를 풀어
if kakao 2019 day1
if kakao 2019 day1 기조 연설 신정환 cto 컨퍼런스 키워드는 성장이다. 카카오 개발자의 개발자의 성장 스토리를 들려주겠다 로드뷰도 html로 바꿨다 초정밀 위치 정보 서비스를 제주도에서 9월 오픈 10cm 단위 추적이가능하다. 추천시스템 오픈소스로 공개 카카오 기술사이트 오픈 정규돈 cto 카카오뱅크 10
spring integration
spring integration Spring 프로그래밍 모델을 확장하여 잘 알려진 엔터프라이즈 통합 패턴 을 지원합니다. Spring Integration은 Spring 기반 애플리케이션 내에서 경량 메시징을 가능하게하며 선언적 어댑터를 통해 외부 시스템과의 통합을 지원합니다. 이러한 어댑터는 원격 지원, 메시징 및 스
GraphQL
GraphQL을 공부하면서 느낀점 SOAP, REST, GraphQL 지금까지 개발을 해오면서 3가지 API 아키텍쳐를 사용해왔다. 처음에 아무것도 모르는체 SOAP이라는 방식을 사용해서 개발을 했었는데 SOAP은 http를 사용하여 XML로 데이터를 주고 받았다. 여기서 메소드는 get과 post만 사용했음 SOAP은
kafka 고승범님 발표
kafka 고승범님 발표 얼마전에 이직하셨음 ^^ 주키퍼 + 카프카 서비스 영속성? 데이터 일부 손실 데이터 정합성? key는 유니크하게 만들어야 되고 필요 없으면 none을 추천함 컨슈머에서 순서를 보장하지 않는다. 순차 보장은 파티션은 하나 카카오는 vip를 dns로 맵핑해서 사용함 9월 10월에 밋업 크게 할것임 참
sonarqube에 코드 커버리지 나타내기
sonarqube에 코드 커버리지 나타내기 특별히 해줄것은 없고 maven 프로젝트에 jacoco 플러그인만 등록해주면 잘나온다. 위에 플러그인만 잘 등록하자 참조
mssql types of replication
mssql types of replication MicrosoftSQL Server 에서는 분산 애플리케이션에서 사용할 수 있는 다음 유형의 복제를 제공합니다. | 형식 | 설명 | | | | | 트랜잭션 복제 | 게시자의 변경 사항은 거의 실시간으로 구독자에게 전달됩니다. 데이터 변경 내용은 게시자에서 발생한 것과 같은
mssql create sequence
mssql create sequence 시퀀스 객체를 만들고 해당 속성을 지정합니다. 시퀀스는 시퀀스가 생성 된 사양에 따라 숫자 값 시퀀스를 생성하는 사용자 정의 스키마 바운드 객체입니다. 일련의 숫자 값은 정의 된 간격으로 오름차순 또는 내림차순으로 생성되며 소진되면 다시 시작 (사이클)하도록 구성 할 수 있습니다.
원도우에서 wc 명령어 사용하기
원도우에서 wc 명령어 사용하기 위처럼 특정 포트를 확인 할수 있는데 여기서 wc 명령어 사용을 하고 싶을때는 이렇게 사용하면 된다. 참조
DriverManagerDataSource
DriverManagerDataSource 서비스를 동작시키는데 특정 포트가 오픈된 소켓개수가 너무 많았다. 확인해 보니 DB포트이다 이상해서 어플리케이션의 커넥션 풀을 확인해보는데 DriverManagerDataSource를 사용한 것이다. DriverManagerDataSource는 아래처럼 내용이다. 커넥션 풀을 사
systemd 에서 등록한 서비스 수정시
systemd 에서 등록한 서비스 수정시 위치에 있는 서비스 xxx.service 수정시에 다시 적용 명령어는 위 처럼 해야 재등록 된다. 참조
msa에 질의 응답시간 소감
msa에 질의 응답시간 소감 오늘 회사에서 이사님이 지인분들에게 질의 응답시간을 가질수 있게 해주셨다 안영회님이 오셔서 인사를 드렸다. 예전의 블로그에서 너무 글을 많이 봤다. 도메인이 자신한테 없어서 살리지 못하신단이야기를 하시면서... 그때는 커뮤니티 할동을 하고 싶어도 신입 개발자라서 너무 멀리 있는 사람들 같아서
spring 이벤트
스프링 이벤트 스프링에서 ApplicationEvent를 상속받아서 구현된 이벤트를 수신할수 있는 방법이 여러가지 있다. 기본적으로 ApplicationListener를 상속 받아서 구현하는 방법 두번째로 @EventListener 어너테이션을 사용해서 처리하는 방법 세번째로 @TransactionalEventListen
인텔리제이(intellij) themes
인텔리제이 테마 설정 토비님이 좋다고 글을 적어서 High contrast 테마로 설정해서 쓰고 있는데 맘에 든다 기록용으로 쓸려고한다 폰트는 d2coding 사이즈는 16으로 사용중 참조
GraphQL Language(1)
GraphQL Language(1) Language 클라이언트는 GraphQL 쿼리 언어를 사용하여 GraphQL 서비스에 요청합니다. 이러한 요청 소스를 문서로 지칭합니다. 문서에는 쿼리 재사용을 허용하는 컴포지션의 공통 단위 인 조각은 물론 작업 (쿼리, 변이 및 구독)이 포함될 수 있습니다. GraphQL 문서는 터
GraphQL Overview
GraphQL Overview 소개 이것은 클라이언트 서버 애플리케이션의 데이터 모델의 기능 및 요구 사항을 설명하기 위해 2012 년 Facebook에서 원래 작성된 쿼리 언어 및 실행 엔진 인 GraphQL의 사양입니다. 이 공개 표준의 개발은 2015 년에 시작되었습니다. GraphQL은 진화했으며이 사양의 차후 버
mssql 사용자 계정에 특정 오브젝트 권한만 부여
mssql 사용자 계정에 특정 오브젝트 권한만 부여 먼저 로그인 사용자를 만듬 사용자 역활은 public만 줌 데이터 베이서를 맵핑 시킴 그다음 데이터 베이스의 보안탭을 보면 만든 사용자가 있음 더블 클릭하면 사용자가 소유한 스키마가 나오는데 없음 맴버 자격 없음 보안개체에서 검색버튼을 클릭 여기서 특정 개체를 선택후 클
스프링 부트 애플리케이션 설치하기
스프링 부트 애플리케이션 설치하기 Spring Boot 응용 프로그램을 사용하여 실행하는 것 외에도 java jarUnix 시스템에 대해 완벽하게 실행 가능한 응용 프로그램을 만들 수도 있습니다. 완전히 실행 jar는 다른 실행 가능한 바이너리처럼 수행 할 수 있거나 할 수 있습니다 에 등록 init.d하거나systemd
Classes vs. Data Structures
Classes vs. Data Structures 클래스 란 무엇인가요? 클래스는 유사한 객체 세트의 명세입니다 객체 란 무엇입니까? 객체는 캡슐화 된 데이터 요소에서 작동하는 함수 집합입니다. 또는 객체는 함축 된 데이터 요소 에서 작동하는 함수 집합입니다 . 묵시적인 데이터 요소 란 무엇입니까 ? 객체의 기능은 일부
spring kafka consumer sample
spring kafka consumer sample 스프링 카프카로 간단한 consumer sample 프로그램 해볼려고 한다. 처음에는 카프카를 다운 받고 에 3번항목 토픽생성까지 한후에 스프링 컨슈머를 시작하면 간단하게 정보를 볼수있다. 일단 로컬에 환경을 맞춘다는 가정하에 코드를 만들었는데 프로퍼티에 spring.k
spring kafka sample
spring kafka sample 스프링 카프카로 간단한 sample 프로그램 해볼려고 한다. 프로그램 자체는 스프링 카프카 자체 sample 코드를 사용하려고 한다. 그럼 먼저 카프카를 다운로드 하겠다. 압축을 푼후에 다음 명령어를 실행하겠다. 주키퍼 실행 실행이 되면 카프카를 실행하겠다. sample1 첫번째 샘플은
CallHistoryTransactions: Operation not permitted 터미널 에러 해결하기
CallHistoryTransactions: Operation not permitted 터미널 에러 해결하기 참조
java dump 명령어
java dump 명령어 툴을 사용하면 편한데 사용 못할때 직접 명령어를 사용하여 덤프를 내릴수 있다. thread dump heap dump 힙 상태 확인 JMX 설정 참조
log4jdbc 설정
log4jdbc 설정 설정 위처럼 되있는것을 아래 처럼 설정 드라이버 클래스도 바꿔줘야 된다. 아래는 로거 설정임 걍 스프링 부트에서는 starter를 넣고 끝냄 위처럼 추가하고 프로퍼티에 위처럼 넣음 물론 logback 설정을 위에 xml 처럼 넣어도 됨 참조
톰캣 windows StopTimeout 설정
톰캣 windows StopTimeout 설정 톰캣을 원도우 서비스로 등록후에 재시동을 하는데 재기동 시간이 너무 오래 걸려서 옵션들을 조금 찾아 보게 되었다. 여기서 눈여겨 본 옵션은 StopTimeout 옵션으로 정지시에 타임아웃을 설정한것이다 하지만 설정을 했는데 제대로 되지 않았다. 여기서 다시 StartMode
도커로 몽고디비 설치
도커로 몽고디비 설치 먼저 도커가 깔려있다고 하는 전제하에 설명을 하면 가장 간단하게 설치할수 있는 방법은 아래의 명령어를 수행하는것이다. 위 명령어는 latest 테그의 몽고 디비를 설치한다 원하는 버전이 있다고 하면 위에 처럼 테그를 마지막에 붙혀주면 설치가 된다 실행은 위처럼 실행하여 27017포트 부터 27019
변경 의존성과 그에따른 설계진화
변경 의존성과 그에따른 설계진화 먼저 아래의 동영상을 기본전제 하에 설명을 진행하므로 레이어 아키텍쳐 동영상을 꼭 시청하길 권장한다. 설계를 이야기 할때 의존성에 대해서 알아야 되니 처음에는 의존성에 대한 설명을 해주심 의존성은 코드 의존성과 패키지 의존성을 분리 해서 설명해 주시고 참조가 순환 되면 잘못된 구조라고 설명
atomic-web-design(아토믹 디자인)
atomic web design 웹 디자인 공예가 계속 발전함에 따라 웹 페이지의 간단한 컬렉션을 만드는 것보다 사려 깊은 디자인 시스템을 개발할 필요성을 인식하고 있습니다. 디자인 시스템을 만드는 것에 관해서는 많은 이야기가 있었고 , 그 대부분은 색상, 타이포그래피, 그리드, 텍스쳐 등을위한 기초를 만드는 데 중점을두
애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향 레이어 아키텍처 트렌젝션 스크립트 절차지향 도메인 모델 객체지향 도메인 개념 또는 후보 객체 선정 트랜젝션 스크립트 구현 절차적으로 구현 데이터와 프로세스를 따로 분리한다. 데이터 모델을 만든다. anermic domain model 로직이 없는 객체 생성 어떻게 처리 할것인가 서비스 생성
Passing Arguments to Event Handlers
이벤트 처리에 인수를 전달하는 방법 위 처럼 익명 함수를 이용해 이벤트를 처리 가능하다. vuejs에는 $event가 있다. 참조
es6 import 구문
JavaScript import 구문 자바 스크립트에도 import 구문이 들어 왔다. 아래는 Syntax 이다 정적 import 문은 다른 모듈에서 내 보낸 바인딩을 가져 오는 데 사용됩니다. 가져온 모듈은 귀하가 그러한 모듈을 선언했는지 여부와 관계없이 엄격 모드입니다. import 문은 포함 된 스크립트에서 type
Mutating props vue-warn
Mutating props vue warn 뷰에서 컴포넌트를 선언후 props로 값을 부모로 부터 받을때 해당 값을 직접 변경 할려고 할때 warn이 나타납니다. 아래의 코드를 보면 v model="propsData"로 직접 select 값을 바꾸는데 값을 바꿀수 있다 이때 warn 메시지가 나타난다. 이렇게 다시 변수를
Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.
Component template should contain exactly one root element. If you are using v if on multiple elements, use v else if to chain them instead. 7년만에 자바스크립트를 하는데 어려운 점이 많네요 ㅜㅜ 일단 뷰에서 컴
인텔리제이 프로젝트에 톰캣 재시작 없이 리소스 반영시키기
인텔리제이 프로젝트에 톰캣 재시작 없이 리소스 반영시키기 설정 화면으로 진입후에 update resources로 변경하면 수정시에 재반영 된다. 참조
인텔리제이 프로젝트에 es6 활성화 시키기
인텔리제이 프로젝트에 es6 활성화 시키기 설정 화면으로 진입후에 Preferences Languages & frameworks Javascript 경로에서 수정가능 참조
HV000030: No validator could be found for constraint
HV000030: No validator could be found for constraint 내 로컬 맥북에서는 정상적으로 동작하는데 windows에 있는 tomcat에만 올리면 에러가 나기 시작한다. 하지만 catalina.out에는 에러 로그가 찍히지 않고 리턴되는 값은 500에러로 아래의 값이 찍히기 시작했다. 너
스프링 jackson enum deserializer
스프링 jackson enum deserializer json 메시지를 받는 rest api를 만들때 enum을 사용해 메시지를 받을때 하는법 위에 enum 객체가 있는데 이부분에서 @JsonCreator 와 @JsonValue 를 사용하여 직렬화와 역직렬화를 하게 된다 컨트롤러를 보면 위에 처럼 코딩을 하고 Breake
mssql nolock table hint
NOLOCK READUNCOMMITTED와 같습니다. 자세한 내용은이 항목 뒷부분의 READUNCOMMITTED를 참조하십시오. READUNCOMMITTED 더티 읽기가 허용되도록 지정합니다. 다른 트랜잭션이 현재 트랜잭션에서 읽은 데이터를 수정하지 못하도록 공유 잠금이 발행되지 않으며 다른 트랜잭션이 설정 한 배타적 잠
mssql CREATE PROCEDURE
CREATE PROCEDURE SQL Server, Azure SQL 데이터베이스, Azure SQL 데이터웨어 하우스 및 병렬 데이터웨어 하우스에 Transact SQL 또는 CLR (공용 언어 런타임) 저장 프로 시저를 만듭니다. 저장 프로시 저는 다음과 같은 점에서 다른 프로그래밍 언어의 프로 시저와 유사합니다. 입
CREATE LOGIN (Transact-SQL)
CREATE LOGIN (Transact SQL) SQL Server, SQL 데이터베이스, SQL 데이터웨어 하우스 또는 Analytics Platform 시스템 데이터베이스에 대한 로그인을 만듭니다. 특정 버전의 구문, 인수, 설명, 사용 권한 및 예제를 보려면 다음 탭 중 하나를 클릭하십시오. CREATE LOGIN
mssql create-a-login
로그인 만들기 이 항목에서는 SQL Server Management Studio 또는 Transact SQL을 사용하여 SQL Server 2017 또는 SQL 데이터베이스에 로그인을 만드는 방법에 대해 설명합니다. 로그인은 SQL Server 인스턴스에 연결하는 사람 또는 프로세스의 ID입니다. 배경 로그인은 보안 주체
mssql logins-and-jobs-for-availability-group-databases
상시 가용성 그룹의 데이터베이스를 사용하여 작업에 대한 로그인 관리 Always On 가용성 그룹의 모든 기본 데이터베이스와 해당 보조 데이터베이스에서 동일한 사용자 로그인 및 SQL Server 에이전트 작업 집합을 정기적으로 유지 관리해야합니다. 가용성 그룹에 대한 가용성 복제본을 호스팅하는 모든 SQL Server
클린코드(Smells and Heuristics)-part2
클린코드 냄새와 발견법(Smells and Heuristics) part2 함수 부정 조건은 피하라. 부정 조건은 긍정 조건보다 이해하기 어렵다 가능하면 긍정 조건으로 표현하라. 위에 코드가 아래 코드 보다 낫다. 함수는 한가지 일만 해야 한다. 함수를 짜다 보면 한 함수 안에다 여러 단락을 이어서 일련의 작업을 수행하고
aws에 접속할때 load key bad permissions 에러
aws에 접속할때 load key bad permissions 에러 간만에 aws 접속하려고 명령어를 치는되 않됨 load key bad permissions 에러가 남 먼지를 찾아보 해당 pem 파일의 퍼미션을 높게 줘서 문제가 됨 위처럼 권한을 조정하니 다시 잘 접속이 됨 참조
클린코드(Smells and Heuristics)-part1
클린코드 냄새와 발견법(Smells and Heuristics) part1 주석 부적절한 정보 다른 시스템(svn, git, 이슈트렉커 등등)에 저장될 정보는 주석으로 부적절하다. 주석은 코드의 설계에 기술적인 설명을 부연하는 수단이다. 쓸모 없는 주석 오래된 주석, 엉뚱한 주석, 잘못된 주석은 더이상 쓸모가 없다. 중복
클린코드(Successive Refinement, JUnit Internals, Refactoring SerialDate)
클린코드 Successive Refinement(점진적 개선) 프로그래밍은 과학보다 공예에 가깝다. 클린코드를 짜려면 먼저 지저분한 코드를 짠 뒤에 정리해야 한다는 의미 점진적 개선을 하기 위해 TDD를 실천 하였고 그래서 하나 씩 개선해 나간 내용이다 이부분은 책으로 꼭 읽어 봐야 할듯 하다 책의 내용이 전체적으로 리펙
mssql TRY...CATCH
mssql TRY...CATCH TRY...CATCH (Transact SQL) 본 문서의 정보는 다음의 제품에 적용됩니다. SQL Server (starting with 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse Microso
mssql GO 명령
mssql GO 명령 SQL Server 유틸리티 문 GO 본 문서의 정보는 다음의 제품에 적용됩니다. SQL Server SQL Server는 Transact SQL 문은 아니지만 sqlcmd 및 osql 유틸리티와 SQL Server Management Studio 코드 편집기에서 인식하는 명령을 제공합니다. 이 명령
mssql 명시적 트랜잭션 사용
mssql 명시적 트랜잭션 사용 BEGIN TRANSACTION (Transact SQL) 명시적인 로컬 트랜잭션의 시작점을 표시합니다. 명시 적 트랜잭션은 BEGIN TRANSACTION 문으로 시작하고 COMMIT 또는 ROLLBACK 문으로 끝납니다. Syntax Arguments transaction name 해당
클린코드(Concurrency)
클린코드 Concurrency(동시성) 동시성이 필요한 이유 동시성은 결합을 없애는 전략이다. 즉 무엇과 언제를 분리하는 전략이다. 스레드가 하나인 프로그램은 무엇과 언제가 서로 밀접하다. 그래서 호출스택을 살펴보면 프로그램 상태가 곧바로 드러난다. 단일 스레드를 디버깅하는 프로그래머는 정지점을 정한후 어느 정지점에 걸렸
spring framework The IoC Container
Spring Framework Dependencies 일반적인 엔터프라이즈 애플리케이션은 단일 객체 (또는 Spring 용어로는 빈)로 구성되지 않습니다. 가장 단순한 응용 프로그램이라 할지라도 최종 사용자가 일관된 응용 프로그램으로 보는 것을 표현하기 위해 함께 작동하는 몇 가지 개체가 있습니다. 이 다음 섹션에서는 독
spring framework The IoC Container
Spring Framework Bean Overview Spring IoC 컨테이너는 하나 이상의 빈을 관리한다. 이러한 bean은 사용자가 컨테이너에 제공하는 구성 메타 데이터 (예 : XML <bean/ 정의 형식 )로 작성됩니다. 컨테이너 자체 내에서,이 bean 정의는 BeanDefinition (다른 정보들 사이
spring framework The IoC Container
Spring Framework The IoC Container 이 장에서는 Spring의 Inversion of Control (IoC : 제어의 역전) 컨테이너에 대해 다룹니다. Spring IoC 컨테이너와 Beans에 대한 소개 이 장에서는 IoC (Inversion of Control) 원칙의 Spring Fram
spring framework overview
Spring Framework Overview Spring을 사용하면 Java 엔터프라이즈 애플리케이션을 쉽게 만들 수 있습니다. Groovy 및 Kotlin을 JVM에서 대체 언어로 지원하고 응용 프로그램의 필요에 따라 다양한 종류의 아키텍처를 생성 할 수있는 유연성을 통해 기업 환경에서 Java 언어를 수용하는 데 필
클린코드(Emergence)
클린코드 Emergence(드러나다, 창발성) 켄트백의 간단한 설계규칙 4가지 모든 테스트를 실행한다. 중복을 없엔다. 프로그래머의 의도를 표현한다. 클래스와 매소드 수를 최소로 줄인다. 간단한 설계규칙 : 모든 테스트를 실행하라. 문서로는 시스템을 완벽하게 설계했지만 시스템이 의도한대로 돌아가는지 검증할 방법이 없다면
인텔리제이 junit4 자동생성 포멧 import 바꾸기
인텔리제이 junit4 자동생성 포멧 import 바꾸기 위에 메뉴에 들어가서 보면 위에 Assert가 import 되어 있다. 난 assertj가 좋으니 아래 처럼 구문을 수정하면 된다. 참조
클린코드(Systems)
클린코드 Systems 이장에서는 높은추상화 수준에서 즉 시스템 수준에서 클린 코드를 구현하는 방법을 살펴 본다. 시스템 제작과 시스템 사용을 분리하라. 소프트웨어 시스템은 응용프로그램 객체를 제작하고 의존성을 서로 연결하는 시작단계와 시작단계 이후 이어지는 실행 단계를 분리해야 한다. 시작단계는 모든 응용 프로그램이 풀
인텔리제이 오토 테스트 토글 사용법
인텔리제이 오토 테스트 토글 사용법 위에처럼 테스트 패널에 auto test toggle 버튼이 있다. 이 부분이 실행이 되지 않아서 찾아 보니 빌드가 되는 순간 트리거가 일어나서 실행이 된다. 참조
클린코드(단위테스트)
클린코드 단위테스트 TDD 법칙 3가지 1. 실패하는 단위 테스트를 작성할 때까지 실제코드를 작성하지 않는다. 1. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 1. 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 위 세가지 규칙을 따르면 개발과 테스트가 대략 30초 주기로
PermGen Elimination project is promoting
PermGen 제거 프로젝트 추진 중 우리는 이번 주 JDK8로 perm gen 삭제 변경 으로 핫스팟을 홍보하기를 기대하고있다. 핫스팟으로의 초기 통합을위한 마지막 webrev는 http://cr.openjdk.java.net/ coleenp/metadata8/입니다. 기본적으로 이는 핫스팟의 클래스 메타 데이터 표현을
Java Memory Architecture Cheat Sheet
Java Memory Architecture Cheat Sheet java process memory가 있고 jvm memory 그리고 non jvm memory(native livraries) jvm memory 아래에 java heap 영역과 non heap 영역 java heap 영역 아래 youn gen 과 old
tomcat OOM
OutOfMemoryError 자바 환경에서 운영중에 OOM을 만난적이 있을것이다. 일반적으로 Heap최대치는 물리메모리 1/4 (8기가기준 약 2기가) 간단한 프로그램을 하나 짜서 테스트 해 보겠다. 간단히 OOM을 발생 시킬수 있는 코드이다. 스텍을 만들어 스텍에 객체를 계속 넣는 것이다. Xms=N 최소 힙사이즈 X
클린코드(오류처리)
클린코드 오류처리 오류 코드를 처리 하는것은 클린코드와 연관이 있다. 흩어진 오류처리 코드때문에 코드를 이해하기 어려워진다면 클린코드라고 하기 어렵다. 오류처리 보다 예외를 사용하라 얼마전까지만 해도 예외를 지원하지 않는 프로그램 언어들이 많았다. 오류 플래그를 설정하거나 호출자에서 오류코드를 넘기는것이 다였다. 오류코드
클린코드(객체와 자료구조)
클린코드 객체와 자료구조 변수를 private으로 선언하는 이유가 있다 남들이 변수에 의존하지 않았으면 싶어서 이다. 자료 추상화 자료를 세세하게 공개하는것 보다 추상적인 개념으로 표현하는 편이 낫다. 인터페이스나 get/set함수만으로 추상화가 이뤄지지 않는다. 아무 생각 없이 get/set함수를 추가하는것이 가장 나쁘
클린코드(형식 맟추기)
클린코드 형식 맞추기 프로그래머라면 형식을 깔끔하게 맞춰서 코드를 짜야 된다. 형식을 맞추려는 목적 코드 형식은 중요하다. 코드 형식은 의사소통의 일환이다. 적절한 행 길이를 유지하라. 일반적으로 큰파일 보다 작은 파일이 이해하기 쉽다. 신문기사 처럼 작성하라. 신문은 다양한 기사로 이뤄진다. 대다수 기사가 아주 짧다.
스프링 캠프 2019
스프링 캠프 2019 GraalVM과 스프링, 이상과 현실 김태완 GraalVM = openjdk 8 + gaal(새로운 고성능 컴파일러) + @ GraalVM = native image ?? 이 부분은 오해가 있는것 같다. 자바는 jit 컴파일러가 있는데 이 부분에서 javac에서 컴파일된 바이트 코드를 기계어로 해석함
의식적인 TDD, 리팩토링
의식적인 TDD, 리팩토링 의식적으로 목표를 설정하라. 의식적인 연습으로 TDD 리팩토링 적용 TDD. 리팩토링 == 운동 평생동안 연습하겠다는 마음가짐으로 시작 시작하기 애인과 만남 시간 조정 친구들과의 관계 끊기 TV보지 않기, 게임하지 않기 위 처럼 우선순위를 확보 해서 시간을 만들어야 된다. 토이 프로젝트로 시작해
클린코드(의미 있는 이름)
클린코드 의미 있는 이름 검색하기 좋은 이름을 사용하라 위에 asis코드와 tebe코드중 어느것이 검색에 더 편하겠나? 일단 숫자형식은 검색하기 매우 까다롭다 이름을 의미 있게 지으면 검색하기 편해진다. 인코딩은 피하라 헝가리식 표기법 옛날 원도우 C API는 헝가리식 표기법을 매우 중요하게 생각했다. 실제로 컴파일하기
스프링 부트로 개발중인 코드들을 서비스 재시작없이 반영 livereload 사용
스프링 부트로 개발중인 코드들을 서비스 재시작없이 반영 livereload 사용 인텔리제이 기준으로 설명하면 브라우저에 을 설치 application.properties 열어 spring.devtools.livereload.enabled=true 추가 IntelliJ Preferences Build,Execution,De
mssql 자동닫기 설정 확인
mssql 자동닫기 설정 확인 SELECT DATABASEPROPERTY ( 'TEST', 'IsAutoClose') 이런식으로 하면 확인이 가능하다. 위 내용으로 접속이 없으면 데이터 베이스 리소스를 내렸다가 올리는데 이런 상황에서는 성능저하가 된다. 참조
Docker SQL Server 컨테이너 이미지에 데이터 베이스 백업 복원하기
Docker SQL Server 컨테이너 이미지에 데이터 베이스 백업 복원하기 다운로드 실행 <YourStrong!Passw0rd 이부분을 자기가 아는 패스워드로 바꾸면 된다. 그리고 일단 윈도우용 bak 파일을 복원 시킬때 정상적으로 동작하지 않았다. 그래서 mdf파일과 ldf을 직접 임포트 시킬려고 했다. 일단 데이터
맥북에서 자바 개발 환경 셋팅
맥북에서 자바 개발 환경 셋팅 인텔리제이 키 먹통 해결 파인더에 숨김파일 표시 단축키(이것은 해당 폴더만 적용된다.) brew 설치 일단 처음에 받으니 brew도 설치가 안되있었다 이것부터 설치 JDK 설치 그리고 난 오픈JDK 배포판 중에 AdoptOpenJDK를 선택 해서 인스톨 할것이다. 지금 기준으로 jdk11을
Web on Reactive Stack(Spring WebFlux Reactive Core)
Reactive Core 이 spring web모듈에는 사후 대응 웹 응용 프로그램에 대한 다음과 같은 기본 지원이 포함되어 있습니다. 서버 요청 처리에는 두 가지 레벨의 지원이 있습니다. HttpHandler : Reactor Netty, Undertow, Tomcat, Jetty 및 Servlet 3.1+ 컨테이너에
Web on Reactive Stack(Spring WebFlux 개요)
Web on Reactive Stack 이 부분에서는 Netty, Undertow 및 Servlet 3.1+ 컨테이너와 같은 비 차단 서버에서 실행하기 위해 Reactive Streams API를 기반으로 만들어진 리 액티브 스택 웹 응용 프로그램에 대한 지원을 다룹니다 . 개별 챕터에서는 Spring WebFlux 프레
아이템 90. 직렬화된 인스턴스 대신 직렬화 프록시 사용을 검토하라.
이펙티브 자바 아이템 90. 직렬화된 인스턴스 대신 직렬화 프록시 사용을 검토하라. 직렬화 프록시 패턴의 한계 1. 클라이언트가 멋대로 확장할 수 있는 클래스에는 적용할 수 없다. 1. 객체 그래프에 순환이 있는 클래스에도 적용할 수 없다. 참조
아이템 89. 인스턴스 수를 통제해야 한다면 readResolve 보다는 열거타입을 사용하라.
이펙티브 자바 아이템 89. 인스턴스 수를 통제해야 한다면 readResolve 보다는 열거타입을 사용하라. 생성자를 막아서 하나의 인스턴스만 생성하게 만든 싱근톤 하지만 Serializable구현하면 readResolve 이용해서 싱글턴을 만들어야 된다. 참조
아이템 88. readObject 메서드는 방어적으로 작성하라.
이펙티브 자바 아이템 88. readObject 메서드는 방어적으로 작성하라. 위에 코드를 역직렬화 하면 시작일이 종료일보다 늦게 생성 될수도 있다 그것을 방지하기 위해 readObject 메소드를 방어적으로 작성한 경우이다. 실행결과 위에서 참조를 훔쳐 와서 mp의 데이터를 변경했지만 p에 데이터가 변경되었다 위에 코드
아이템 87. 커스텀 직렬화 형태를 고혀해보라.
이펙티브 자바 아이템 87. 커스텀 직렬화 형태를 고혀해보라. 먼저 고민해보고 괜찮다고 판단될 때만 기본 직렬화 형태를 사용하라. 객체의 물리적 표현과 논리적 내용이 같다면 기본직렬화 형태라도 무방하다. 기본 직렬화 형태가 적합하다고 결정했더라도 불변식 보장과 보안을 위해 readObject 메서드를 제공해야 할 때가 많
아이템 86. Serializable을 구현할지는 신중히 결정하라.
이펙티브 자바 아이템 86. Serializable을 구현할지는 신중히 결정하라. Serializable 구현의 문제점 Serializable을 구현하면 릴리스한 뒤에는 수정하기 어렵다. 버그와 보안 구멍이 생길 위험이 높아진다. 해당 클래스의 신버전을 릴리스할 때 테스트할 것이 늘어난다는 점이다. Serializable
아이템 85. 자바 직렬화의 대안을 찾으라.
이펙티브 자바 아이템 85. 자바 직렬화의 대안을 찾으라. 직렬화 위험을 회피하는 가장 좋은 방법은 아무것도 역직렬화하지 않는 것 이다. 여러분이 작성하는 새로운 시스템에서 자바 직렬화를 써야 할 이유는 전혀 없다. 신뢰할수없는 데이터는 절대 역질렬화하지 않는 것이다. 블랙리스트 방식보단 화이트리스트 방식을 추천 시스템을
아이템 84. 프로그램의 동작을 스레드 스케줄러에 기대하지 말라.
이펙티브 자바 아이템 84. 프로그램의 동작을 스레드 스케줄러에 기대하지 말라. 정확성이나 성능이 스레드 스케줄러에 따라 달라지는 프로그램이라면 다른 플랫폼에 이식하기 어렵다. 스레드는 당장 처리해야 할 적업이 없다면 실행돼서는 안된다. 실행결과 참조
아이템 83. 지연 초기화는 신중히 사용하라.
이펙티브 자바 아이템 83. 지연 초기화는 신중히 사용하라. 다른 모든 최적화와 마찬가지로 지연 초기화에 대해 해줄 조언은 필요할때까지 하지마라. 대부분의 상황에서 일반적인 초기화가 지연 초기화 보다 낫다. private final FieldType field1 = computeFieldValue(); 인스턴스 필드를 초
아이템 82. 스레드 안정성 수준을 문서화 하라.
이펙티브 자바 아이템 82. 스레드 안정성 수준을 문서화 하라. 메서드 선언에 synchronized 한정자를 선언할지는 구현 이슈일뿐 API에 속하진 않는다. 멀티스레드 환경에서도 API를 안전하게 사용하게 하려면 클래스가 지원하는 스레드 안정성 수준을 정확히 명시해야 한다. 스레드 안정성 수준이 높은순으로 나열한 목록
아이템 81. wait 와 notify 보다는 동시성 유틸리티를 애용하라.
이펙티브 자바 아이템 81. wait 와 notify 보다는 동시성 유틸리티를 애용하라. wait 와 notify는 올바르게 사용하기가 아주 까다로우니 고수준 동시성 유틸리티를 사용하자. 동시성 컬렉션에서 동시성을 무력화하는 건 불가능하며, 외부에서 락을 추가로 사용하면 오히려 속도가 느려진다. 위에 코드에서 개선할 포인
아이템 80. 스레드보다는 실행자, 테스크, 스트림을 애용하라.
이펙티브 자바 아이템 80. 스레드보다는 실행자, 테스크, 스트림을 애용하라. java.util.concurrent 패키지가 등장 했고 여기에 executor framework라는 것이 포함이 되어 있다. 실행자 서비스는 쓰레드 보다 고급 api면서 조금더 다루기 쉽다. 실행자 서비스의 주요기능 특정 테스크가 완료되기를
아이템 79. 과도한 동기하는 피하라.
이펙티브 자바 아이템 79. 과도한 동기하는 피하라. 이전 상황을 동기화를 하지 않았을때 문제가 생기는 상황을 다뤘고 이번에는 과도하게 동기화를 했을때 생기는 문제를 다룰것이다. 응답 불가와 안전 실패를 피하려면 동기화 메서드나 동기화 블록 안에서는 제어를 절대로 클라이언트에 양도하면 안된다. 실행결과 위에 코드는 정상적
아이템 78. 공유중인 가변 데이터는 동기화 해서 사용하라.
이펙티브 자바 아이템 78. 공유중인 가변 데이터는 동기화 해서 사용하라. 동기화(synchronized)는 배타적 실행뿐 아니라 스레드 사이에 안정적인 통신에도 필요하다. 위에 동작은 1초내에 종료할것이라고 생각이 되는가? vm에서 hoisting이 일어나서 종료되지 않는다. 위에 코드가 아래 코드 처럼 최적화 되는것을
동시성(Concurrency) High Level Concurrency Objects
동시성(Concurrency) High Level Concurrency Objects 지금까지이 레슨은 처음부터 Java 플랫폼의 일부인 저수준 API에 중점을 두었습니다. 이러한 API는 매우 기본적인 작업에는 적합하지만보다 고급 작업에는 더 높은 수준의 구성 요소가 필요합니다. 특히 오늘날의 멀티 프로세서 및 멀티 코
동시성(Concurrency) Immutable Objects
동시성(Concurrency) Immutable Objects 오브젝트 는, 구축 후에 상태를 변경할 수없는 경우, 불변 이라고 보여집니다. 불변 객체에 대한 최대 의존도는 간단하고 안정적인 코드를 만들기위한 건전한 전략으로 널리 받아 들여지고 있습니다. 변경 불가능한 객체는 동시 응용 프로그램에서 특히 유용합니다. 상태
동시성(Concurrency) Guarded Blocks
동시성(Concurrency) Guarded Blocks 스레드는 종종 자신의 행동을 조정해야합니다. 가장 일반적인 조정 관용구는 Guarded Blocks 입니다. 이러한 블록은 블록을 진행하기 전에 참이어야하는 조건을 폴링하여 시작합니다. 이 작업을 제대로 수행하려면 여러 단계를 수행해야합니다. 예를 들어 guarde
동시성(Concurrency) Liveness
동시성(Concurrency) 생명(Liveness) 적시에 동시 응용 프로그램을 실행할 수있는 기능을 활성이라고 합니다. 이 섹션에서는 가장 일반적인 종류의 생명 문제, 교착 상태 에 대해 설명하고 다른 두 가지 생명 문제, 기아 및 라이브 록 을 간략하게 설명 합니다. 교착 상태(Deadlock) 교착 상태 는 두 개
동시성(Concurrency) Synchronization
동시성(Concurrency) 동기화(Synchronization) 쓰레드는 주로 필드에 대한 액세스를 공유함으로써 통신하며 객체 참조 필드는 참조합니다. 이러한 형태의 통신은 매우 효율적이지만 스레드 간섭 과 메모리 일관성 오류 의 두 가지 종류가 있습니다. 이러한 오류를 방지하는 데 필요한 도구는 동기화 입니다. 그러
동시성(Concurrency) Thread Objects
동시성(Concurrency) Thread Objects 각 스레드는 Thread 클래스의 인스턴스와 연관됩니다. Thread 객체를 사용하여 동시 응용 프로그램을 만드는 두 가지 기본 전략이 있습니다 . 스레드 생성 및 관리를 직접 제어하려면 Thread 응용 프로그램이 비동기 작업을 시작해야 할 때마다 인스턴스를 작성
동시성(Concurrency) Processes and Threads
동시성(Concurrency) 컴퓨터 사용자는 시스템이 한 번에 두 가지 이상을 할 수 있다는 것을 당연시합니다. 다른 응용 프로그램이 파일을 다운로드하고 인쇄 대기열을 관리하며 오디오를 스트리밍하는 동안 계속해서 워드 프로세서에서 작업 할 수 있다고 가정합니다. 단일 응용 프로그램조차도 한 번에 두 가지 이상을 수행 할
아이템 77. 예외를 무시하지 말라.
이펙티브 자바 아이템 77. 예외를 무시하지 말라. catch블럭을 비워두면 예외의 존재 이유가 없어진다. 만약 예외를 무시하기로 결정했으면 이유를 주석으로 남기고 예외 변수 이름도 ignored로 바꿔놓도록 하자. 참조
아이템 76. 가능한 실패를 원자적으로 만들라.
이펙티브 자바 아이템 76. 가능한 실패를 원자적으로 만들라. 일반화 해서 말하자면 호출된 메서드가 실패 하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다. 이러한 특성을 실패 원자적(failure atomic)이라고 한다. 메서드를 원자적으로 만드는 방법 가장 간단한 방법은 불변객체로 설계하는 방법이다. 아래는
아이템 75. 예외의 상세 메시지에 실패 관련 정보를 담으라.
이펙티브 자바 아이템 75. 예외의 상세 메시지에 실패 관련 정보를 담으라. 실패 순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메시지에 담아야 된다. IndexOutOfBoundsException 에서 실패값을 온전히 포착하도록 수정해 보겠다. 위에 처럼 수정하면 좀 더 좋은 코드가 될수도 있
아이템 74. 매서드가 던지는 모든 예외를 문서화 하라.
이펙티브 자바 아이템 74. 매서드가 던지는 모든 예외를 문서화 하라. 검사 예외는 항상 따로따로 선언하고, 각 예외가 발생하는 상황을 자바독의 @throws 태그를 사용하여 정확하게 문서화 하자. 비검사 예외는 메서드 선언의 throws 목록에 넣지 말자.(비검사 예외도 문서화는 해야 된다.) 한클래스에 정의된 많은 메
Start and stop Wowza Streaming Engine
Start and stop Wowza Streaming Engine Streaming Engine OSX service standalone mode Streaming Engine Linux service OR OR standalone mode 확인은 http://[wowza ip address]:1935 여기로 접속 해보
Wowza Streaming Engine Java API로 라이브 스트림 녹화를 시작하고 중지하십시오
Wowza Streaming Engine Java API로 라이브 스트림 녹화를 시작하고 중지하십시오 위에 코드를 작성한 후에 ant 빌드후 인스톨한 위치의 lib 아래 jar 파일을 업로드 하면 된다. 그 다음엔 서버를 완전 재기동 필요함 참조
아이템 73. 추상화 수준에 맞는 예외를 던져라.
이펙티브 자바 아이템 73. 추상화 수준에 맞는 예외를 던져라. 상위 계층에서는 저수준의 예외를 잡아 자신에 추상화 수준에 맞는 예외를 던져야 된다.(exception translation) 1. 저수준의 예외가 도움이 되면 예외 연쇄를 이용하라.(exception chaining) 1. 무턱대고 예외를 던지는 것 보다는
Wowza 스트리밍 엔진에 Wowza GoCoder 인코딩 앱 연결
Wowza 스트리밍 엔진에 Wowza GoCoder 인코딩 앱 연결 Wowza GoCoder ™ 는 Apple iOS 및 Android 장치 용 RTSP 기반 모바일 실시간 스트리밍 인코딩 앱입니다. GoCoder 앱이있는 장치에서 Wowza Streaming Engine Manager를 실행중인 경우 Live Appli
Wowza IDE를 사용하여 Wowza 스트리밍 엔진 확장
Wowza IDE를 사용하여 Wowza 스트리밍 엔진 확장 Wowza ™ IDE는 Eclipse 통합 개발 환경에 대한 추가 기능으로 Java 프로젝트 및 클래스를 빌드하여 Wowza Streaming Engine ™ 미디어 서버 소프트웨어의 기능을 확장 및 향상시킬 수 있습니다. Wowza IDE는 Windows, Li
OutOfMemoryError Exception 의 이해
OutOfMemoryError Exception 의 이해 메모리 누수에 대한 한 가지 일반적인 표시는 java.lang.OutOfMemoryError 예외(Exception) 입니다. 일반적으로이 Java 힙 메모리에서 오브젝트를 할당하기에 불충분 한 공간이있을 때 발생합니다. 이 경우 가비지 컬렉터는 새 오브젝트를 수용
아이템 72. 표준 예외를 사용하라.
이펙티브 자바 아이템 72. 표준 예외를 사용하라. 표준 예외는 이미 익숙해서 다른사람이 익히기 쉽다. 그래서 가독성도 좋고 Exception, Throwable, Error, RuntimeException 은 직접 재사용하지 말자 예외 | 주요쓰임 | | IllegalArgumentException| 허용되지 않는 값이
아이템 71. 필요 없는 검사 예외 사용은 피하라.
이펙티브 자바 아이템 71. 필요 없는 검사 예외 사용은 피하라. 검사 예외는 꼭 필요한곳에 사용하면 프로그래밍 안정성을 높혀준다. 검사예외를 피하는 방법 1. 검사 예외를 회피하는 가장 쉬운 방법은 옵셔널이다. 1. 검사 예외를 던지는 메소드를 두개로 쪼개 비검사 예외로 바꿀수 있다.(이방식도 옵셔널과 비슷하다.) 참조
아이템 70. 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라.
이펙티브 자바 아이템 70. 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라. 자바는 throwable 타입으로 3가지가 있는데 하나는 검사 예외(checked exception), 런타임 예외(runtime exception), 에러(error) 이렇게 세가지를 제공한다. 호출하는 쪽에
아이템 69. 예외는 진짜 예외 상황에서만 사용하라.
이펙티브 자바 아이템 69. 예외는 진짜 예외 상황에서만 사용하라. 예외는 그 이름이 말해주듯이 진짜 예외 상황에서만 사용하라. 절대로 일상적인 흐름 제어용으로 사용하면 안된다. 잘 설계된 API라면 클라이언트가 정상적인 흐름 제어에서 예외를 사용할 일이 없게 해야 한다. 옵셔널, 상태 검사 메서드, 특정값(null) 중
아이템 68. 일반적으로 통용되는 명명 규칙을 따르라.
이펙티브 자바 아이템 68. 일반적으로 통용되는 명명 규칙을 따르라. 자바는 명명규칙이 잘 정의 되 있으며 자바언어 명세에 나타나 있다 명세에 따르는 명명규칙을 따라라. 패키지와 모듈 이름 1. 조직의 인터넷 도메인 이름을 역순으로 사용한다.(com.google, com.naver) 1. 예외 적으로 표준 라이브러리와 선
아이템 67. 최적화는 신중히 하라.
이펙티브 자바 아이템 67. 최적화는 신중히 하라. 모든 사람들이 새겨야 할 최적화 격언 맹목적인 어리석음을 포함해 그 어떤 핑계보다 효율성이라는 이름 아래 행해진 컴퓨팅 죄악이 더 많다 (심지어 효율을 높이지도 못하면서) 윌리엄 울프(Wulf72) (전체의 97% 정도인) 자그마한 효율성은 모두 잊자. 섣부른 최적화가
java native interface 소개
java native interface 소개 이 장에서는 Java Native Interface (JNI)에 대해 소개합니다 . JNI는 네이티브 프로그래밍 인터페이스입니다. Java Virtual Machine (VM) 내에서 실행되는 Java 코드가 C, C ++ 및 어셈블리와 같은 다른 프로그래밍 언어로 작성된 응용
아이템 66. 네이티브 매서드는 신중히 사용하라.
이펙티브 자바 아이템 66. 네이티브 매서드는 신중히 사용하라. 자바 네이티브 인터페이스(JNI)는 자바 프로그램이 C나 C++ 같은 네이티브 언어로 작성한 메소드를 말한다. 자바 네이티브 인터페이스의 주요 쓰임세 레지스터리 같은 플랫폼 특화 기능을 사용한다. 네이티브 코드로 작성된 기존 라이브러리를 사용한다. 성능 개선
도커 처음 시작하기part5(Stacks)
도커 처음 시작하기(Stacks) 전제조건 Docker 버전 1.13 이상을 설치하십시오. /) 에서 방향을 읽으십시오 . /) 에서 컨테이너를 만드는 방법에 대해 알아보십시오. /) 에서 서비스를 만드는 방법에 대해 알아보십시오 . friendlyhello 이미지를 레지스트리 로 푸시 하여 게시했는지 확인하십시오. 우리
도커 처음 시작하기part4(Swarm)
도커 처음 시작하기(Swarm) 전제조건 Docker 버전 1.13 이상을 설치하십시오. /) 에서 방향을 읽으십시오 . /) 에서 컨테이너를 만드는 방법에 대해 알아보십시오. /) 에서 서비스를 만드는 방법에 대해 알아보십시오 . friendlyhello 이미지를 레지스트리 로 푸시 하여 게시했는지 확인하십시오. 우리는
도커 처음 시작하기part3(서비스)
도커 처음 시작하기(서비스) 전제조건 Docker 버전 1.13 이상을 설치하십시오. /) 에서 방향을 읽으십시오 . /) 에서 컨테이너를 만드는 방법에 대해 알아보십시오 . friendlyhello 이미지를 레지스트리 로 푸시 하여 게시했는지 확인하십시오. 우리는 여기에 그 공유 된 이미지를 사용합니다. 이미지가 배포
Docker Compose 개요
Docker Compose 개요 Compose는 다중 컨테이너 Docker 응용 프로그램을 정의하고 실행하기위한 도구입니다. Compose를 사용하면 YAML 파일을 사용하여 응용 프로그램의 서비스를 구성 할 수 있습니다. 그런 다음 단일 명령으로 구성에서 모든 서비스를 작성하고 시작하십시오. Compose의 모든 기능에
아이템 65. 리플렉션 보다 인터페이스를 사용하라.
이펙티브 자바 아이템 65. 리플렉션 보다 인터페이스를 사용하라. 리플렉션의 단점 컴파일 타임 타입 검사가 주는 이점을 하나도 누릴수 없다. 리플렉션을 이용하면 코드가 지저분해지고 장황해진다. 성능이 떨어진다. 리플렉션은 아주 제한적으로만 사용해야 그 단점을 피하고 이점을 취할수 있다. 만약에 써야 되도 리플렉션은 인스턴
도커 처음 시작하기part2(컨테이너)
도커 처음 시작하기(컨테이너) 전제조건 Docker 버전 1.13 이상을 설치하십시오 . /)에서 사용방법을 익히세요 환경을 신속하게 테스트 하여 모든 설정이 완료 되었는지 확인 docker run hello world 소개 Docker 방식으로 앱을 제작할 차례입니다. 이 페이지가 다루는 컨테이너 인 해당 앱의 계층 구
도커 처음 시작하기part1(오리엔테이션 및 설정)
도커 처음 시작하기(오리엔테이션 및 설정) 환영! 우리는 Docker를 배우고 싶어서 기쁩니다. 도커 시작하기 자습서 하는 방법을 배웁니다 : 1. Docker 환경 설정 (이 페이지에서) 1. 이미지를 빌드하고 하나의 컨테이너로 실행하십시오. 1. 여러 컨테이너를 실행하도록 앱 크기 조정 1. 클러스터에 앱 배포 1.
아이템 64. 객체는 인터페이스를 사용해 참조하라.
이펙티브 자바 아이템 64. 객체는 인터페이스를 사용해 참조하라. 적합한 인터페이스가 있다면 매개변수 뿐 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라. 아래는 좋은 예로 인터페이스 타입을 사용하였다. 아래는 나쁜예로 클래스 타입을 사용하였다. 인터페이스 타입을 사용하는 습관을 길러두면 프로그래밍이 훨씬
GivenWhenThen
Given When Then Dan North 와 Chris Matts가 Behavior Driven Development (BDD)의 일환으로 개발 한 접근 방식입니다 . 필수 아이디어는 세 가지 섹션으로 시나리오 (또는 테스트)를 작성하는 것입니다. 코드로 풀어보면 아래처럼 위에 코드를 보면 hamcrest와 asse
아이템 63. 문자열 연결은 느리니 주의하라.
이펙티브 자바 아이템 63. 문자열 연결은 느리니 주의하라. 자바 6 이후로 성능개선이 많이 되었지만 문자열 연결은 여전히 느리다. += 연결 보다는 StringBuilder를 활용하는것이 좋다. 실행결과 결과는 여전히 StringBuilder를 사용했을때가 더 빠르다 참조
Google Java Style Guide
Google Java Style Guide 프로젝트를 시작할때 코딩컨벤션을 정하고 시작을 한다. 일단 팀원이 많거나 하면 서로 이야기 하면서 스타일 가이드를 맞추겠지만 혼자서 작성할때는 작성해서 프로젝트를 하기 쉽지 않다. 이럴때 구글 코드스타일 가이드를 활용한다. ide 마다 설정도 공유해줘서 셋팅하기 좋다 그리고 한가
아이템 62. 다른타입이 적절하다면 문자열 사용을 피하라.
이펙티브 자바 아이템 62. 다른타입이 적절하다면 문자열 사용을 피하라. 문자열은 다른 값을 대신하기 적절하지 않다. 숫자를 표현할때는 int, float 등등의 타입이 좋고 예/아니오는 boolean 타입이 좋다 문자열은 열거타입을 대신하기에 적합하지 않다. 상수를 열거할때 열거 타입이 훨씬 좋다. 문자열은 혼합타입을
spring data jpa repositorys로 작업하기(Query Methods 정의)
spring data jpa repositorys로 작업하기(Query Methods 정의) 저장소 프록시에는 메소드 이름에서 상점 특정 조회를 파생시키는 두 가지 방법이 있습니다. 메서드 이름에서 직접 쿼리를 파생시킵니다. 수동으로 정의 된 쿼리를 사용합니다. 사용 가능한 옵션은 실제 상점에 따라 다릅니다. 그러나 실제
spring data jpa repositorys로 작업하기(Repository Interfaces 정의)
spring data jpa repositorys로 작업하기(Repository Interfaces 정의) 먼저 도메인 클래스 별 저장소 인터페이스를 정의하십시오. 인터페이스는 Repository도메인 클래스와 ID 유형으로 확장 되고 유형화 되어야합니다. 해당 도메인 유형에 대해 CRUD 메소드를 노출하려면 Reposi
spring data jpa repositorys로 작업하기(핵심 개념 및 Query methods)
spring data jpa repositorys로 작업하기(핵심 개념 및 Query methods) 핵심개념 스프링 데이터 저장소 추상화의 중심 Repository 인터페이스는 다음과 같습니다. 도메인 클래스의 ID 유형뿐만 아니라 관리 할 도메인 클래스도 유형 인수로 사용합니다. 이 인터페이스는 주로 작업 할 유형을
아이템 61. 박싱된 기본타입 보단 기본타입을 사용하라.
이펙티브 자바 아이템 61. 박싱된 기본타입 보단 기본타입을 사용하라. 자바의 데이터 타입은 크게 두가지로 나눌수 있다. 기본 타입 : boolean, short, int, long, float, double, char 참조 타입 : String, List 기본 타입 |박싱된 기본타입(Wrapper Class) | byt
Apache Maven에서 빌드 마이그레이션하기
Apache Maven에서 빌드 마이그레이션하기 Apache Maven 은 널리 사용되는 Java 및 기타 JVM 기반 프로젝트 용 빌드 도구이므로 Gradle을 사용하려는 사람들은 종종 기존 Maven 빌드를 마이그레이션해야합니다. 이 가이드는 두 도구 모델 간의 차이점과 유사점을 설명하고 프로세스를 쉽게 수행 할 수있
Gradle vs Maven 비교
Gradle vs Maven 비교 유연성(Flexibility) 구글에서 안드로이드 공식 빌드 도구를 Gradle로 선택함 Gradle이 확장가능한 방식으로 모델링 되었기 때문이다. Maven은 커스터마이징을 힘들고 때로는 불가능하게 엄격한 모델을 제공한다. 이것은 Maven 빌드를 더 쉽게 이해할 수 있지만, 특별한 요
아이템 60. 정확한 답이 필요하면 float와 double 은 피하라
이펙티브 자바 아이템 60. 정확한 답이 필요하면 float와 double 은 피하라 개발을 할때 floating point 문제에 직면하게 되는데 그 내용에 대해서 푸는 문제이다. 먼저 아래 코드를 보면 실행결과 위에 결과가 전혀 다르게 나오게 된다 float와 double금융타입의 계산과는 맞지 않다. 그럼 대안으로는
영상 관련 기술의 기초
영상 관련 기술의 기초 홍영훈 cto 님의 교육 이미지 점(pixel)들의 집합이다. 동영상 영상은 이미지들의 연속적 표현의 결과이고 우리가 아는 동영상은 영상과 오디오 데이터가 시간에 맞춰서 화면과 스피커로 출력되는 결과물이다. 영상에서 각각의 이미지는 특정 시간대의 화면을 표현하게 되는데 이를 frame이라고 칭한다.
아이템 59. 라이브러리를 익히고 사용하라.
이펙티브 자바 아이템 59. 라이브러리를 익히고 사용하라. 실행결과 위 코드는 문제가 있는데 보면 low가 50만개가 출력 되어야 되는데 66만개 이상 출력이 된다. 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 프로그래머들의 지식을 활용할수도 있다. 위에는 java 9에 추가된
아이템 58. 전통적인 for문 보다는 for-each문을 사용하라.
이펙티브 자바 아이템 58. 전통적인 for문 보다는 for each문을 사용하라. 위에는 전통적인 for문이다. 위에 관용구 들은 while 문보다는 좋지만 가장 좋은 코드는 아니다. 실행결과 위에 코드를 수정해 보면 실행결과 그럼 향상된 for문을 사용하면 실행결과 또다른 케이스로는 실행결과 foreach문을 사용할수
아이템 57. 지역변수 범위를 최소화 하라.
이펙티브 자바 아이템 57. 지역변수 범위를 최소화 하라. 지역 변수의 범위를 최소화 하는 방법 지역 변수의 범위를 줄이는 가장 강력한 방법은 가장 처음 쓰일때 선언하기 이다. 거의 모든 지역변수는 선언과 동시에 초기화 해야 된다. 메서드를 작게 유지하고 한가지 기능에 충실하는것이다. 참조
아이템 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라.
이펙티브 자바 아이템 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라. 여러분의 API를 올바로 문서화하려면 공개된 모든 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 달아야 된다. 메서드 주석에서는 HOW가 아닌 WHAT을 기술해야 된다. 한클래스 안에 설명이 똑같은 맴버가 둘이상이면 안된다. 제네
아이템 55. 옵셔널 반환은 신중히 하라.
이펙티브 자바 아이템 55. 옵셔널 반환은 신중히 하라. 실행결과 위에 코드는 IllegalArgumentException을 발생시켜서 체크를 한다 위에서는 Optional을 사용하는것이 더 좋다고 했는데 바꾼 코드를 보면 실행결과 위처럼 옵셔널을 반환하는 메소드에는 절대로 null을 반환하지 말자 실행결과 위 처럼 옵셔
아이템 54. null이 아닌 빈컬렉션이나 배열을 반환하라.
이펙티브 자바 아이템 54. null이 아닌 빈컬렉션이나 배열을 반환하라. 실행결과 위에 코드는 흔하게 볼수 있는 코드이다 여기서 getCheeses()에서 null을 반환하는것보다 빈 컬렉션을 반환하는 것이 좋다. 빈컬렉션을 반환하는 일차 코드는 위처럼 바꿀수 있다. 위 코드는 매번 빈 콜렉션을 할당하니 다시 한번 바꿔
아이템 53. 가변인수(varargs)는 신중히 사용하라.
이펙티브 자바 아이템 53. 가변인수(varargs)는 신중히 사용하라. 가변인수(varargs) 메서드는 몇시한 타입의 인수를 0개 이상 받을수 있다. 실행결과 위에 코드는 간단한 가변인수의 활용예 이다. 또 인수가 하나이상이어야 할수도 있다. 코드를 바꿔보면 실행결과 위에 코드는 문제 점이 있다. 런타임에야 코드가 실
아이템 52. 다중정의(overloading)는 신중히 사용하라.
이펙티브 자바 아이템 52. 다중정의(overloading)는 신중히 사용하라. 실행결과 위에 코드는 집합 리스트 그외를 차례대로 출력할것 같지만, 실제로는 그외만 3번 출력된다. 다중정의(overloading)된 메소드(classify)중 어떤것을 호출할지는 런타임시에 정해진다. 위에 보면 for문에서 Collectio
아이템 51. 메서드 시그니처를 신중하게 설계하라.
이펙티브 자바 아이템 51. 메서드 시그니처를 신중하게 설계하라. 메서드 이름을 신중하게 짓자 편의 메서드를 너무 많이 만들지 말자 확신이 서지 않으면 만들지 말자. 매개변수 목록은 짧게 유지하자. 같은 타입의 매개변수가 연달아 나오는 경우가 특히 해롭다. 매개변수 타입으로는 클래스 보다 인터페이스가 낫다. hashmap
아이템 50. 적시에 방어적 복사본을 만들어라.
이펙티브 자바 아이템 50. 적시에 방어적 복사본을 만들어라. 클라이언트가 여러분의 불변식을 깨뜨릴려고 혈안이 되있다고 가정하고 방어적으로 프로그래밍 해야 한다. 위에 코드는 보면 불변식을 지키는것 같아 그럼 식을 깨뜨리는 방법을 써보면 실행결과 위에 처럼 참조가 열려 있으므로 생성시점과는 상관 없이 불변식을 깨뜨릴수 있
아이템 49. 매개변수가 유효한지 검사하라.
이펙티브 자바 아이템 49. 매개변수가 유효한지 검사하라. 매서드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족하기를 바란다. 이러한 제약은 반드시 문서화해야 되며 몸체가 실행되기전 검사해야된다. java 7에 추가된 requireNonNull 매서드는 유연하고 사용하기도 편하니 더이상 null 검사를 수동으로
아이템 48. 스트림 병렬화는 주의해서 적용하라.
이펙티브 자바 아이템 48. 스트림 병렬화는 주의해서 적용하라. 스트림 병렬화를 하면 어떻게 될까? 위에 소스는 응답하지 않는다. 이유는 데이터 소스가 Stream.iterate거가 중간연산으로 limt를 쓰면 파이브라인 병렬화로 성능을 개선할수 없다. 대체로 스트림의 소스가 ArrayList, HashMap, HashS
아이템 47. 반환타입으로 스트림보다 컬렉션이 낫다.
이펙티브 자바 아이템 47. 반환타입으로 스트림보다 컬렉션이 낫다. 반환타입으로 스트림보다 컬렉션이 나은 이유가 둘다 iterable을 구현하고 있지만 스트림은 iterable을 extend 하지 않아서 loop문이 정상적으로 동작 되지 않는다. 그래서 스트림으로 반환하면 무조건 forEach문을 사용해야 된다 그래서 선
아이템 46. 스트림에서는 부작용 없는 함수를 사용하라
이펙티브 자바 아이템 46. 스트림에서는 부작용 없는 함수를 사용하라. 스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성하는 부분이다. 이때 각 단계는 가능한 한 이전 단계의 결과를 받아 처리 하는 순수 함수여야 한다. 순수 함수란 입력만이 결과에 영향을 주는 함수이다. 그래서 side effect가 없어야 된다.
아이템 45. 스트림은 주의해서 사용해라
이펙티브 자바 아이템 45. 스트림은 주의해서 사용해라 자바8에 추가된 스트림 API 핵심은 두가지 이다. 스트림은 데이터 원소의 유한 혹은 무한 시퀀스를 뜻한다. 스트림 파이프 라인은 이 원소들이 수행하는 원소 단계를 뜻한다. 스트림 파이프라인은 소스 스트림으로 시작되 종단 연산으로 끝나며, 그 사이에 하나 이상의 중간
java stream 예제
java stream 예제 여기에 글을 번역한 것입니다. 이 예제 중심 자습서에서는 Java 8 스트림에 대한 심층적 인 개요를 제공합니다. StreamAPI 에 대해 처음 읽었을 때 Java I / O InputStream와 비슷하게 들리며 이름에 대해 혼란스러워했습니다 OutputStream. 하지만 Java 8 스트
인터페이스 default 메소드로 기존 인터페이스를 해치지 않게 확장 하기
인터페이스 default 메소드로 기존 인터페이스를 해치지 않게 확장 하기 위에 인터페이스를 상속받아 구현한 케이스 실행결과 위에 인터페이스에 하나를 추가하면 상속받은 클래스에서 컴파일 에러가 난다. 여기서 편하게 추가 할수있는 방법은 실행결과 그럼 이런 경우에는 한번 보자 컴파일 메시지 같은 이름에 동일한 디폴트 메소드
아이템 44. 표준함수형 인터페이스를 사용하라.
이펙티브 자바 아이템 44. 표준함수형 인터페이스를 사용하라. 자바가 람다를 지원하면서 API를 작성하는 모범사례도 바뀌게 되었다. 상위클래스의 기본 클래스를 재정의 하여 원하는 동작을 하게 만드는 템플릿 메서드 패턴의 매력이 크게 줄었다. 먼저 함수형 인터페이스에 대해서 알아보자 위에 형태가 가장 기본적인 함수형 인터페
아이템 43. 람다보다 매서드 참조를 사용하라.
이펙티브 자바 아이템 43. 람다보다 매서드 참조를 사용하라. 람다가 익명 클래스보다 가장 큰 나은점은 간결함이다. 자바에서 람다 보다 더 간결하게 만들수 있는것이 있는데 그것은 메서드 참조이다. 실행결과 위에선 람다를 사용한 경우 코드 이다. 다시 메서드 참조를 사용하면 실행결과 코드가 간결해진다. 그럼 반대의 경우는
Apache JMeter로 부하테스트 하기
Apache JMeter로 부하테스트 하기 위에 제이미터 사이트에서 다운로드를 합니다. 파일 압축을 풀고 폴더에 들어가서 jmeter.bat를 실행합니다. 그럼 실행이 되는데 전 tps 그래프가 보고 싶으니 플러그인을 깔겠습니다 위에 사이트에서 다운로드를 받고 lib/ext 폴더에 넣어 준다 다시 실행하면 Options
메소드 레퍼런스(Method References)
메소드 레퍼런스(Method References) 당신은 사용 람다 표현식을 익명 메소드를 만들 수 있습니다. 그러나 때로는 람다식이 기존 메서드를 호출하는 것 외에는 아무것도 수행하지 않습니다. 이러한 경우 기존 방법을 이름으로 언급하는 것이 더 명확합니다. 메서드 참조를 사용하면이 작업을 수행 할 수 있습니다. 그들은
아이템 42. 익명클래스 보다 람다를 사용하라.
이펙티브 자바 아이템 42. 익명클래스 보다 람다를 사용하라. jdk 1.1부터 익명클래스를 사용했는데 jdk1.8에서 람다식을 적용하면서 코드를 더 짧게 가지고 갈수 있게 되었다. 자질구래한 코드들은 사라지고 어떻게 동작하는지에 초점을 맞추게 될수 있는 코드가 되었다. 자바에서 함수타입을 표현할때 추상메서드 하나만 담은
아이템 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라.
이펙티브 자바 아이템 41. 정의하려는 것이 타입(ElementType.TYPE)이라면 마커 인터페이스를 사용하라. 아무 구현이 없고 단지 자기를 구현하는 클래스가 특성 속성을 가짐을 표시해주는것 인터페이스를 마커인터페이스라고 한다. 대표적인 예가 Serializable이다 그럼 코드를 보면 마커인터페이스는 두가지 측면에
IDE 별 프로퍼티 인코딩에 따른 설정
IDE 별 프로퍼티 인코딩에 따른 설정 이클립스와 인텔리제이의 인코딩에 따른 주석 코드에 변화가 있다. 아래를 보면 처음엔 이클립스에서 작성한 프로퍼티를 보면 그 다음엔 인텔리제이로 수정을 하면 위에 설정을 체크 하고 보면 수정됨 그렇게 되면 기존 과 코드가 틀리다 \uc811에서 \uC811 이런식으로 대문자로 바꿘다
아이템 40. @Override 에너테이션을 일관성 있게 사용하라.
이펙티브 자바 아이템 40. @Override 에너테이션을 일관성 있게 사용하라. @Override를 달면 재정의를 잘못하는 경우를 알려준다 아래의 예를 보자. 실행결과 위에 코드에서 버그를 찾아 보자 위에서는 equals를 재정의 하려고 한것 처럼 보인다 그래서 일반규약인 hashCode도 재정의 했다. 그런데 위에는
데이터 베이스 코드 테이블의 값을 Enum 으로 바꾸기
데이터 베이스 코드 테이블의 값을 Enum 으로 바꾸기 일단 데이터 베이스에서 공통을 정의 하고 많이 쓰실텐데 코드에서 들어 오는 값이랑 DB 값이랑 불일치 하는 경우가 있다. java 1.5 이전 버전에는 아래 처럼 선언 하고 썼다. 위에 코드에 선택을 하려고 swich 문까지 써서 실행결과 위에 코드를 enum으로 바
아이템 39. 명명 패턴보다는 애너테이션을 사용하라
이펙티브 자바 아이템 39. 명명 패턴보다는 애너테이션을 사용하라 junit3 버전과 junit4 버전에 차이점을 보면 테스트 메소드가 무조건 test라는 단어로 시작이 되어야 되었는데 junit4버전은 @Test 어너테이션으로 대체 되었다. 명명 패턴에 문제점 1. 오타가 나면 안된다. 1. 올바른 프로그램 요소만 사용
JDK ArrayList는 왜 List를 implement를 하고 있나요?
JDK ArrayList는 왜 List를 implement를 하고 있나요? Arrays 클래스 위에서 보면 ArrayList는 List를 implements하지 않고 아래의 ArrayList는 하고 있다. AbstractList가 이미 그 구현을 선언했다면 List 인터페이스의 구현을 다시 선언 할 필요가 없습니다. 이
코딜러티 문제(binary gap)
코딜러티 문제(binary gap) 코딜러티 문제를 풀어 봤는데요 전 자바 버전으로 풀었습니다. 스텍오버플로우에서 다른사람 풀이도 보니 다르게 푸는것을 보는 재미가 있었습니다. 1과 1사이의 인덱스를 가지고 푼 예가 없어서 스텍오버플로에 답변으로 남겼습니다. 참조
java_annotations
Annotation Annotation(메타 데이터의 한 형태)은 프로그램 자체에 포함되지 않은 프로그램에 대한 데이터를 제공합니다. Annotation은 Annotation이 달린 코드의 작동에 직접적인 영향을 미치지 않습니다. Annotations에는 다음과 같은 여러 가지 용도가 있습니다. Information fo
아이템 38. 확장할수있는 열거 타입이 필요하면 인터페이스를 사용하라.
이펙티브 자바 아이템 38. 확장할수있는 열거 타입이 필요하면 인터페이스를 사용하라. 위에 처럼 인터페이스를 사용하여 Operation을 확장할수 있다. 다시 2개의 오퍼레이션을 확장 시키면 이렇게 확장을 하면 기존 연산에 쓰던 곳에서 계속 확장된것도 사용할수 있다. 테스트 코드를 다시 작성해서 돌려보면 실행결과 위에 코
아이템 37. ordinal indexing 대신 EnumMap을 사용하라.
이펙티브 자바 아이템 37. ordinal indexing 대신 EnumMap을 사용하라. 실행결과 위에 코드에는 문제점이 많다 배열을 사용해서 제네릭을 사용하지도 못했고 그래서 문제가 될 소지들이 있고 앞에서 말했던 잘못된 동작을 할수있는 사항이 많다 이런 상황에서는 EnumMap이 존재한다 EnumMap으로 대체한 코
아이템 36. 비트필드 대신 EnumSet을 사용하라
이펙티브 자바 아이템 36. 비트필드 대신 EnumSet을 사용하라 실행결과 이렇게 사용하는것을 비트필드라고 한다 이렇게 하는것은 집합연산을 통해서 하나의 값을 쓸려고 하는것이다. 이것은 구닥다리 스타일이다. 이것을 enumset을 이용하면 아래의 코드이다. 실행결과 열거할수 있는 타입을 한데 모아 집합 형태로 사용한다고
아이템 35. ordinals 메서드 대신 instance fields를 사용하라
이펙티브 자바 아이템 35. ordinals 메서드 대신 instance fields를 사용하라 실행결과 위에서 ordinal() 메소드를 사용했는데 이것은 문제가 많다 일단 중간에 다른 값이 들어간다고 하면 값이 바뀌게 된다 실행결과 OCTET2를 추가하면 결과값이 바뀌게 된다. java doc를 보면 아래 처럼 Mos
아이템 34. int 상수 대신 열거 타입을 사용하라.
이펙티브 자바 아이템 34. int 상수 대신 열거 타입을 사용하라. 위에 정수 열거 패턴에는 단점들이 많다. 실제로 오렌지와 사과의 이름이 동일한것이 있으면 같은것을 구분하기 위해 앞에 명칭에 오렌지를 붙혀야 했다. 실행결과 그리고 위에 코드 처럼 오렌지를 보내야 하는 클래스에 사과를 보내도 문제가 생기지 않는다. 문자
Enum Types
Enum Types 자바 열거는 상수의 집합을 정의하는 데 사용되는 특수 자바 유형입니다. 보다 정확하게는 Java enum 유형은 특별한 종류의 Java 클래스입니다. 열거 형은 상수, 메소드 등을 포함 할 수 있습니다. 자바 열거 형은 Java 5에 추가되었습니다. Enum 예제 다음은 간단한 Java enum 예제입
아이템 33. 타입안전 이종컨테이너를 고려하라.
이펙티브 자바 아이템 33. 타입안전 이종컨테이너를 고려하라. 실행결과 위에 코드 처럼 간단하게 타입안전 이종 컨테이너를 구현할수있는데 여기서 2가지 문제 점이 있다. 악의적인 클라이언트가 Class객체를 제네릭이 아닌 로타입으로 넘기면 타입안정성이 깨진다. 실행결과 위에 코드에서 f.putFavorite((Class)I
Neal Gafter's Super Type Tokens
Neal Gafter's Super Type Tokens jdk 5 generics 추가 되면서 java.lang.Class를 제네릭 타입으로 바꿀수 있다 예를 들면 String.class를 지금은 Class<String 으로 Joshua Bloch 말하는 THC, or Typesafe Heterogenous Contai
아이템 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라.
이펙티브 자바 아이템 32. 제네릭과 가변인수를 함께 쓸 때는 신중하라. 가변인수(varargs) 메서드와 제네릭은 자바 5 때 함께 추가되었으므로 서로 시너지 효과가 날꺼라고 예상하는데 그렇지가 않다. 가변인수는 인수의 갯수를 클라이언트에서 조절할수 있게 해주는데 구현방식에서 헛점이 있다. 가변인수를 사용하면 배열이 하
java_가변인수(varargs)
가변인수(varargs) Java 메소드를 생성한다고 가정합시다 . 그러나 메소드가 받아 들일 인수가 얼마나 많은지 확실하지 않습니다. 이 문제를 해결하기 위해 Java 1.5에서는 가변 인수가 도입되었습니다. Varargs는 가변 인수에 대한 짧은 이름입니다. Java에서 메소드의 인수는 임의의 수의 값을 허용 할 수
레디스 클러스터 에러
레디스 클러스터 에러 현재 운영시스템에서 레디스를 클러스터로 운영하고 있는데 운영중인 클러스터에 장비 하나가 셧다운 되면서 슬래이브가 마스터로 승격이 되는 과정이 있었는데 이과정에서 운영중인 클라이언트쪽이 문제가 생겨서 서비스에 장애가 생겼다. 운영중인 환경은 자바로 만들어진 환경이며 지금 jedis를 사용하고 있다. j
아이템 31. 한정적 와일드카드를 사용해 API의 유연성을 높혀라.
이펙티브 자바 아이템 31. 한정적 와일드카드를 사용해 API의 유연성을 높혀라. 컴파일에러 위와 같은 에러가 난다. 보기에는 당연히 되어야 할것 같은데 에러가 난다. 제네릭은 불공변이기 때문이다. 실행결과 위에 처럼 자바에서는 이런상황을 대처하기 위해 와일드 카트 타입을 지원한다. 유연성을 극대화 하기위해서는 생산자나
아이템 30. 이왕이면 제네릭 메서드로 만들어라
이펙티브 자바 아이템 30. 이왕이면 제네릭 메서드로 만들어라 컴파일 메시지 위처럼 메시지가 나오는데 수정을 하면 메시지는 없고 정상적으로 나온다. 실행결과 실행결과 참조
자바 컴파일러 옵션추가
자바 컴파일러 옵션추가 위에 옵션을 추가 해서 상세 로그를 보려고 할때 추가 시키는 위치 이다. 먼저 인텔리 제이에서 방법 먼저 상단 메뉴의 file을 클릭후애 setting으로 들어가면 아래의 메뉴에 존재 한다. 위에 보면 추가된 위치에 추가 시켜 주면 아래의 메시지 창에서 확인 할수 있다. 참조
아이템 29. 이왕이면 제네릭타입으로 만들어라
이펙티브 자바 아이템 29. 이왕이면 제네릭타입으로 만들어라 에서 만들었던 Stack 클래스를 제네릭타입으로 변환하는것이다. 위와 같은 코드가 있는데 배열을 제거 하는 방법이 2가지 있다. 아래는 첫번째 방법으로 elements의 타입을 E로 변환시켜서 하지만 new E[] 배열이 생성되지 않는다 그래서 Object[]을
레디스 접속용 클라이언트
레디스 접속용 클라이언트 레디스 접속용 클라이언트가 몇개 없는데 그중에 RedisDesktopManager가 제일 편한거 같은데 언제부터인지 클러스터 모드로 셋팅된 레디스에 접속시에 데이터가 모든 node에 있는것 처럼보이고 데이터도 잘보이지 않는다. 버전 별로 테스트 해보니 버전이 제일 맘에 들어서 사용중이다. 위 버전
아이템 28. 배열보단 리스트를 사용하라
이펙티브 자바 아이템 28. 배열보단 리스트를 사용하라 배열은 A가 B의 하위 타입이면 A[]이 B[]의 하위타입이다. 하지만 제네릭은 List< A 가 List< B 의 하위타입은 아니다 그래서 불변이다. 어떻게 보면 제네릭이 문제가 있는것 처럼 보이지만 문제는 배열이다. 실행결과 위에 코드는 컴파일시에는 문제가 없지만
아이템 27. 비검사 경고를 제거하라
이펙티브 자바 아이템 27. 비검사 경고를 제거하라 제네릭을 사용하면 비검사경고가 많이 보일것이다 가능한 비검사 에러를 제거 하자. 컴파일 명령줄 인수에 Xlint:unchecked를 추가하면 자세한 코멘트가 보인다. 만약 타입 안정성이 확보 되었다고 판단되면 @SuppressWarnings("unchecked") 사용하
java xlint 옵션에 대한 설명
javac Xlint options xlint 옵션에 대한 설명 실행은 Xlint:name 으로 하고 name은 아래의 이름중 하나 입니다. cast : 불필요한 cast에 대해서 경고를 나타냅니다. classfile : 클래스 파일에 대한 문제에 대해 나타냅니다. deprecation : deprecated 된것을 사용
코드리뷰(code review)
코드리뷰(code review) 지금까지 소프트웨어 개발 회사를 다니면서 명시적으로나 암묵적으로나 코드리뷰를 했던 경험이 있습니다. 그런데 코드리뷰 후가 문제가 되는 경우가 있다. 사실 코드에서 에러가 나지는 않지만 명시적이지 않은 변수명 및 기능은 바꼈지만 이름이 바뀌지 않아서 (예를 들면 큐에 이름이 클릭뷰였는데 큐가
아이템 26. raw 타입은 사용하지 말자.
이펙티브 자바 아이템 26. raw 타입은 사용하지 말자. 실행결과 위에 처럼 raw 타입을 선언하면 런타임 익셉션에 노출되어 있다. 컴파일시에 에러 위에 코드에서 타입을 선언하면 주석을 선언 할필요없이 코드에 어떤 값이 들어갈지 녹아 들어가있다. 그리고 컴파일시에 타입에러가 나온다 raw타입을 활용하면 제네릭이 주는 안
아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라
이펙티브 자바 아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라 소스파일에 톱레벨 클래스를 여러게 만들어도 자바 컴파일러는 문제가 없다. 아래는 Utensil.java 클래스에 톱레벨 클래스를 두개 지정해도 정상적이다. 위처럼 톱레벨클래스를 2개를 하나에 파일에 작성하게 되면 원치 않는 결과를 나타낼수도 있다. 위
아이템 24. 맴버클래스는 되도록 static으로 만들자
이펙티브 자바 아이템 24. 맴버클래스는 되도록 static으로 만들자 ava 프로그래밍 언어를 사용하면 다른 클래스에서 클래스를 정의 할 수 있습니다. 이러한 클래스는 중첩 클래스(Nested Classes) 라고하며 여기에 설명되어 있습니다. 중첩 클래스는 정적 및 비 정적이라는 두 가지 범주로 나뉩니다. static
아이템 23. 테그달린 클래스보다 클래스 계층구조를 활용하라.
이펙티브 자바 아이템 23. 테그달린 클래스보다 클래스 계층구조를 활용하라. 테그 달린 클래스의 단점은 여러 구현이 하나의 클래스에 담겨서 장황하고 오류를 내기 쉬우며 비효율 적이다. 테그 달린 구조는 클래스 계층구조의 아류일뿐이다. 위에는 테그달린 코드인데 장황하게 쓸때 없는 switch문 그리고 enum등이 들어가게
아이템 22. 인터페이스는 타입을 정의하는 용도로만 사용하라
이펙티브 자바 아이템 22. 인터페이스는 타입을 정의하는 용도로만 사용하라 상수인터페이스 안티패턴은 인터페이스를 잘못 사용한 예다. java.io.ObjectStreamConstants 등 자바의 상수형 인터페이스 상수형 인터페이스를 삼으면 구현체에서 PhysicalConstants.AVOGADROS NUMBER 이런식으
아이템 21. 인터페이스를 구현하는 쪽을 생각해 설계하라.
이펙티브 자바 아이템 21. 인터페이스를 구현하는 쪽을 생각해 설계하라. java 8 이전에는 인터페이스를 해치지 않고 메서드를 추가할 방법이 없었지만 지금은 default 메소드가 생겼다. 그렇다고 해서 모든 위험이 사라진것은 아니다. 생각할수 있느 모든상황에서 불변식을 해치지 않는 디폴트메소드를 작성하는것은 어려운 법
Java의 SimpleDateFormat은 thread-safe 하지 않다. multi-threaded 환경에서 조심히 사용하자
Java의 SimpleDateFormat은 thread safe 하지 않다. multi threaded 환경에서 조심히 사용하자 실행결과 음 위에 코드에서는 parse 부분에서는 에러가 나는데 format 부분은 문제가 없었다. 그래서 java doc를 찾아 보았다 그랬더니 Synchronization 부분이 존재하는데
아이템 20. 추상 클래스 보다는 인터페이스를 우선하라
이펙티브 자바 아이템 20. 추상 클래스 보다는 인터페이스를 우선하라 자바는 단일상속만 되니 추상클래스는 단 하나만 구현할수 있다. 인터페이스는 어떠한 상속을 했던간에 인터페이스가 선언한 메소드를 구현하고 있으면 같은 타입으로 인식한다. 그래서 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해 넣을수 있다. 인터페이스의
아이템 19. 상속을 고려하고 설계하고 문서화 하라 그렇지 않으면 상속을 금지하라
이펙티브 자바 아이템 19. 상속을 고려하고 설계하고 문서화 하라 그렇지 않으면 상속을 금지하라 상속용 클래스는 재정의 할수 있는 매서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 된다. 이부분은 바로 직전 아이템인 18번에서 나왔듯이 상속을 했지만 내부사용을 상세하게 몰라서 메소드의 오작동을 이르켰다. 이부분은 문서
아이템 18. 상속보단 컴포지션을 사용하라
이펙티브 자바 아이템 18. 상속보단 컴포지션을 사용하라 상속은 코드를 재사용하는 강력한 수단이지만 항상 최선은 아니다. 상속의 단점 매서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 실행결과 위에서 실행결과를 3으로 예측했지만 6이 나왔다 문제점은 HashSet의 addAll메소드에 있다. 위에 코드에서 보면 내부적으로 a
아이템 17. 변경가능성을 최소화하라.
이펙티브 자바 아이템 17. 변경가능성을 최소화하라. 불변 클래스란 인스턴스의 내부 값을 수정할 수 없는 클래스다. 불변 인스턴스에 간직한 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는다. 클래스를 불변으로 만들려면 다음 다섯 가지 규칙을 따르면 된다. 객체의 상태를 변경하는 매서드를 제공하지 않는다. 클래
아이템 16. public classes에는 public fields를 사용하지 말고 접근 메소드를 사용해라.
이펙티브 자바 아이템 16. public classes에는 public fields를 사용하지 말고 접근 메소드를 사용해라. 위와 같은 클래스는 public fields를 통해서 접근이 가능하다 하지만 저런식으로 작성하면 캡슐화의 이점을 살리지 못하고 이렇게 되면 클라이언트 코드를 수정하지 않고 해당 정보를 수정할수 없다
아이템 15. 클래스와 맴버의 접근권한을 최소화 하라.
이펙티브 자바 아이템 15. 클래스와 맴버의 접근권한을 최소화 하라. 잘 설계된 컨포넌트와 어설프게 설계된 컨포넌트에 차이점은 내구 구현 정보와 데이터를 얼마나 잘숨겼는지에 따른다. 이런것을 은닉화라고 한다. 정보 은닉의 장점 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다. 시스템 관리 비용
아이템 14. Comparable을 구현할지 고려하라.
이펙티브 자바 아이템 14. Comparable을 구현할지 고려하라. Comparable 인터페이스의 유일무이한 메서드인 CompareTo메서드는 이번장에서 다룬 다른 메소드들과 달리 Object 메소드가 아니다. 성격은 두가지만 빼면 Object의 equals와 같다. 다른점은 단순 동치성 비교에 더해 순서까지 비교할
스프링 배치 처음 따라하기 튜토리얼
스프링 배치 처음 따라하기 튜토리얼 먼저 지금 회사에 배치서비스를 만드는데 corontab에 등록을 시켜서 java main을 실행 그것을 통해서 배치 서비스를 실행 시킨다 해당 코드는 전체 백엔드와 통합이 되어 실행이 되며 그것으로 인해 의존성 라이브러리등 값을 vm 옵션을 통해서 주고 있다. 위에 방법을 하니 매번 배
아이템 13. clone 재정의는 주의해서 진행하라.
이펙티브 자바 아이템 13. clone 재정의는 주의해서 진행하라. Cloneable을 구현한 클래스는 clone 메소드를 public으로 제공하고 사용자는 복제가 당연히 제대로 이뤄 질꺼라고 생각한다. clone 메소드의 일반규약 위에 일반규약으로 만든 클래스를 보겠다. 실행 결과 위에 코드는 일반적인 객체를 참고 하는
아이템 12. toString은 항상 재정의 하라.
이펙티브 자바 아이템 12. toString은 항상 재정의 하라. Object의 toString은 우리에게 필요한 정보는 보이는것이 아니라 클래스이름@16진수 해시코드를 반환할뿐이다. equals와 hashcode 처럼 대단히 중요하진 않지만 toString은 항상 재정의 하는것이 좋다. 그럼 PhoneNumber클래스를
아이템 11. equals를 재정의 하려면 hashcode도 재정의 하라
이펙티브 자바 아이템 11. equals를 재정의 하려면 hashcode도 재정의 하라 equals를 재정의한 클래스에서 hashcode도 재정의 해야된다 그렇지 않으면 hashcode의 일반규약을 어기게 되어 해당 클래스를 hashmap, hashset 같은 컬렉션의 원소로 사용될때 문제를 일으킬것이다. hashcode
아이템 10. equals는 일반규약을 지켜서 재정의 하라
이펙티브 자바 아이템 10. equals는 일반규약을 지켜서 재정의 하라 equals는 재정의 하기 쉬워 보이지만 어렵다. 아래 사항중 하나라도 판단이 되면 재정의 하지 말자 각 인스턴스가 본질적으로 고유하다. 인스턴스의 논리적 동치성을 검사할일이 없다. 상위 클래스에서 재정의한 equals가 하위 클래스에서 들어 맞는다
hashcode () 및 equals ()를 사용한 작업
hashcode () 및 equals ()를 사용한 작업 java.lang.Object 에서는 equals () 와 hashcode ()의 2 개의 중요한 오브젝트 비교 메소드를 제공합니다. 기본구현 equals (Object obj) : ava.lang.Object 가 제공하는 메소드 로, 인수로서 건네진 다른 객체가
아이템 9. try-finally 보다 try-with-resources 블럭을 사용하세요
이펙티브 자바 아이템 9. try finally 보다 try with resources 블럭을 사용하세요 일단 단점은 코드가 너무 지저분해진다. 두번째는 위에 코드에서 기기에서 문제가 생기면 in.read에서도 문제가 생길수 있고 close 할때도 문제가 생길수 있다. 위에 코드를 변경시키면 Try with Resourc
scouter APM 배치 모니터링
scouter APM 배치 모니터링 스카우트 APM을 아주 잘 사용하고 있는데 내부적으로 http 서비스 왜에 쿼츠 스케줄을 통해서 백엔드로 돌아가는것이 있는데 추적이 되지 않아 추적하기 위한 설정을 하였다. 아래의 링크 NON HTTP 서비스 추적하기를 통해서 많은 도움이 되었다. 먼저 해당서비스에 hook servic
아이템 8. Finalizer와 Cleaner의 사용은 피하라
이펙티브 자바 아이템 8. Finalizer와 Cleaner의 사용은 피하라 finalize() 메소드에 대한 설명 jdk 9 C++에서의 destructor랑 다른것이다 자바에서 자원 반납은 try with resources또는 try finally 블럭을 통해서 한다. 단점 1. 언제 실행 할지 알수가 없다. gc의
Memory Management in the Java HotSpot™ Virtual Machine(Sun Microsystems April 2006)
Memory Management in the Java HotSpot™ Virtual Machine(Sun Microsystems April 2006) 1 Introduction Java ™ 2 Platform, Standard Edition (J2SE ™)의 장점 중 하나는 자동 메모리를 수행한다는 것입니다 이로써 개발자
자바의 레퍼런스 타입
자바의 레퍼런스 타입 자바의 레퍼런스 타입은 1) Strong References 2) Soft References 3) Weak References 4) Phantom References 위에 4가지 타입으로 나눌수 있다. Strong References 위에 코드는 강한 참조를 설명한것인데 a= null; 로 선언하면
아이템 7. 다쓴 객체의 참조를 해제하라
이펙티브 자바 아이템 7. 다쓴 객체의 참조를 해제하라 위에 처럼 스텍을 만들어서 객체를 저장하는데 다쓴객체의 참조해제를 하지 않아서 메모리 누수 현상이 있다. 위에 내용을 이해하기 위해서 일반적인 GC의 과정을 알아야 될것 같다. 문제가 될수 있는 부분은 stack.push 하는데 이부분은 Strong reference
아이템 6. 불필요한 객체생성을 피하라
이펙티브 자바 아이템 6. 불필요한 객체생성을 피하라 똑같은 기능의 객체를 매번 생성하기 보다는 객체하나를 재사용하는 편이 좋을수도 있다. 결과 위에서 보면 string을 선언 할때 생성자를 통해서 만든 1223과 기능적으로 완전히 똑같은 생성자를 통하지 않은 객체가 있다. 이것은 생성자를 통해서 만드는것은 불필요 한 일
아이템 5. 자원을 직접 명시 하지 말고 의존성 객체 주입(dependency injection)을 사용하라
이펙티브 자바 아이템 5. 자원을 직접 명시 하지 말고 의존성 객체 주입(dependency injection)을 사용하라 지금 대부분 자바 개발자들은 spring 프레임워크를 쓰면서 의존성 주입에 대한 이견은 없을 것입니다. 위에 방식으로 구현한 케이스와 비슷하게 아래 처럼 싱글턴방식으로 구현한 케이스 두가지는 흔한 방
아이템 4. 인스턴스화를 막으려면 private 생성자를 사용하라
이펙티브 자바 아이템 4. 인스턴스화를 막으려면 private 생성자를 사용하라 정적 팩토리 메소드만 모아 놓은 유틸클래스들은 의도치 않게 인스턴스화가 될수 있다. 그런 것을 막으려면 private 생성자를 사용해서 인스턴스 화를 막으면 좋다. 위에서는 정적팩토리 패턴을 제공하는 dateutil 클래스이다. 인스턴스화를
아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보장하라
이펙티브 자바 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보장하라 final 키워드로 싱글톤임을 보장함 위에 코드는 기본적으로 final 키워드로 싱글톤임을 보장한다. 정적 팩토리 패턴으로 싱글턴임을 보장 위에 코드는 싱글톤 구현에 두번째 방법인 정적 팩토리 패턴으로 싱글턴을 구현한 예제이다. 위에 코드
naver_d3_whiteship
layout: post title: "스프링 기반의 REST API 개발" date: 2018 11 10 08:55 +0900 comments: true tags : ["스프링 기반의 REST API 개발"] categories : ["2018 세미나"] sitemap : changefreq : daily priority
spring_one
spring one 피보탈 코리아 노경은 대표 개회사 Reactice Spring with Spring Boot 2.0 첫번째 발표자 오늘은 스프링 프레임워크 쿠버네티스 새로운 아키텍쳐를 설명한다. 피보탈은 소프트웨어를 잘작성하도록 지원한다. 피보탈은 크개 4개 구분으로 나눠진다. 플랫폼이 있다.(피보탈 클라우드 파운드리
아이템 2. 생성자에 매개 변수가 많다면 빌더를 고려하자
이펙티브 자바 아이템 2. 생성자에 매개 변수가 많다면 빌더를 고려하자 정적 팩토리 메소드 패턴과 생성자와는 공통점이 있는데 선택적인 매개변수가 많을때 처리하기 곤란하다는것 이다. 점층적 생성자 패턴(telescoping constuctor pattern) 위와 같은 클래스가 있다. 이것은 광고 노출과 클릭에 대한 통계를
아이템 1. 생성자 대신 정적 팩토리 매소드 패턴(static factory method) 사용을 고려 해라
이펙티브 자바 아이템 1. 생성자 대신 정적 팩토리 매소드 패턴(static factory method) 사용을 고려 해라 클라이언트가 클래스의 인스턴스를 얻는 수단은 public 생성자 이다. 하지만 프로그래머가 알아 둬야 할 기법이 하나 있는데 그것이 정적 팩토리 매소드 패턴이다. 장점.1 이름을 가질수 있다. 위 클
Style Guidelines for Local Variable Type Inference in Java
Style Guidelines for Local Variable Type Inference in Java Introduction(소개) Java SE 10에서는 지역 변수에 대한 유형 유추가 도입되었습니다. 이전에는 모든 로컬 변수 선언에 왼쪽에 명시적인 (매니페스트) 유형이 필요했습니다. 형식 유추를 사용하면 명시 적
JEP 286: Local-Variable Type Inference
JEP 286: Local Variable Type Inference Summary Java 언어를 향상시켜 형식 유추를 이니셜라이저를 사용하여 로컬 변수 선언 에까지 확장합니다. Goals 우리는 Java 코드 작성과 관련된 의식을 줄임으로써 정적 유형 안전성에 대한 Java의 약속을 유지하면서 개발자가 종종 불필요한
이클립스에서 java 11 사용하기
이클립스에서 java 11 사용하기 jdk 11이 나온지 한달이 지났네요 지금 버전은 11.0.1로 되어 있습니다. 이번에 배포하는 서비스는 처음부터 11을 염두해 두고 진행하고 있었는데 spring boot 버전이 2.1이 릴리즈 되지 않아서 서버 셋팅을 1.8로 진행하고 있었습니다. 어제 기준으로 2.1버전이 릴리즈
JEP 323: Local-Variable Syntax for Lambda Parameters
JEP 323: Local Variable Syntax for Lambda Parameters 암시 적으로 형식화 된 람다 식의 형식 매개 변수를 선언 할 때 var를 허용 목표 암시 적으로 형식화 된 람다 식의 형식적 매개 변수 선언 구문을 로컬 변수 선언 구문과 맞춥니다 비목표 변수 선언의 다른 종류 (예 : 메소드의
JEP 320: Remove the Java EE and CORBA Modules
JEP 320: Remove the Java EE and CORBA Modules 개요 java SE Platform 및 JDK에서 Java EE 및 CORBA 모듈을 제거합니다. 이 모듈은 Java SE 9 에서는 향후 릴리스에서 제거하겠다고 선언 된 데 대해 더 이상 사용되지 않습니다. 이유 Java SE 6 에는 J
리눅스에서 java_home 셋팅
리눅스에서 java home 셋팅 리눅스에서 java home 셋팅 전체 유저한테 주기위해서 아래처럼 셋팅함 jdk는 오픈 jdk로 셋팅 끝 참조
tomcat_thread_blocking_ssl
tomcat thread blocking ssl 톰켓에서 thread 않죽음 thread 덤프를 보면 아레의 클래스 들임 지금까지는 생기는 빈도가 작아서 신경을 안썼는데 http에서는 잘 생기지 않고 https에서 자주 생김 https 매체가 늘어나서 자주 생김 일단 네트워크에 비정상적인 상황같은데 이문제는 처리를 할때
compile-time_constant
compile time constant 위에 코드에서 아래의 변수를 선언하면 compile time constant라고 하는데 컴파일 시점에 상수를 참조 하고 있는 값을 상수 내부의 값으로 바꿔준다. 그래서 아래의 코드를 찍어 보면 아래 처럼 static 변수를 선언해서 가지고 와도 싱글톤 객체가 참조 되는 순간 new되
java_optional
java optional Java에서는 참조 유형을 사용하여 객체에 액세스하고 참조 점을 만들 특정 객체가 없을 때 이러한 참조를 설정 null 하여 값이 없음을 나타냅니다. 일반적으로 객체의 필드 멤버가 자동으로 null 초기화됩니다 여기서 다른 곳에해 null을 참조해서 작업을 진행 할때 NPE(NullPointerE
JEP 321: HTTP Client (Standard)
JEP 321: HTTP Client (Standard) JDK 11에서 JDK 9에 도입 되고 JDK 10에서 업데이트 된 JEP110(HTTP 클라이언트 API(Incubator))를 표준화합니다 . 이 JEP는 JDK 9에서 잠복기 API로 소개되고 JDK 10에서 업데이트 된 HTTP 클라이언트 API를 표준화 할
JEP 110: HTTP Client (Incubator)
JEP 110: HTTP Client (Incubator) Summary HTTP / 2 및 WebSocket을 구현하는 새 HTTP 클라이언트 API를 정의하고 기존 HttpURLConnectionAPI를 대체 할 수 있습니다 . API는 JEP 11 , JDK 9에 정의 된 바와 같이 인큐베이터 모듈로 제공됩니다. 이
JEP 181: Nest-Based Access Control
JEP 181: Nest Based Access Control Java 프로그래밍 언어를 사용하면 다른 클래스 내에 클래스를 정의 할 수 있습니다. 이러한 클래스는 중첩 클래스 라고하며 여기에 설명되어 있습니다. 중첩 클래스는 정적 및 비 정적이라는 두 가지 범주로 나뉩니다. 선언 된 중첩 클래스static 는 정적 중첩
JEP 330: Launch Single-File Source-Code Programs
JEP 330: Launch Single File Source Code Programs JDK 11 나와서 포함된 내용들을 테스트 해보고 있습니다. 그중 첫번째로 JEP 330에 대한 내용 입니다. java런처가 "shebang"파일 및 관련 기술 을 사용하여 스크립트 내에서의 사용을 포함하여 Java 소스 코드의 단일
HTTP PUT 메소드
HTTP PUT 메소드 rest api 디자인을 해서 서비스를 하는데 PUT 메소드를 사용하면서 Form 파라미터를 선언해서 전달함. HTML form에서는 PUT 메소드를 지원하지 않습니다. 그리고 응답 값을 200으로 전달하고 있는데 PUT 메소드에서는 PUT요청이 성공적으로 해당 자료를 생성 했다면 서버는 반드시 사
톰캣 데이터 소스 min-idle
톰캣 데이터 소스 min idle 작년 8월쯔음에 spring boot로 프로젝트를 하나 만들어서 진행했습니다. 내부 임베디드 톰캣을 사용해서 서버를 기동시켰고 정상적으로 동작하는것으로 판단했습니다. 아래는 해당 프로젝트 설정 입니다. 스프링 부트 버전 자바 스프링 설정 프로퍼티 설정 위에 처럼 기본 datasource
anet a8 print marlin firmware 업데이트
anet a8 print marlin firmware 업데이트 A8 프린터에 펌웨어 업데이트를 했습니다. 업데이트 환경은 windows 10에서 했으면 arduino IDE 버전은 1.8.6을 사용했습니다. 펌웨어 업데이트를 위해서 arduinoIDE를 다운 받으시면 됩니다. 전 window 스토어에서 검색을 해서 다운로
카프카 Quickstart
카프카 Quickstart 이 튜토리얼은 당신이 기존의 Kafka 또는 ZooKeeper 데이터가 없다고 가정합니다. Kafka 콘솔 스크립트는 Unix 기반 및 Windows 플랫폼에서 서로 다르므로 Windows 플랫폼에서는 bin/대신 bin\windows\ 경로를 사용하고 스크립트 확장자는 .sh 대신 .bat 사
ibatis_BulkBeanException
ibatis BulkBeanException 지금 회사에서 ibatis 버전 2.3.4.726 을 사용 하고 있습니다. 이용할때 뜨문뜨문 에러가 발생했습니다. 에러 메시지는 아래와 같이 나왔습니다. 에러 메시지를 보고 궁금증이 들어서 ibatis code를 보았습니다. 에러가 났던 클래스는 MappedStatement.j
3d 프린터 사용하기(anet a8)
3d 프린터 사용하기(anet a8) 회사에서 동호회를 하고 있는데 동호회비로 가성비(?) 좋은 3d 프린터를 구입했습니다 그것이 anet사에 A8입니다. 조립이 쉽다고 해서 하는데 저같은 똥손은 조립이 너무 어려운것 같습니다. 동호회원 분들의 도움으로 겨우 조립에 성공해서 오늘 첫프린트물을 실행했습니다. 그런데 샘플로
https에서 ajax 호출시에 cookies 정보가 않넘어와요 ㅜㅜ
https에서 ajax 호출시에 cookies 정보가 않넘어와요 ㅜㅜ XMLHttpRequest spec에 보면 withCredentials이라는 속성이 있습니다. 이부분은 기본 값이 false 입니다. 해당 값이 나타내는 바는 아래와 같습니다. 그럼 우리는 jquery ajax를 사용했으니 jquery에서 사용법은 아래
OS 파라미터 maximum_transmission_unit
OS 파라미터 maximum transmission unit os를 설치하고 처음 OS 파라미터들을 셋팅 할때 필요한것을 하나씩 정리 해 나갈려고 한다. MTU란 네트워크에서 최대전송단위로 단위가 커질수록 효율성이 높아집니다. 이렇게 효율이 올라가면 대량 프로토콜 처리량이 올라가는것 입니다. 여기서 단점은 큰 패킷은 작은
url special scheme
url special scheme 음 먼저 이것은 아래 코드에서 부터 찾게 되었다. url호출시에 //앞에 url special scheme를 기록하지 않아도 기존 브라우져에서 로딩했던 스키마로 자동으로 된다고 하는것이 였다. 기존 브라우져가 http로 호출하면// 앞에 http가 붙는다는 식 위에 형태가 처음 보는 형태
projectlombok 사용에 대한 의견
projectlombok 사용에 대한 의견 저도 권남님에 포스팅에 대한 의견 처럼 제한적으로 사용하는것이 좋을것 같습니다. 거기서 사용할 몇가지 사용법에 대해서 포스팅 합니다. @Getter and @Setter 롬복 사용시에 아래는 기존 코딩 @ToString 롬복 사용시 비사용시 @Log (and friends) 롬복
projectlombok IDE에 설치 방법
projectlombok IDE에 설치 방법 이번에 사용하고 있는 서비스에 LOMBOK을 적용시키기로 했습니다. 그래서 프로젝트에서 제일 많이 쓰고 있는 IDE(이클립스, 인텔리J)에 LOMBOK 적용 방법에 대해서 작성하려고 합니다. 페이지에 가서 다운로드를 먼저 받음 여기서 다룬 받은 lombok.jar를 실행 자바가
스크립트 조사 crawler 만들기
스크립트 조사 crawler 만들기 작년 10월 달에 회사내에서 갑자기 전체 메일로 회사에서 만든 스크립트가 버전이 파편화 되있는데 적용한 사이트에서 어떤 버전이 어떤식으로 쓰이는지 모르니 전수조사를 위해 개인마다 할당 된적이 있었다. 요건은 위에 요건을 확인하기 위해 소스보기를 하면서 검수를 해야 되는 상황이 였다. 단
10년 이상 프로그래머
10년 이상 프로그래머 라는 포스팅을 오늘 보았습니다. 거기에 선배분의 좋은 글이 있어서 포스팅을 남김니다. 저도 지금도 고민을 하고 있었습니다. 개발일이 좋은데 계속 개발일을 할수있을까? 이 부분이 저한테 이정표가 될수도 있을꺼 같아서 글을 남김니다. 참조
인텔리제이에서 jigsaw 코딩하기
인텔리제이에서 jigsaw 코딩하기 인텔리제이에서는 일단 이클립스처럼 사전작업? 이런것은 할것이 없다. 물론 JDK는 9버전 이상으로 되야 된다. 먼저 프로젝트 생성후에 모듈 클릭 next 모듈명 입력 이클립스랑 똑같이 고고 module info.java 가 생김 그럼 다시 2번째 모듈인 second를 생성 그담에 sec
이클립스에서 jigsaw 코딩하기
이클립스에서 jigsaw 코딩하기 이 포스트를 따라하면 준비는 끝 그럼 자바 프로젝트 생성 프로젝트명 입력하고 아래 보면 create module info.java file에 체크되어 있음 모듈프로그램에 기본인 module info 생성 모듈명 입력 모듈 info가 생겼습니다. 일단 그럼 두번째 second 프로젝트 생성
이클립스에서 jigsaw 코딩 준비하기
이클립스에서 jigsaw 코딩 준비하기 프로젝트 직쏘란? Project Jigsaw 작업은 2008 년 8 월 초기 탐색 단계 에서 시작되었습니다 . Java 9의 설계 및 구현 작업 은 2014 년에 시작되었습니다 . 소스 코드 재구성 ( JEP 201 )은 2014 년 8 월 JDK 9 빌드 27에 병합되었습니다. 2
openjdk10 설치(window)
openjdk10 설치(window) 오라클에서 라이센스정책을 펼치고 있어서 저도 openjdk로 개발 환경을 옴기고 싶은 욕구가 생겼습니다. 먼저 어제 jigsaw를 해볼수 있어서 회사 개발용 pc에 openjdk10을 인스톨 할려고 함 Downloads 에서 리눅스, macOS, windows 플랫폼별로 다운로드가 따
Java9 모듈 프로그래밍(유동환) - 비긴 메이트
Java9 모듈 프로그래밍(유동환) 비긴 메이트 기본작업 jdk 10 gradle을 잘 사용 안했는데 예제가 이걸로 되 있음 포크한 후에 설정 파일들 커밋 되어 있길래 다 삭제함 환영사 도착 후 샌드위치 전달 받음 커피는 100잔만 준비되어 먹지 못함 B 스티커가 있어서 비트코인인줄 알고 가지고 왔는데 비긴 메이트 ㅜㅜ
jenkins php 파일 배포 하기
jenkins php 파일 배포 하기 전 php를 해본적이 없습니다.(java 개발자) 아래 내용은 전달 받은 기능을 설정한것 뿐입니다. 기능 요건 1. git 에서 소스를 다운 2. 특정 서버 특정 폴더에 업로드 3. git을 polling 하는 주기를 5분 단위로 해서 업데이트가 있으면 1번 2번 프로세스 반복 사전
nginx HTTP load balancer 설정
nginx HTTP load balancer 설정 톰캣 인스턴스를 여러개를 생성 시켜서 대용량 부하에도 견디기 위해 처리를 진행 하려고 했습니다. 하지만 서비스를 제공 받는쪽에서는 포트정보나 몇대에 서버를 사용하는것 없이 하기위해서 nginx를 셋팅했습니다 nginx의 proxy pass 방식을 통해서 처리 했습니다. u
fiddler remote debuger 방법
fiddler remote debuger 방법 원도우 컴퓨터에서 핸드폰이나 다른 스마트 기기에서 호출하는것을 디버깅 하기 위해 사용하는 방법 이다. 먼저 를 다운로드 받는다. 설치후에 피들러를 기동 위에 처럼 Tool fiddler option 선택 위에 처럼 화면에 팝업이 등장 connents 선택 Allow remot
메이븐 중앙 저장소에 업로드 하기
메이븐 중앙 저장소에 업로드 하기 예전에 중앙 저장소에 하나의 라이브러리는 배포한적이 있다. 그래서 다시 따라하는 도중 막혀서 삽질 후에 다시 정리중이다. 첫번째는 이 링크에 잘 정리가 되어 있다. 하지만 처음 사용자를 위한 방법이다. 키 생성부분인데 여기서 막혀서 삽질을 엄청 했다. pgp에 대해서 깊게 공부해야 될꺼
톰캣 DataSource user 정보 암호화 시키기
톰캣 DataSource user 정보 암호화 시키기 을 참고로 톰캣 DataSource user 정보 암호화 시키는 소스를 만들어 보았다. 위에 나와 있는 방법은 tomcat jdbc가 포함된 7.0 이상 버전에서만 작동해서 톰캣 API를 참조로 tomcat DBCP 수정해서 암호화 하도록 만들었다. 첨부한 jar파일을
스프링 배치 Step 에 Chunk 처리와 Tasklet 처리의 차이
스프링 배치 Step 에 Chunk 처리와 Tasklet 처리의 차이 Step 일괄 작업의 독립적 연속 상을 캡슐화 정의와 실제 배치 공정을 제어하는 데 필요한 모든 정보를 포함하는 도메인 객체이다. Step 다음 두 가지 방법 중 하나로 처리 할 수 있습니다. Chunk : Spring Batch는 가장 일반적인 구현
나만의 스프링 부트 스타터 만들기
나만의 스프링 부트 스타터 만들기 auto configuration Bean에 이해 내부적으로 자동 구성은 표준 @Configuration클래스로 구현됩니다 . 추가 @Conditional 어너테이션은 자동 구성이 적용되어야하는시기를 제한하는 데 사용됩니다. 일반적으로 자동 구성 클래스는 @ConditionalOnClas
Redis cluster 란
Redis cluster 란 Redis Cluster는 레디스 버전 3.0 이상에서만 동작 합니다. Redis Cluster는 Redis 설치를 실행하는 방법을 제공하며 데이터는 여러 Redis 노드에서 자동으로 분할됩니다 . 또한 Redis Cluster는 파티션 중에 어느 정도 가용성을 제공합니다 . 즉, 일부 노드가
Redis 용량산정을 위한 메모리 사용조사
Redis 용량산정을 위한 메모리 사용조사 3년전에 테스트한 자료를 바탕으로 적었습니다. 레디스 공식 사이트 faq에 나와 있는 정보 위에 내용을 바탕으로 테스트 진행 백만개의 간단한 키와 문자열값 일때 100MB의 메모리를 사용한다고 함 백만개의 키와 해쉬값 일때 200MB의 메모리를 사용한다고 함 모니터링 툴은 를 사
db PLAN 정보의 의미
PLAN 정보의 의미 EXPAIN PLAN 명령어는 1) 옵티마이져가 SELECT, UPDATE, INSERT, DELETE을 실행하기 위해 선택한 실행계획을 보여준다. 2) 실행계획이란 옵티마이져가 특정 SQL문을 실행하기 위해 수행한 일련의 동작(OPERATIONS)을 트리형식으로 표현한 것이다. 3) EXPAIN P
vagrant로 레디스 설치하기
vagrant로 레디스 설치하기 첨에 Vagrantfile 파일을 만들이 위해서 만들어질 폴더에서 아래 명령어를 입력한다. 위에 명령어가 실행되면 파일이 만들어진다 그럼 준비가 된것이다 그럼 box를 사용할꺼니 우분투 박스를 아래에 명령어로 추가한다. 위처럼 추가 하면 준비가 되었다 그럼 Vagrantfile을 열어서 아
vagrant 처음 사용해 보기
vagrant 처음 사용해 보기 vagrant는 부랑자, 방랑자? 라고 뜻 가상환경을 편하게 관리 할수 있는 툴이다. 인턴분들이 이것으로 셋팅해서 접속이 안된다고 해서 한번 테스트 해볼려고 셋팅 중입니다. 사용하기 쉬운 워크플로우 자동화에 중점을 둔 기능이며 개발환경 셋팅시간을 단축시키고 생산 패리티를 높이며, 내컴터에서
빌드스크립트 정리 후기
빌드스크립트 정리 후기 회사내 빌드 스트립트 정리작업을 진행 했었다 올해 초(2018 01)에 진행 했었는데 이제야 후기를 올린다. 기존 빌드 스크립트는 ant로 되어 있었고 프로젝트 자체는 maven으로 설정(?)은 되어 있었지만 maven을 아에 참조 하지 않고 있었다. 그런식이다 보니 개발자들 개발시에 pom에도 추
JSR 310: Date and Time API
JSR 310: Date and Time API JSR 310은 자바 SE API가 자바의 현재 날짜와 시간 API를 형성하는 두 개의 기존 클래스(java.util.Date, java.util.Calendar)를 대체하는 것을 목표로 제안 된 시간 및 일정관리 API이다. Joda Time에 가장 많은 영향을 받았고,
아두이노 선풍기 만들기
아두이노 선풍기 만들기 아두이노에 프로그래밍을 하기위해 아두이노 ide를 인스톨 해야 된다. 여기에서 다운로드를 받아서 인스톨을 먼저해야된다. 호환보드는 를 인스톨해야 되는데 링크에서 인스톨 먼저 진행 하면 되겠다. 그다음에 아두이노 ide가 실행 되면 아래의 코드를 붙혀 넣고 업로드를 진행하면 된다. ^^ 참조
intellij_failed_to_create_a_child_event_loop
intellij idea failed to create a child event loop 일단 회사 인턴분 PC에서 java 클래스를 하나 생성시켜서 main을 만들고 hello world를 찍을려고 하는데 위에 에러 메시지가 보임 해당 에러를 검색하니 아래의 쓰레드가 나옴 봤는데 바이러스 프로그램 문제인가 해서 에러가
codespitz_73_part6(generator, promise, async/await)
코드스피츠73 part6 generator, promise, async/await generator breaking block time slicing manual 위에 로직을 generator 변경 로직과 알고리즘의 분리가 가능 generator + async + executor yleid는 값을 받아들이거나 출력할수 있
응집도_(commincation cohesion)
응집도 (cohesion) 통신(?) 대화(?)응집도 (commincation/informational) 통신 응집력이란 모듈의 일부가 동일한 데이터 (예 : 동일한 정보 기록에서 작동하는 모듈)에서 작동하기 때문에 그룹화 된 부분입니 예제는 java Deque 클래스를 들겠다. 여기서 OOP 냄새가 나기 시작함
응집도_(sequential cohesion)
응집도 (cohesion) 실행순서 응집도 (sequential) 한 부분의 출력이 조립 라인과 같은 다른 부분의 입력 (예 : 파일에서 데이터를 읽고 데이터를 처리하는 기능)이기 때문에 모듈의 일부가 그룹화되는 경우입니다. 일반적으로 커플 링이 좋으며 쉽게 유지 관리됩니다. 일반적으로 유용하지 않은 활동 때문에 쉽게 재
응집도_(procedural cohesion)
응집도 (cohesion) 절차적 응집도 (procedural) 절차 적 응집은 모듈의 일부가 특정 실행 순서 (예 : 파일 사용 권한을 확인한 다음 파일을 여는 기능)를 따르기 때문에 그룹화되는 경우입니다.
응집도_(temporal cohesion)
응집도 (cohesion) 시간 응집도 (temporal) 특정 실행 시점으로 그룹화 될때 생깁니다. 하지만 이것은 주석으로만 설명 할수 있습니다. 코드로는 설명이 안됨(주석은 코드가 아니라 썩어버림) 아래의 예제이다.
응집도_(logical cohesion)
응집도 (cohesion) 논리적 응집도 (logical) 논리적 응집력이란 모듈의 일부가 논리적으로 분류되어 자연스럽지 만 똑같은 것을 수행하도록 분류되기 때문입니다. InputStream 패턴 루틴화 아래는 InputStream 클래스
결합도_(data coupling)
결합도 (coupling) 데이터 결합 (data coupling) 약결합 data coupling은 모듈이 매개 변수를 통해 데이터를 공유 할 때 발생합니다. 실행 소스
결합도_(stamp coupling)
결합도 (coupling) 스템프결합 (stamp coupling or data structured coupling) 유사 약결합 stamp coupling은 사용되거나 사용되지 않을 수있는 필드를 포함하는 데이터 구조를 사용하여 매개 변수로 데이터가 전달 될 때 모듈간에 발생합니다. 이렇게 되면 모듈간의 인터페이스를 단
결합도_(control coupling)
결합도 (coupling) 제어결합 (control coupling) 보통결합 편의상 사용시작 모듈의 내부 논리 (예 : 플래그 및 스위치)에 영향을주는 데이터가 전달 될 때 모듈간에 제어 결합이 발생합니다 계층 구조에 전달 된 제어 플래그는 호출 프로그램이 호출 된 프로그램의 내부에 대해 알도록 요구합니다 (호출 된 프
결합도_(external coupling)
결합도 (coupling) 외부결합 (external coupling) 강결합 외부 커플 링은 하나 이상의 모듈이 인터페이스 또는 통신 프로토콜을 공유 할 때 발생합니다. 이는 일반적으로 모듈이 인프라 계층 (예 : OS 기능)과 직접 통신 할 때 발생합니다 음 기본적으로 여기서 말하는 결합도를 낮춰야 되는데 요즘 의존성
개발자 커리어 컨퍼런스
개발자 커리어 컨퍼런스 Session 1. 인사담당자가 말하는 개발자 채용 첫번째 새션 모기업 인사담당자임 블로그에 적지 말아 달라고 함 면접시에는 정보의 비대칭성에 의해 이해가 상충할수 있다. 인사 담당자가 바라본 개발자의 특징/특성 개발자의 특징/특성 1. 성취감 및 성장감 중시 2. 외적 공정성 중시 3. 자율성 중
결합도_(common coupling)
결합도 (coupling) 공통결합 (common coupling) 전역결합(global coupling)이라고도 함 강결합 두개 이상의 모듈에서 전역으로 선언된 데이터 모듈에 등록 할때 공통결합이 발생한다. 자바 코드에서 실수하는 부분이 static 변수를 선언해서 여러 쓰래드에서 공통적으로 사용하는 경우이다. 이렇게
결합도_(content coupling)
결합도 (coupling) 내용결합 (content coupling) 제일 높은 결합도 모델 컨텐츠 결합은 한 모듈이 다른 모듈의 코드를 사용할 때 발생한다고 말합니다. 이는 정보 숨기기를 위반하는 것으로, 기본 설계 개념입니다. 아래의 코드를 보시면 Builder class에 userAbInfoList를 AbCampai
응집도_(coincidental cohesion)
응집도 (cohesion) 응집도란 결합도와 대조적인 관계로 높은 응집력은 낮은 결합도와 상호 관련이 있다. 회사 코드를 보면서 응집도에 대해 설명할수 있는 코드가 나오면 하나씩 해보려고 한다. 우연히 (Coincidental) 우연히 응집했다는것은 응집도 타입에 최악의 경우이다. 아래의 코드로 설명을 하겠다. 아래는 광
elasticsearch_kibana_sample
elasticsearch kibana sample 이번 데이터 및 실습용 스트립트는 메가존에서 진행한 megazone elastic day(2018/04/25)에서 공유된 내용을 바탕으로 작성하였습니다. 아래의 repository에가서 보면 스크립트와 order list json 데이터가 존재한다. 아래 처럼 형태인데 i
싱글턴 패턴은 안티패턴?
singleton pattern 싱글턴 패턴은 안티패턴? 코드의 결합도를 높힌다. 테스트시에 다른 시스템에 영향을 줄수 있다.(공유되고 있는 객체이기 때문에) 하지만 싱글톤을 사용해야 되는경우에는 꼭 사용해야 된다고 생각이 된다. 싱글톤으로 했을때 멀티쓰레드에서 아래 처럼 슬립을 걸면 병목현상이 일어나는것을 확인했다. 해
이클립스 SERVER 플러그인
이클립스 SERVER 플러그인 이클립스 WTP에 server 플러그인에서 아래 이미지 처럼 serve modules without publshing 설정을 체크 했을때 디플로이가 어떻게 되는지 찾아 보았다. 먼저 이클립스의 workspace 에서 server.xml에 아래 처럼 지정이 된다. 위치는 아래이다. 위에 설정
코드스피츠73 part5_2(BLOCK, NONBLOCK)
코드스피츠73 part5 BLOCK, NONBLOCK BLOCKING EVASION NONBLOCKING 서브루틴이 즉시플로우 제어권을 내놓는것 SYNC, ASYNC 병행성 프로그래밍에 익숙해져야 된다. SYNC 서브루틴이 즉시값을 반환함 block 즉시 플로우 제어권을 반환하지 않음 non block즉시플로우제어권을반환
코드스피츠73 part5_1(BLOCK, NONBLOCK)
코드스피츠73 part5 BLOCK, NONBLOCK FLOW IS BLOCKING 프로그램이 실행되면 도중에 멈춰지지 않고 끝까지 실행됨 BLOCKING FUNCTION 점유하는 시간 만큼 블록을 일으키는 함수 배열순회, 정렬 배열크기에따라 DOM순회 DOM의하위구조에따라 이미지프로세싱 이미지크기에따라 BLOCKING
ALTER TABLE ADD PARTITION 시에 장애
ALTER TABLE ADD PARTITION 시에 장애 운영중인 시스템에서 mariadb를 사용 파티션 ADD 시에 ADD 프로세스가 문제가 생겨 테이블 락이 걸려서 해당 테이블을 사용하는 서비스에서 쓰레드가 밀리고 있었다. 여기서 궁금증이 나왔다. 파티션 add/drop 시에 테이블 락이 걸려야 되냐? 실제 파티셔닝을
마리아 DB 교체후 장애 사항 대처
마리아 DB 교체후 장애 사항 대처 운영중인 시스템에서 mariadb를 사용하고 있는데 디스크가 98%까지 찼다, 예상은 하고 있었는데 차주 화요일로 교체시기를 예상하고 있었지만 주말에 디스크 확보를 보장하기 어려워 바로 교체하는 작업을 했다. 교체이후에 문제가 없는줄 알고 있던 시스템에서 하나씩 장애가 발생하기 시작했다
GCE_TIMEZONE
GCE TIMEZONE sql을 사용했는데 select now() 시간이 한국 시간이 아니였다 해당 설정은 sql 설정에 들어가서 수정을 누른 다음 데이터베이스 플래그 추가에 default time zone 설정을 +09:00 항목을 추가했다. 또 서버 인스턴스에서도 타임존이 맞지 않아 rdate를 이용해서 맞출려고 했지
POP_part26(법칙 - 프로그래밍 안티패턴)
법칙 프로그래밍 안티패턴 깨진 유리창 법칙 빌딩같은 건물에 수리되지 않은 깨진 유리창이 한 장이라도 있다면, 사람들은 빌딩 주인이 자기 건물에 관심이 없는줄 안다. 이렇게 되면 곧 다른 유리창도 깨진다. 그리고 건물 전체에 심각한 파손이 일어난다. 소프트웨어도 똑같은 현상이 일어난다. 소프트웨어에서 깨진 유리창 즉 나쁜
POP_part25(법칙 - 프로그래밍 안티패턴)
법칙 프로그래밍 안티패턴 브룩스 법칙 일정이 늦어지고 있는 소프트웨어 개발 프로젝트에서 지연을 만회하기 위해 후반에 사람을 추가하면 오히려 지연이 한층 더초래 된다. 맨먼스(man month)로 프로젝트 일정을 환산하는데 man과 month는 교환 불가능이다. 이유는 다음과 같다. 종속 관계에 따른 오버헤드가 발생한다.
POP_part24(관점 - 프로그래머가 보는 시각)
관점 프로그래머가 보는 시각 개밥먹기 자신이 개발한 소프트웨어를 직접 사용해 봐야 된다.이렇게 되면 사용자의 관점을 얻을수 있다. 본인이 사용해서 편리함을 증명해야된다. 고무오리 디버깅 기법이다. 발생한 문제를 누구한테 설명하므로써 문제의 원인을 스스로 깨닫고 자체 해결할수있다.자체 해결을 촉진한다. 무생물에게 먼저 적용
POP_part23(관점 - 프로그래머가 보는 시각)
관점 프로그래머가 보는 시각 계약에 의한 설계 함수와 함수를 호출하는 쪽이 서로 계약을 맺고 있다고 간주하고 프로그래밍 하는것을 가리켜 계약에 의한 설계라고 한다. 계약한 내용을 미리 함수의 주석으로 알려주자 계약이행의 확인을 위한 코드는 단정문으로 표현하자. 주의점 함수쪽에서는 파라미터를 조정하지 않는다 함수쪽의 단정문
LockSupport.park()
LockSupport.park() 운영중인 시스템에서 아래처럼 에러 코드들이 발생하면서 장애상황이 발생되기 시작했다. 위에 코드를 보면서 일단을 pool이 문제라고 생각했다. 찾아서 코드를 보니 pool 설정이 디폴트 설정으로 되어 있었다. 그래서 해당 풀이 문제인지 찾아 볼려고 첫번째 덤프에서 나왔던 콜스텍을 기준으로
jooq(Java Object Oriented Querying)
jooq(Java Object Oriented Querying) 자바 객체지향 쿼리 라고 알려진 jooq는 가벼운 데이터베이스와의 맵핑 입니다. 소프트웨어 공학의 active record pattern의 구현체로 database schema로 부터 classes generated 한다. 하지만 아쉬운점은 오픈소스로 제공되
access log 분석
access log 분석 갑자기 DB에서 처리량이 밀리면서 리플리케이션이 밀리기 시작했다. WAS쪽 모니터링을 scourt를 통해서 하고 있는데 was 쪽에서는 특별한 장애 상황이 감지 되지 않았다. scouter agent에서 2초마서 서버로 전송하니 초단위에 부하량은 볼수가 없다고 판단(?) 초단위에 정보를 보고 싶어
CodeSpitz74_Part4(권한과 책임)
코드스피츠 74 4회차 프로그램 짤때는 권한과 책임이 일치하게 짜야 된다. 권한과 책임이 일치하면 그것을 역활이라고 한다. TETRIS 객체후보 STAGE(현재 스테이지 정보) SCORE(점수 및 계산법) BLOCK(범용 블록정의) 색깔, 회전 게임본체 범용 패널 시작화면 스테이지 종료 죽음 클리어 결과 화면 추상화 일반
POP_part22(관점 - 프로그래머가 보는 시각)
관점 프로그래머가 보는 시각 비자아적 프로그래밍 프로그래밍 할때는 자아를 버려야 된다. 자존심과 자만을 버리고 동료에게 협력을 구하자 코드를 작성할때는 자기 능력을 뽐내는것이 아니라 코드가 더 좋아지는 것에 초점을 맞추어야 한다. 자기 자신도 실수를 저지른다는 점을 이해하고 받아들인다. 작성한 코드는 자기 자신이 아니다.
POP_part21(관점 - 프로그래머가 보는 시각)
관점 프로그래머가 보는 시각 프로그래머의 3대 미덕 태만 반복적인 작업은 시스템화 하자 성급 일어날수 있는 일은 먼저 작업하자 오만할것 남에게 부끄럽지 않게끔 작업하고 보수하자. 프로그래머는 중노동에 대해서는 보상받지 못한다. 자기가 일하는 시간이나 노력을 줄이면 줄일수록 프로젝트에 대한 기여는 커진다. 보이 스카우트 규
POP_part20(관점 - 프로그래머가 보는 시각)
관점 프로그래머가 보는 시각 직교성 코드에 변경은 다른코드에 영향을 주면 안된다. 즉 코드간에 독립성과 분리성을 갖도록 하자. 직교성을 가진 코드는 견고하다. 변경이 국소화 되면 생산성이 향상된다. 문제가 생겨다 해당부분을 격리 가능해서 코드가 더 견고해진다. 모듈간에 결합도를 최소화 시키자 불필요한 정보는 다른 모듈에
CodeSpitz74_Part3_1(HTML PARSER 만들기)
코드스피츠 74 3회차 HTML PARSER 만들기 A = <TAG BODY</TAG B = <TAG/ C = TEXT BODY = (A|B|C)N 함수는 어떻게 짠다. 레이아웃이라는 개념으로 짠다. 함수의 시그니쳐를 확정하는데 있다. node로 확정되는 순간은? 함수를 만드는 기본적인 이유 사람한테 쉬운 단어로 바꾼다
POP_part19(결합도)
관점 프로그래머가 보는 시각 결합도 내용 결합 공통 결합 외부 결합 제어 결합 스탬프 결합 데이터 결합 상호 종속 되는 모듈은 깨지기 쉽다 저결합 모듈을 지향 해야 된다. 데이터 결합방식을 맹목적으로 지향하기 보다는 결합하려는 대상과의 친밀도에 따라 단계를 결정하자 하이브리드 결합 데이터가 여러 의미를 지니는 경우 세율의
POP_part17(UNIX 철학)
사상 프로그래밍 이데올로기 UNIX 철학 효율성보다 이식성 개발 효율성보다는 이식성을 중요시 선택하자 소프트웨어의 성공을 가늠하는 잣대중 하나로 몇개의 플랫폼에서 실행되는가? 라는 척도가 있다. 소프트 웨어의 가치를 지속시키는것은 하드웨어가 경쟁력을 갖는동안 유지할수 있는데 다른 하드웨어로 이식이 필요한다 여기에 시간을
POP_part18(UNIX 철학)
사상 프로그래밍 이데올로기 UNIX 철학 대화형 인터페이스 회피 구속적 인터페이스라고도 하는데 이렇게 되면 사용자도 머신도 소프트웨어에 구속당한다. 소프트웨어별로 독자적인 대화 방법을 기억해야 된다. 소프트웨어끼리 대화 할수 없다. 대기 시간이 많아진다. 입력부분에 대한 해석 코드가 많아지고 흉해진다. 큰것이 아름다운 접
POP_part16(UNIX 사상)
사상 프로그래밍 이데올로기 UNIX 사상 복구의 원칙 소프트웨어 동작중에 오류복구에 실패 했다고 하면 처리는 계속하면 안된다 그리고 오류는 한눈에 띄도록 발생시킨다. 소프트웨어 동작은 평상시 뿐만 아니라 오류시에도 투명해야 한다. 오류를 복구하지 못했는데 계속 동작시키면 피해를 확대시킨다. 그리고 오류는 가능한 요란하게
POP_part15(UNIX 사상)
사상 프로그래밍 이데올로기 UNIX 사상 표현성의 원칙 정보는 데이터에 모아 표현 정보를 데이터에 표현하면 로직은 읽기 쉬워진다. 왜냐고 하면 데이터는 로직보다 다루기 쉽다.그래서 데이터가 복잡해야 되는지 아니면 로직이 복잡해야 되는지 고민하지 말고 데이터를 복잡하게 하자. 충격 최소의 원칙 인터페이스는 예상대로 동작하도
codespitz73_part4(ABSTRACT LOOP & LAZY EXECUTION)
코드스피츠73 part4 ABSTRACT LOOP & LAZY EXECUTION 단순한 루프 복잡한 루프 ABSTRACT LOOP 다양한 구조의 루프와 무관하게 해당 값이나 상황만 개입만 하고 싶은경우 위에 함수에서 console.log 만 추가 할려고 해도 아래 처럼 수정 할수 밖에 없다. 코드는 고정 되어 있고 변수가
codespitz73_part3_2(ITERATION & GENERATOR)
코드스피츠73 part3 2 ITERATION & GENERATOR ES6 LOOP 지연루프 위에 loop 함수를 사용하지 않고 내장 반복처리기들 배열해체 Array destructuring 펼치기 Spread 배열을 전달 하는것 보다 객체를 전달하는것은 통제권을 객체안에서 가지고 올수 있다. Rest Parameter
codespitz73_part3_1(ITERATION & GENERATOR)
코드스피츠73 part3 1 ITERATION & GENERATOR INTERFACE 1. 인터페이스란 사양에 맞는 값과 연결된 속성키의 셋트 2. 어떤 Object라도 인터페이스의 정의를 충족 시킬수 있다. 우리 머리속에서만 있는 약속이라서 어렵다. 자바 스크립트에서 미리 정의하고 있는 인테페이스 ITERATOR 1.
POP_part14(UNIX 사상)
사상 프로그래밍 이데올로기 UNIX 사상 절약의 원칙 큰 코드는 작성하지 않는다. 큰 코드는 제어 불능 코드를 덧붙이지 않는다. 투명성의 원칙 소프트웨어 동작의 시각화 투명성 소프트웨어 동작에 관해 한눈에 봐도 곧바로 무엇을 어떻게 하고 있는지 이해할수 있을것 개시성 소프트웨어 내부 상태에 관해 감시할 수 있거나 보여줄
codespitz73_part2(흐름제어)
코드스피츠73 part2 흐름제어 LABEL, BREAK, CONTINUE LABEL은 변수의 식별자와 같다. 레이블 레인지가 가르치는 곳으로 갈수있다. 레이블을 주석 형태로도 쓸수 있다. 레이블 점프 function scope 클로저에 대한 설명 레이블 스코프 switch 문 스위치 문에는 반드시 default가 있다.
CodeSpitz74_Part2(함수를 작성할때에 참조)
코드스피츠 74 2회차 함수를 작성할때에 참조에 대해서 충분히 고민해야 된다. 참조를 인자로 보내면 위험하다. call 스택 지역변수, 인자, 함수의 참조주소 tail recursion(꼬리물기 최적화) 메모리 고갈을 방지함 자바스크립트는 ES6에 표준(사파리에서만 작동) 위에 까지는 정적함수 개념을 배운것 closure
_termvectors
inverted index elasticsearch를 사용해 키워드 검색을 활용해서 서비스를 만들려고 할때 은전한닢(오픈소스 한국어 형태소 분석기)을 통해 인덱스를 만들어서 검색을 활용하고 있는데 만들어진 인덱스에 term(token)을 검색해야 될일이 생겨서 검색하는 찾았다. 위에 형태되로 하면 되었다 logstash
POP_part13(UNIX 사상)
사상 프로그래밍 이데올로기 UNIX 사상 UNIX의 근간이 되는 암묵적인 지식 UNIX는 엄청난 생명력이 있다 1969년에 등장했다. 모듈화의 원칙 소프트웨어는 복잡하다 하지만 복잡도 정도는 낮출 수 있다. 코드중 관계성이 높은 요소를 모아 모듈을 작성한다. 복잡한 정도를 제어하는게 원래 프로그래밍 본질이다. 모듈이 제공
POP_part12(7가지 설계 원리)
사상 프로그래밍 이데올로기 7가지 설계 원리 단순 원리 단순함을 중시한다. 버그는 복잡한곳에서 나온다 동형 원리 형태를 중요시한다. 코드에 일관성을 가지게 하자 대칭 원리 형태의 대칭성을 중시한다. 참일때 처리가 있으면 거짓일떄 처리가 있어야 된다 계층 원리 구조의 계층성을 중시한다. 코드각각의 추상 수준을 의식해서 계층
POP_part11(아키텍처 기본 기법)
사상 프로그래밍 이데올로기 아키텍처 기본 기법 상호 운영성 소프트웨어는 시스템의 일부이며 독립해서 존재하는것이 아니고 다른 시스템이나 환경과 빈번하게 상호작용한다. 외부 기능이나 자료구조로의 접근이 명확하게 정의된 아키텍처를 설계 표준 규격을 선택해야 된다. 효율성 시간 효율성 자원 효율성 리소스는 한정적 간접화를 고려해
Bean Validation
Bean Validation Java EE 및 Java SE에서 JavaBean 유효성 검사를위한 Java API 명세. JSR303 2009년 JSR349 2013년 JSR380 2017년 USER 클래스 TEST 클래스 위에처럼 테스트 하면 must be null이라는 메시지를 볼수 있다. 참조
CodeSpitz74_Part1
코드스피츠 74 1회차 함수는 만들때 고심을 해야 된다. 함수는 무한대로 크게 되기 때문에 함수를 만들때 첫번째 고민해야 되는 것은 인자를 얼마나 제네릭 하게 만들수 있는지 괄호가 없는 서브루틴 호출 예제 자바스크립트는 무조건 리턴이 있는 함수이다. 리턴을 선언 하지 않아도 undefined 값을 받음 리턴을 하는것과 안
IFrame contentWindow Property
IFrame contentWindow Property 오늘 iframe에서 접근 제어를 보다가 contentWindow라는 Property를 확인하게 되었다. iframe 밖에서 안쪽의 스크립트를 컨트롤 할려고 할때 사용했었다. 예제 코드는 아래에 있다 참조
POP_part10(아키텍처 기본 기법)
사상 프로그래밍 이데올로기 아키텍처 기본 기법 변경 용이성 소프트웨어에 수명은 의외로 길다. 그래서 변경 용이성을 해야 된다. 보수성 오류가 발생한 코드 수정이 용이 확장성 신규 기능 추가, 모듈 교체, 모듈의 제거 작업의 용이함 재구축 모듈의 구현에는 영향을 미치지 않고 유연하게 배치할수있는 구조 이식성 하드웨어 종속성
POP_part8(아키텍처 기본 기법)
사상 프로그래밍 이데올로기 아키텍처 기본 기법 인터페이스와 구현의 분리 인터페이스 기능 정의 및 모듈 사용 방법 정의(?) 구현 실제 기능을 실현하는 코드 클라이언트는 인터페이스만 알면 되서 기능이 바껴도 코드를 수정할일이 없다. '구현이 아닌 인터페이스에 맞춰 프로그래밍 하라' 참조의 단일성 모듈의 요소에 관한 선언과
POP_part9(아키텍처 기본 기법)
사상 프로그래밍 이데올로기 아키텍처 기본 기법 충족성 완전성 프리미티브성 충족성 추상이 그것을 전하기 충분한지(remove가 있는데 add가 없으면 불충분) 완전성 추상이 모든 특성을 가지고 있는지(콜렉션인데 size 구하는게 없으면 안됨) 프리미티브성 추상이 순수한지 아닌지(add가 있는데 add10은 필요 없다.) 정
POP_part7(아키텍처 기본 기법)
사상 프로그래밍 이데올로기 아키텍처 기본 기법 패키지화 모듈을 의미있는 단위로 모운후 그룹핑 한다. 소프트웨어 전체가 패키지라는 작은 단위로 분활되므로 복잡도가 낮아진다 패키지 않에 관련 없는 모듈이 섞이지 않으므로 모듈을 관리하기 쉽다. 수정에 대한 영향도가 패키지 안에 머무를 가능성이 높으므로 코드를 변경하기 쉬워진다
POP_part6(아키텍처 기본 기법)
사상 프로그래밍 이데올로기 아키텍처 기본 기법 좋은 코드의 기초원리 추상 캠슐화 정보 은닉 패키지화 관심의 분리 충족성, 완정성, 프리미티브성(원시성, 순수성) 정책과 구현의 분리 인터페이스와 구현의 분리 참조의 단일성 분활정복 좋은코드에는 패턴이 있다. 추상 추상이란 개념적으로 명확한 선 긋기를 수행하는 것이다. 추상은
POP_part5(프로그래밍 이론)
사상 프로그래밍 이데올로기 프로그래밍 이론 프로그래밍을 이끄는 가치관 1. 의사소통 2. 단순함 3. 유연성 가치관을 기술의 선택 기준으로 '어쨰서 이런 것을 할 필요가 있는가?', '이것은 어떤 가치가 있는가?', '언제 이것을 사용하면 좋은가?' 가치관은 원칙을 통해 코드에 적용 1. 결과의 국소화 2. 반복의 최소화
codespitz73_part1
코드스피츠73 part1 코드짤때 LINT TIME(IDE에서 에러를 보여줌) 컴파일 할때 COMPILE TIME(컴파일 시에 에러를 보여줌) 런타임 RUN TIME(실행중일때 에러) 현대 패러다임 런타임 스크립트(자바 스크립트..) 복잡성을 정복하는것은 격리 lexical grammar control character
POP_part4(OCP(Open-Closed Principle)/Naming is important)
원칙 프로그래밍 가이드 라인 OCP(Open Closed Principle) 코드는 확장에 열려 있고 수정에 대해서는 닫혀있는 2가지 속성을 동시에 충족하도록 설계한다. 확장에 대해서 열려있다는 말은 코드의 동작을 확장할 수있다는 의미이다. 수정에 대해서 닫혀 있다는 말은 코드의 동작을 확장하더라도 그 밖의 코드는 전혀
POP_part3(SLAP(Single Layer of Abstraction Principle))
원칙 프로그래밍 가이드 라인 SLAP(Single Layer of Abstraction Principle) 추상화 수준의 통일 코드수준을 맞춘다. 코드에서 추상화 수준을 분리할 때는 상하 2계층이 아니라 기능 복잡도에 따라서 여러계층으로 분리된다. 각각의 계층에서 자신의 계슻에 속하는 요소에 대해 추상화 수준을 일치시킨다
POP_part2(PIE(Program Intently and Expressively))
원칙 프로그래밍 가이드 라인 PIE(Program Intently and Expressively) 의도를 표현해서 프로그래밍 해라. 코드는 컴파일러가 아닌 사람이 읽기 위한것이다. 그래서 어떻게 하면 다른사람이 잘 이해하게 직관적으로 코딩하자. 코드는 소프트웨어 동작을 정확하고 완벽하게 알기 위한 유일한 실마리다. 소프트
circuit-breaker
circuit breaker 소프트웨어에 대한 복잡도가 높아지면서 서비스에서 다른서비스를 호출하는 형태(예를들면 MSA 형태로 구성되어 API들을 호출하는 형태)들이 보편화 되어 서비스 되고 있다. 응용프로그램을 만들때 환경에서 발생할 수 있는 일시적 장애에 민감해야 된다. 장애에는 구성 요소 및 서비스에 대한 네트워크
POP_part1(전제 프로그래밍 불변사실)
the principles of programming 전제 프로그래밍 불변사실 프로그래밍에서는 은총알은 없다. 왜? 본질적으로 소프트웨어는 난해하다. 1. 복잡성 규모가 크면 수천 수만라인의 코드도 존재 하고 각 컨퍼넌트간에 종속성도 비선형적으로 증가함 2. 동조성(호환성) 실세계랑 끊임없이 동조 해야 된다. (네트워크,
Apache_Kafka_GETTING_STARTED
Apache Kafka GETTING STARTED kafka 1.0 기준으로 작성 했습니다. Apache Kafka®는 분산 형 스트리밍 플랫폼 입니다. 그게 정확히 무슨 뜻입니까? 아파치 카프카는 분산 스트리밍 플랫폼입니다. 우리는 스트리밍 플랫폼이 세 가지 핵심 기능을 가지고 있다고 생각합니다. 1. 메시지 대기열
NGINX_proxy_pass
nginx proxy pass apache 와 tomcat의 연동시에는 통상적으로 AJP(Apache JServ Protocol)를 활용 하여서 톰켓과 아파치의 연동을 설정해왔다. 익숙한 mod jk가 해당 프로토콜을 활용해서 연동하는 방식이다. web서버를 apache에서 nginx로 바꾸려고 하는데 nginx에서는 a
tomcat_maxHttpHeaderSize
tomcat maxHttpHeaderSize 기본적으로 tomcat에 헤더 사이즈를 설정 하지 않으면 tomcat 에서는 8 1024 bytes (8K) 지정이 된다 보통 상황에서는 문제가 없을것이다 하지만 헤더에 많은 정보를 담을수 밖에 없는 서비스를 만들때는 고려를 해야된다. 일반적으로는 cookies에 클라이언트 단
CVE-2016-6816
tomcat CVE 2016 6816 HTTP 요청 줄을 구문 분석 한 코드가 잘못된 문자를 허용한다는 사실이 발견되었습니다. 이는 유효하지 않은 문자가 허용되었지만 해석이 다른 프록시와 함께 HTTP 응답에 데이터를 주입하기 위해 악용 될 수 있습니다. HTTP 응답을 조작함으로써 공격자는 웹 캐시에 독을 넣거나 XSS
java static thread safe
java static thread safe 작업 수행 중 여러 스레드가 공유하는 특정 클래스의 인스턴스 상태가 변경 될 가능성이 있는 경우 해당 클래스는 thread safe 하지 않다 라고 표현함. FreqABTest.setType(adConfigData); 의 경우에는 freqAbtestType 변수를 static으로
Reactive Programming
Iterable(PULL) vs Observable(PUSH) 옵저버 패턴의 단점 1. Complete 이라는것이 없다. 이벤트를 대기 하고있다. 2. Error 에 대한 처리가 어렵다. 쌍대성 참조 ) [[Reactive] Reactive Programming 배우는 방법](http://mobicon.tistory.co
tab vs space bar
tab vs space bar 코드를 작성할때 탭 버튼으로 앞을 맞추냐 아님 스페이스로 맞추냐에 논쟁이 또 일어났다 어떤 사람은 tab 으로 4를 하고 있었고 어떤 사람은 스페이스로 2를 주고 있었다 자바 코드 컨벤션에서는 스페이스바 4를 하라고 나와 있다. 아래 참조 사이트는 한번씩 볼만한듯 ^^ 참조
GDG_DevFest_Seoul_2017
GDG DevFest Seoul 2017 구글은 스티커랑 이것저것 챙겨 주는것이 많다. 오라클은 스티커 안이쁨 구글스티커는 맘에 들어서 컴터에 마구닥 붙힘 후드티와 장패드가 선물로.... CSS와 BEM 듣고 싶었는데 자리가 없어서.... https://en.bem.info/ http://getbem.com/ https:
oracle_meetup
오라클 밋업 10분에 아셈에 도착해서 15층에서 행사관련 등록후에 입장 했지만 카페에서 20분 이상 대기후에 30분이 넘은후 회의실에 도착 오라클 wifi 패스워드 관련 퀘스트에서 난관에 봉착했지만 브루트포스 공격으로 엑세스 성공 ㅡㅡ(칠판에 글씨가 알아보기 어려웠음, 하지만 빔에서 나오는건 잘보기 편했는데 내가 늦게 앎
geting_start_nodemcu
ㅜ vm arguments에 설정 필요 참고 https://developer.ibm.com/kr/cloud/bluemix/internet of things/2017/07/30/esp8266 iot arduino ide nodemcu basic/ http://www.instructables.com/id/Quick Start
dgding javascript lesson2
Data type? 메모리는 스위치에서 스위치를 온오프 하는 형태로 비트가 늘어 날수록 2의 승만큼으로 늘어남 8비트 0 255 표현 가능 8비트단위로 묶어서 1바이트(스위치 8개가 있음 됨) 2바이트는 16비트(한번에 메모리에 값을 쓸수있는양) 메모리의 특성 값과 위치(주소) 변수는 메모리의 크기와 위치 변수가 차지하는
dgding javascript lesson
programming이란? program을 만드는 행위 program은 컴퓨터가 실행할수 있는 메모리에 올라가 있는 덩어리 compile의 뜻 묶는다 interpreting의 뜻 번역 언어 마다 기계어로 바꿨을대 강점이 존재함 Lexical Grammar(어휘 문법) 모든 프로그래밍 언어에서 구체적인 문법을 정의하기 이전
dgding lesson2(html이 그림을 그리는 방법은)
html이 그림을 그리는 방법은 왜그렇게 되는지가 중요함 이번시간 배울것 1. box model 2. normal flow 3. display & float box model : 크롬 개발자 도구 element 탭에서 computed 보면 나옴 margin border padding contents 박스의 크기를 결정할때
dgding lesson1(그래픽 시스템)
그래픽 시스템 기본은 점(도트) fixed number : 정형화 되있는 좌표를 가지고 점으로 숫자나 그래픽을 그릴수 있음, 단점 업데이트가 어렵다(좌표를 다시 계산 해야됨) abstract calculator : fixed number를 추상화 시킴 예) %, left, right, top, block, inline,
클래스 기반 언어와 프로토 타입 기반 언어(Class-based vs. prototype-based languages)
클래스 기반 언어와 프로토 타입 기반 언어(Class based vs. prototype based languages) Java 및 C ++와 같은 클래스 기반 객체 지향 언어는 클래스와 인스턴스라는 두 개의 별개의 엔티티 개념을 기반으로합니다. 클래스는 객체의 특정을 결정짓는 모든 속성들의 집합이다.(java의 메소드와
html에서 onclick 이벤트와 addeventlistener를 사용하는것중 어떤것이 더 좋을까요?
html에서 onclick 이벤트와 addeventlistener를 사용하는것중 어떤것이 더 좋을까요? 위에 처럼 예전에는 onclick 속성에 자바스크립트를 써서 코딩을 했습니다. 위에 문제점은 이벤트 처리가 코드 전체에 퍼져있고 한군데서 컨트롤이 되지 않고 외부에서 js파일을 includes할때는 브라우저의 캐싱을 할
Tomcat의 Class Loader HOW-TO
톰캣이 시작할때 아래 같이 부모 자식 관계로 구성되는 클래스로더 집합을 생성합니다. Bootstrap | System | Common / \ Webapp1 Webapp2 ... 각각의 클래스로더에 대해서 설명을 하면 1. Bootstrap JVM에서 제공되는 클래스들과 $JAVA HOME/jre/lib/ext 에 존재 하
왜 Spring service에 Interface를 만들어야 할까?
Service 부분에 interface를 사용하는 이유는 단위 컴포넌트로서 경계가 되는 부분이며, transaction 처리, exception 처리 등의 AOP 처리가 주로 service 부분에 지정되기 때문(?) 1. Spring AOP는 두가지 Type의 Proxy를 지원 그 첫번째는 JDK의 Proxy 기능을 이용
jbpm rest api 파라미터 전달
jbpm rest api 호출시 파라미터 전달 방법 파라미터는 키벨류 형식으로 전달하는데 앞에 map 를 붙혀서 map key=value 형태로 전달 되며 프로세스에서 변수를 total로 정했을때 map total=5000 처럼 전달한다. jbpm 문서 17.1.1.3.에 위에 내용을 나타내고 있다.
jbpm 프로세스 진행상태 조회 rest api
jbpm에서는 해당 정보를 가지고 오기위해 아래의 rest api를 제공하고 있다. 참고로 아래 url은 오픈소스 jbpms에서 url이고 레드햇 버전은 /jbpm console/을 /business central/로 수정해서 호출해야 된다 프로세스 이미지정보 가지고 오기: {server}/jbpm console/rest
jbpm CustomWorkItemHandler 만드는 방법
사용법 maven 빌드후에 jbpm 워크밴치 화면으로가서 메뉴 Authoring Artifact Repository 로 이동후 jar파일 업로드 프로젝트 생성 후 Tools Project Editor에서 왼쪽 Project Settings 메뉴를 Dependencies로 변경 Add from repository버튼을 클릭