전체 글
Reactive Programming
2020.02.17 : Languages & Frameworks/Java-async실전! 스프링 5를 활용한 리액티브 프로그래밍 예제 코드 Github 스크린 샷 / 다이어그램 그림파일 왜 리액티브인가? 전통적인 개발 방법대로 작성했을 때 발생했던 문제? 시간 당 리퀘스트, 처리 시간, 스레드 수를 고려해서 초당 1000건 처리할 수 있을 거라고 가정하고 시스템을 작성했는데 블랙 프라이데이 등 트래픽이 몰릴 시 응답 시간 증가 / 서비스 중단 사용자 응답성에 영향을 미칠 수 있는 변화(갑작스러운 트래픽 변화 등)에 반응하기 위하여 만족해야 하는 것? 탄력성(elasticity) 요청이 많아지면 시스템 처리량이 자동으로 증가했다가, 요청이 감소하면 자동으로 감소 수직적 또는 수평적 확장 ( Scale-Up, Scale-Out ) 하지만 이게 어려운 경우가 있음 ("6장 웹플럭스 - 비동..
[Effective Java] 7장 람다와 스트림
2020.02.16 : Languages & Frameworks/Java[Java] lambda 기본 개념 [Java] Stream API 노트 아이템 42. 익명 클래스보다는 람다를 사용하라 람다의 모든 매개변수 타입은 생략한다. 타입을 명시해야 코드가 더 명확한 경우만 명시 컴파일러가 "타입을 알 수 없다"는 오류를 낼 때만 명시 단, 람다 코드로 명확히 동작을 알 수 없거나 코드 줄 수가 많아지면 람다를 쓰지 않는게 좋다. 람다는 이름도 없고 문서화도 못하기 때문. 함수 객체가 자기 자신을 참조해야 한다면 반드시 익명 클래스를 써야 한다. 람다에서의 `` this``는 바깥 인스턴스를 가리키는 반면, 익명 클래스에서의 `` this``는 인스턴스 자신을 가리킨다. 아이템 43. 람다보다는 메서드 참조를 사용하라 가독성 측면에서 하는 얘기인데, 꼭 메서드 참조가 깔끔하리..
shell prompt (bash, Oh My Zsh)
2020.01.10 : OS/LINUX & UNIXbash Ctrl+Backspace로 단어 삭제하도록 만들기 ```c +++ /etc/inputrc 또는 ~/.inputrc "\C-h": backward-kill-word ``` 이렇게 설정했는데 backspace만 눌러도 한 단어가 지워지는 경우? 더보기 backspace를 누르면 ``c ^?``(0x7f)를 보내도록 되어 있고, Ctrl+backspace를 누르면 ``c ^H``(0x08)을 보내도록 되어 있는게 일반적임 Ubuntu bash 터미널, mac의 iterm2는 이와 같은 식으로 키코드가 발생함 그러나 xshell같은 SSH Client에서는 기본 backspace 키 시퀀스가 ``c ^H``로 설정돼 있어 이런 경우 그냥 backspace만 눌러도 1단어가 지워진다. 기본 키 시퀀스를..
[Effective Java] 6장 enum 타입과 애너테이션 (Annotation)
2019.12.31 : Languages & Frameworks/Java[Languages & Frameworks/Kotlin Java] - [Java] Enum 아이템 34. int 상수 대신 enum 타입을 사용하라 Planet.java 자바에서 enum을 뒷받침하는 아이디어는 다음과 같다. enum 타입 자체는 클래스이며, 상수 하나당 자신의 인스턴스를 하나씩 만들어 public static final 필드로 공개한다. ```java public enum Planet { MERCURY(3.3, 2.4); 이는 곧 public enum Planet { public static final Planet MERCURY = new Planet(3.3, 2.4); ``` enum 상수는 값 뿐만 아니라 로직도 가지고 있을 수 있다! abstract를 이용해서. Operation...
[Effective Java] 5장 제네릭
2019.12.11 : Languages & Frameworks/Java제네릭의 본질은, 런타임에 ClassCastException이 발생하는 것을 막아주어 타입 안전성을 높이는데 있다. 아이템 26. raw 타입은 사용하지 마라 (제네릭 쓸 때 를 빼먹지 않도록 주의해라) raw타입이란 ``java List``가 아니라 그냥 ``List``로, 제네릭을 타입 지정 없이 쓰는 것을 말한다. 이걸로 받으면 아무 타입이나 담을 수 있게 된다. 이는 타입 안전성을 해치게 된다. 예를 들어 List로 캐스팅해서 쓰면, List에 Integer를 넣을 수 있다! ```java List a = new ArrayList(); a.add("qwer"); List b = a; b.add(Integer.valueOf(333)); System.out.println(b.get(0)); Syste..
[Effective Java] 4장 클래스와 인터페이스
2019.12.05 : Languages & Frameworks/Java아이템 15. 클래스와 멤버의 접근 권한을 최소화하라 잘 설계된 컴포넌트는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 완벽히 숨긴다. 필요한 것만 public으로 공개한다. 즉, 구현과 API를 깔끔히 분리하고 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 개의치 않는다. 정보 은닉(=캡슐화) 개념. 메서드를 public으로 한다는건, 다른 컴포넌트가 이 메서드를 사용할 여지가 있다는 것이다. 이는 즉, 바꾸고 싶을 때 의존성 때문에 바꾸지 못하는 경우가 생기고, 지속적으로 관리해줘야 된다는 의미가 된다. 그래서 접근성은 가능한 한 낮게 할당하는 것이 좋다. private이라면 내부에서 언제든 변경 가능하기 때문에. 아이템 16. public 클래스에서는 pu..
[Effective Java] 3장 모든 객체의 공통 메서드
2019.12.04 : Languages & Frameworks/Java아이템 10. equals는 일반 규약을 지켜 재정의하라 자바에서는 `` ==``의 동작이 두 가지다. 원시 타입에 사용할 경우, 두 피연산자의 값이 같은지 비교 (동등성, equality) 참조 타입에 사용할 경우, 두 피연산자의 주소가 같은지 비교 (참조 비교, reference comparision) equals는 두 객체가 물리적으로 같은가가 아니라 논리적 동치성을 확인해야 할 때 재정의 한다. equals 메서드를 재정의 할 때는 반드시 일반 규약을 따라야 한다. equals 메서드는 동치관계(equivalence relation)를 구현하며, 다음을 만족한다. ```java // x, y, z는 null이 아닌 참조 값이어야 함. Objects.requireNonNull() 사용 권장. 반사성..
[Effective Java] 2장 객체 생성과 파괴
2019.12.02 : Languages & Frameworks/Java아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라 GoF에 나오는 팩터리 메서드와는 다르다. public 생성자에 `` new``를 써서 객체를 만드는게 아니라, 아래 처럼 팩터리 메서드를 사용하는 것을 말함. public 생성자와 static factory 메서드는 각자 장단이 있지만, 후자가 유리한 경우가 더 많다. ```java public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } ``` 장점1. 이름을 가질 수 있다. (가독성 향상) 복잡한 생성 시 되게 유용하다. 예를 들면, 리스트를 받아서 해당 요소들을 하나로 merge한 새로운 객체를 만들 때? 값이 소수인 BigInteger를 반환한다..
[DB] 성능 최적화
2019.11.28 : Data Store쿼리에 파라미터 넣어서 필터링 해도 되고 앱에서 로직으로 필터링 해도 되는거라면, 보통 앱에서 하는게 더 좋다. 왜? 장기적으로 봤을 때, 쿼리는 간단하게 가져가는게 좋다. 비즈니스 로직은 앱단에 두고 쿼리는 간단하게 가는 것이 보통 변경에 유리한 구조이기 때문. 유지보수, 관리, 가독성 측면에서. JPA 같은 ORM으로 마이그 할 여지가 있을 때 로직이 쿼리에 들어가 있으면 몹시 곤란하다. 서브 쿼리는 일반적으로 지양하는 편이 좋다 스칼라 서브쿼리는 리턴되는 건수마다 결과를 수행하기 때문에 대량의 결과가 리턴되는 쿼리에서는 성능이 몹시 떨어진다. 스칼라 서브쿼리란? subquery 위치에 따라서 다음과 같이 부른다. SELECT 절에 있는 서브쿼리 : 스칼라 서브쿼리 FROM 절에 있는 서브쿼리 : 인..
[IntelliJ] 내장 Tomcat 사용하지 않고 직접 연결하기
2019.11.26 : Utilities/IDEtomcat 설치 ```bash # java 먼저 설치하고, JAVA_HOME 환경변수 설정. $ brew search tomcat $ brew install tomcat $ /usr/local/Cellar/tomcat@8/8.5.49/bin/catalina configtest # 확인 차 $ /usr/local/Cellar/tomcat@8/8.5.49/bin/catalina start # localhost:8080 접속해서 잘 뜨나 확인 $ /usr/local/Cellar/tomcat@8/8.5.49/bin/catalina stop ``` IntelliJ 연동 Run - Edit Configurations... Tomcat Server 항목 추가 Tomcat Home 경로는 `` /usr/local/C..
[JS] ArrayBuffer와 DataView : TypedArray
2019.10.31 : Languages & Frameworks/JSArrayBuffer는 다음과 같은 상황에서 유용하다. 어떤 API가 커다란 사이즈의 Buffer를 통째로 받아야 해서, Buffer에 여러가지 정보를 담아서 넘겨야 한다. (예를 들어 WebGL. 여러가지 Instance의 정보를 한꺼번에 Buffer에 담아서 넘겨야 한 번에 Buffer를 보고 쭉 그릴 수 있다.) C/C++라면 memcpy를 사용해도 되고 포인터를 이용해서 직접 써도 되지만, JS는 그렇지 않다. 그래서 ArrayBuffer를 이용해서 커다란 Buffer를 할당한 다음, (malloc) Type, byteOffset, length를 지정해서 Buffer의 일부 영역을 Chunk로 반환 받을 수 있다. (포인터로 연결하는 것 같은 느낌) Buffer Chunk1 (Int32Array)..
피어슨 상관 계수 (Pearson Correlation Coefficient)
2019.10.20 : Machine Learning/Theory두 변수가 어떤 상관 관계를 가지는가?를 의미하는 수치다. +1은 완벽한 양의 선형 상관 관계, 0은 선형 상관 관계 없음, -1은 완벽한 음의 선형 상관 관계를 의미한다. X와 Y 사이의 피어슨 상관 계수를 구하는 식은 다음과 같다 \\[r_{XY} = \frac{ \sum^n_i (X_i - \bar{X})(Y_i - \bar{Y}) }{ \sqrt{\sum^n_i (X_i - \bar{X})^2} \sqrt{\sum^n_i (Y_i - \bar{Y})^2} } \\] 여기서 X, Y는 vector인데 식을 조금 들여다보면 결국 다음과 같은 과정이다. 1. 각 vector의 표본평균\\(\bar{A}\\)를 구해서 A의 0이 아닌 각 원소에 빼주어 normalization하고, 2. normalize..