분류 전체보기
[Spring] profile로 alpha, beta, real 빌드 구분하기
[Spring] profile로 alpha, beta, real 빌드 구분하기
2020.03.03[Spring] 외부 상수 넣어주기 https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config Spring profile VS Gradle(Maven) profile Gradle(Maven) profile? 빌드 시 어떤 profile에 속하는 리소스 파일을 빌드 결과물에 포함 시킬지 말지를 결정 빌드타임 프로파일 설정 즉, Gradle(Maven) profile이 더 큰 파일 개념이고, 선택한 파일(e.g., 리소스 파일)을 jar에 포함하거나 포함하지 않거나를 결정하는데 사용함. 예를 들어 alpha/resources.yml 파일을 패키징 시 jar에 포함 할거냐 말거냐. Spr..
[Effective Java] 12장 직렬화
[Effective Java] 12장 직렬화
2020.02.28아이템 85. 자바 직렬화의 대안을 찾으라 : JSON, protobuf 신뢰할 수 없는 스트림을 역직렬화하면 원격 코드 실행(RCE) 취약점으로 이어질 수 있다. 샌프란시스코 교통국이 공격당했던게 gadget들 연결해서 gadget chain을 만드는 테크닉을 썼었다고 하는데, 아마 ROP였을 듯? 생각해보면 자바에서도 ROP가 안될거 없지. 실행흐름 돌리는 시작은 역직렬화로 한거고... 아무튼 그래서, JSON이나 protobuf를 사용하자! 아이템 86. Serializable을 구현할지는 신중히 결정하라 Serializable을 구현하여 릴리즈한 뒤에는 수정하기 어렵다. 수정할거면 버전 호환성을 고려해야 함. 모든 직렬화된 클래스는 `` serialVersionUID``을 부여받는다. ``kt s..
[Effective Java] 11장 동시성 + collection 유틸 메서드
[Effective Java] 11장 동시성 + collection 유틸 메서드
2020.02.28아이템 78. 공유 중인 가변 데이터는 읽기 쓰기 모두 동기화해 사용하라 [Thread-safety] shared mutable state 관리 개인의견 ) 케이스에 따라 적절한 동기화 수준이 다를 수 있다...만 아무튼 shared mutable state가 있다면 항상 동시성 문제 해결 전략이 필요한 것은 맞다. 더불어 lock을 사용할거라면 lock 필드는 항상 ``java final``로 선언하자. 아이템 79. 과도한 동기화는 피하라 동기화 블록 안에서 내가 100% 제어할 수 없는 코드를 호출해서는 안된다. Exception이나 데드락이 발생할 수 있음 람다 등으로 받은 클라이언트의 코드를 호출해서는 안된다. Override 할 수 있는 메서드를 호출해서는 안된다. 이런 코드는 동기화 블록 밖..
[Effective Java] 10장 예외
[Effective Java] 10장 예외
2020.02.27[Java/Spring] 예외 : Global Exception Handler 작성법 [코딩 노트] Exception 처리, 어떻게 하는게 좋을까? 아이템 69. 예외는 진짜 예외 상황에만 사용하라 아이템 70. 복구할 수 있는 상황에는 CheckedException을, 프로그래밍 오류에는 RuntimeException을 사용하라 아이템 71. 필요 없는 CheckedException 사용은 피하라 Checked Exception은 다음과 같은 상황에서 사용 호출하는 쪽에서 복구할 것이라고 여겨지는 상황 예를 들면 File IO. 예외가 발생하면 닫았다가 다시 열 수도 있고 등등 복구가 가능함. Unchecked Exception은 다음과 같은 상황에서 사용 제대로 쓴다면 일어날 가능성이 없는 경우 예외..
[Effective Java] 9장 일반적인 프로그래밍 원칙 [TIP : String 비교, 문자열 포매팅]
[Effective Java] 9장 일반적인 프로그래밍 원칙 [TIP : String 비교, 문자열 포매팅]
2020.02.26아이템 57. 지역번수의 범위를 최소화하라 가장 처음 쓰일 때 선언하고 선언과 동시에 초기화. 초기화 팁? [Java] Collection 초기화 아이템 58. 전통적인 for 문 보다는 for-each 문을 사용하라 for-each를 사용하지 못하는 경우가 있긴 하다. 루프 돌면서 원소 찾아서 제거해야 하는 경우. 근데 요즘은 for문 돌지 말고 ``java removeIf()``를 사용하는 것을 권장함. 루프 돌면서 원소를 변경해야 하는 경우. (인덱스로 접근해야 하는 경우) 병렬로 돌아야 할 때 아이템 59. 라이브러리를 익히고 사용하라 웬만한건 라이브러리에 다 있으니 잘 찾아보고 써라. 이게 대체로 직접 짜는 것 보다 퀄리티도 더 낫다. 그리고 라이브러리 쓸거면 제대로 알아보고 써라. 막 쓰지 말..
[Java] ThreadLocal
[Java] ThreadLocal
2020.02.26```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 체크, Optional )
[Effective Java] 8장 메서드 ( null 체크, Optional )
2020.02.22개인 의견 추가 되어 있음. 아이템 49. 매개변수가 유효한지 검사하라 매개변수 유효성 체크는 메서드 바디 시작 전에 수행해야 한다. ('오류는 가능한 한 (발생지점에서 가까운 곳에서) 빨리 잡아야 한다' 원칙) 보통 파라미터 체크에 assert를 사용하는 것은 걸맞지 않지만, private 메서드라면 파라미터로 넘어오는 값을 통제할 수 있으니 assert를 사용할 수 있다. [assert 에 대해서] 그렇긴 하지만 assert 보단 파라미터 체크에는 require, 내부 상태 체크에는 check 라는 메서드를 만들어 사용하는 것이 좋은 듯. (kotlin의 require, check 참고) 유효성 검사 비용이 지나치게 높거나 실용적이지 않을 때, 혹은 계산 과정에서 암묵적으로 검사가 수행될 때는 유효성..
멱집합(모든 부분집합)을 비트 벡터를 이용해 구현
멱집합(모든 부분집합)을 비트 벡터를 이용해 구현
2020.02.22원소 개수가 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
Reactive Programming
2020.02.17실전! 스프링 5를 활용한 리액티브 프로그래밍 예제 코드 Github 스크린 샷 / 다이어그램 그림파일 왜 리액티브인가? 전통적인 개발 방법대로 작성했을 때 발생했던 문제? 시간 당 리퀘스트, 처리 시간, 스레드 수를 고려해서 초당 1000건 처리할 수 있을 거라고 가정하고 시스템을 작성했는데 블랙 프라이데이 등 트래픽이 몰릴 시 응답 시간 증가 / 서비스 중단 사용자 응답성에 영향을 미칠 수 있는 변화(갑작스러운 트래픽 변화 등)에 반응하기 위하여 만족해야 하는 것? 탄력성(elasticity) 요청이 많아지면 시스템 처리량이 자동으로 증가했다가, 요청이 감소하면 자동으로 감소 수직적 또는 수평적 확장 ( Scale-Up, Scale-Out ) 하지만 이게 어려운 경우가 있음 ("6장 웹플럭스 - 비동..
[Effective Java] 7장 람다와 스트림
[Effective Java] 7장 람다와 스트림
2020.02.16[Java] lambda 기본 개념 [Java] Stream API 노트 아이템 42. 익명 클래스보다는 람다를 사용하라 람다의 모든 매개변수 타입은 생략한다. 타입을 명시해야 코드가 더 명확한 경우만 명시 컴파일러가 "타입을 알 수 없다"는 오류를 낼 때만 명시 단, 람다 코드로 명확히 동작을 알 수 없거나 코드 줄 수가 많아지면 람다를 쓰지 않는게 좋다. 람다는 이름도 없고 문서화도 못하기 때문. 함수 객체가 자기 자신을 참조해야 한다면 반드시 익명 클래스를 써야 한다. 람다에서의 `` this``는 바깥 인스턴스를 가리키는 반면, 익명 클래스에서의 `` this``는 인스턴스 자신을 가리킨다. 아이템 43. 람다보다는 메서드 참조를 사용하라 가독성 측면에서 하는 얘기인데, 꼭 메서드 참조가 깔끔하리..
shell prompt (bash, Oh My Zsh)
shell prompt (bash, Oh My Zsh)
2020.01.10bash 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)
[Effective Java] 6장 enum 타입과 애너테이션 (Annotation)
2019.12.31[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...