전체 글
[Spring] DB 관련 : Mybatis
2020.03.04 : Languages & Frameworks/SpringMybatis가 쿼리를 처리하는 방식? 스프링에서는 DB 커넥션을 어떻게 처리하는가? 쿼리 하나 날릴 때 마다 Connection을 맺고 끊는건 비효율적이므로, Connection Pool을 구성하여 Connection을 생성해두고, DB를 사용해야 할 때 Pool에서 커넥션을 빌려 쓰고 반납하게 되어 있다. Spring에서 제공하는 Connection Pool 인터페이스가 바로 `` DataSource`` 각 driver vendor들은 자사 규격에 맞게 `` DataSource`` 인터페이스를 구현해서 제공하고 있음!(커넥션 풀 구현체) ojdbc의 `` OracleDataSource`` jdbc의 `` ~~DataSource`` 각 벤더가 만들어 제공하는게 맞는게, Connection object를..
[Spring] profile로 beta, real 빌드 구분하기
2020.03.03 : Languages & Frameworks/Spring[Spring] 외부 상수 넣어주기 Spring profile VS Gradle(Maven) profile Spring profile? :: @Profile() Spring profile은 빌드 결과물 내에서 스프링이 어떤 profile을 사용할지 선택하는 것 런타임 프로파일 설정 Gradle(Maven) profile? :: .properties, .yml 빌드 시 어떤 profile을 리소스에 포함 시킬지 선택하는 것 빌드타임 프로파일 설정 Maven profile ----- 즉, Gradle profile이 더 큰 파일 개념이고, 선택한 파일 이외는 jar에 포함하지 않을 수 있음. Spring profile의 장점은 아예 빈 자체를 특정 프로파일에만 활성화 하는 등 좀 더 유연하게 사용할 수 있다..
[Effective Java] 12장 직렬화
2020.02.28 : Languages & Frameworks/Java아이템 85. 자바 직렬화의 대안을 찾으라 : JSON, protobuf 신뢰할 수 없는 스트림을 역직렬화하면 원격 코드 실행(RCE) 취약점으로 이어질 수 있다. 샌프란시스코 교통국이 공격당했던게 gadget들 연결해서 gadget chain을 만드는 테크닉을 썼었다고 하는데, 아마 ROP였을 듯? 생각해보면 자바에서도 ROP가 안될거 없지. 실행흐름 돌리는 시작은 역직렬화로 한거고... 아무튼 그래서, JSON이나 protobuf를 사용하자! 아이템 86. Serializable을 구현할지는 신중히 결정하라 Serializable을 구현하여 릴리즈한 뒤에는 수정하기 어렵다. 수정할거면 버전 호환성을 고려해야 함. 모든 직렬화된 클래스는 `` serialVersionUID``을 부여받는다. ``kt s..
[Effective Java] 11장 동시성 + collection 유틸 메서드
2020.02.28 : Languages & Frameworks/Java아이템 78. 공유 중인 가변 데이터는 읽기 쓰기 모두 동기화해 사용하라 lock을 걸어서 sync하는건 성능에 좋지 않으니까, 원자적 데이터를 읽고 쓸 때는 동기화하지 말아야 겠다고 생각하기 쉬운데, 아주 위험한 발상이다. 물론 원자적 데이터(boolean, long, ...)를 읽고 쓰는 동작은 atomic하므로, 배타적으로 수행된다. 배타적으로 수행된다는건, 읽고 쓰는 중 데이터가 훼손되거나 반영이 되지 않는 문제가 없다는 것이다. 그러나 동기화의 기능은 두 가지다. 1. 배타적 수행 2. 스레드 간 통신(한 스레드가 만든 변화를 다른 스레드가 확인할 수 있도록 적용) 원자적 데이터를 읽고 쓰는건 배타적 수행은 만족하지만, 해당 스레드가 만든 변화를 다른 스레드에 공개하는건 보장하지 않는다. 이게 ..
[Effective Java] 10장 예외
2020.02.27 : Languages & Frameworks/Java[Java/Spring] 예외 : Global Exception Handler 작성법 [코딩 노트] Exception 처리, 어떻게 하는게 좋을까? 아이템 69. 예외는 진짜 예외 상황에만 사용하라 아이템 70. 복구할 수 있는 상황에는 CheckedException을, 프로그래밍 오류에는 RuntimeException을 사용하라 아이템 71. 필요 없는 CheckedException 사용은 피하라 Checked Exception은 다음과 같은 상황에서 사용 호출하는 쪽에서 복구할 것이라고 여겨지는 상황 예를 들면 File IO. 예외가 발생하면 닫았다가 다시 열 수도 있고 등등 복구가 가능함. Unchecked Exception은 다음과 같은 상황에서 사용 제대로 쓴다면 일어날 가능성이 없는 경우 예외..
[Effective Java] 9장 일반적인 프로그래밍 원칙 [TIP : String 비교, 문자열 포매팅]
2020.02.26 : Languages & Frameworks/Java아이템 57. 지역번수의 범위를 최소화하라 가장 처음 쓰일 때 선언하고 선언과 동시에 초기화. 초기화 팁? ```java Arrays.asList(“a”, “b”, “c”); String[] strs = {"a", "b", "c"}; ``` 아이템 58. 전통적인 for 문 보다는 for-each 문을 사용하라 for-each를 사용하지 못하는 경우가 있긴 하다. 루프 돌면서 원소 찾아서 제거해야 하는 경우. 근데 요즘은 for문 돌지 말고 ``java removeIf()``를 사용하는 것을 권장함. 루프 돌면서 원소를 변경해야 하는 경우. (인덱스로 접근해야 하는 경우) 병렬로 돌아야 할 때 아이템 59. 라이브러리를 익히고 사용하라 웬만한건 라이브러리에 다 있으니 잘 찾아보고 써라. 이게 대체로 직접..
[Java] ThreadLocal
2020.02.26 : Languages & Frameworks/Java```java class User { } public class ThreadLocalTest { public static void main(String[] args) { User u = new User(); ThreadLocal threadLocal = new ThreadLocal(); threadLocal.set(u); System.out.println(threadLocal); System.out.println(threadLocal.get()); new Thread(()->{ System.out.println(threadLocal); System.out.println(threadLocal.get()); }).start(); new Thread(()->{ threadLocal.set(u); System...
[Effective Java] 8장 메서드 ( null 체크 등 )
2020.02.22 : Languages & Frameworks/Java아이템 49. 매개변수가 유효한지 검사하라 매개변수 유효한지 체크하는건 당연한 얘기이고... null 처리 시 ``java if (null)`` 보다는 ``java Objects.requireNonNull()``이 낫고, 그 보다는 ``java Optional``이 낫다. 자바의 `` assert``는 -ea 플래그를 주지 않으면 런타임에 아무런 효과도 없다. 쓸거면 플래그를 줘서 실행해야 한다. assert는 `` private`` 메서드에서는 사용해도 좋다...고 하는데 이말은 즉, 파라미터 체크는 public 메서드에서 다 끝내고 private 메서드에 넘기는 값들은 항상 조건을 만족하는 값이어야 한다는 얘기. 이므로 바깥에서 체크하고 assert로 또 체크 할 바에 그냥 바깥에서만 하는게 나은 것..
멱집합(모든 부분집합)을 비트 벡터를 이용해 구현
2020.02.22 : Algorithm/Theory원소 개수가 n개이면, 모든 부분집합의 개수는 2^n개가 되므로 멱집합의 원소 개수는 2^n개다. 너무 많다. 비트 벡터를 이용해서 메모리를 n 만큼만 쓰는 방법 https://github.com/umbum/effective-java-3e-source-code/blob/master/src/effectivejava/chapter7/item47/PowerSet.java AbstractList에서 src라는 외부 변수를 사용하고 있다. 클로저.
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단어가 지워진다. 기본 키 시퀀스를..