Languages & Frameworks/Java
[Java] Collection 초기화
2020.11.02 : Languages & Frameworks/Javawww.baeldung.com/java-init-list-one-line www.baeldung.com/java-initialize-hashmap www.baeldung.com/java-combine-multiple-collections 자바의 immutable? ```java private static final Thing[] PRIVATE_VALUES = { ... }; public static final List VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES)); ``` ```java return ImmutableMap.of( key1, value1, key2, value2); ImmutableMap.builder() .put..
[Java] Enum to Json / Enum to Object
2020.04.27 : Languages & Frameworks/JavaEnumConstant 하나를 `` {fieldName:fieldValue}`` 형식으로 매핑하고 싶은 경우가 있다 ( 주로 뷰로 전달해야 할 때. ) 기본적으로 jackson의 ObjectMapper는 serialize/deserialize 할 때 Enum 코드만 내려주도록 되어 있다. 즉, ``java PaymentCode.CARD``를 변환하면 ``java "CARD"``가 된다. ``java {code=1, koName="카드", enName="card"}`` 형태로 내려주려면, 뭔가 해줘야 한다 방법 1 ) Jackson / ObjectMapper를 사용하고 싶은 경우 방법 1-1 ) @JsonFormat.Shape.OBJECT key:value 쌍을 내려주고 싶은 경우를 대비해 jackson은..
[Spring] resources 경로 문제
2020.03.18 : Languages & Frameworks/Java*** Spring에 대한 내용과 Jar에 대한 내용이 섞여있어서... 적당히 분리해서 이해해야 함. resources 이하에 있는 파일들(.yml, .properties, 인증서 등)은 컴파일 타임에 CLASS_PATH로 이동하여 함께 포함되어 빌드된다. spring의 경우 target/classes에 위치. jar로 컴파일 하도록 했으면 .jar에 포함된다. 그래서 리소스를 ClassPath 사용해서 제대로 불러왔다면 `` build/resources``를 통째로 날려도 잘 실행 된다. yml 등은 알아서 jar 내에 있는 것을 사용한다. 다만 소스코드 내에서 ClassPath를 쓰지 않고 그냥 File에 접근하게 되면, 실제 파일시스템에 있는 해당 경로로 가서 해당 파일이 있는지를 찾는다. 이 때 ..
[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로 또 체크 할 바에 그냥 바깥에서만 하는게 나은 것..
[Effective Java] 7장 람다와 스트림
2020.02.16 : Languages & Frameworks/Java[Java] lambda 기본 개념 [Java] Stream API 노트 아이템 42. 익명 클래스보다는 람다를 사용하라 람다의 모든 매개변수 타입은 생략한다. 타입을 명시해야 코드가 더 명확한 경우만 명시 컴파일러가 "타입을 알 수 없다"는 오류를 낼 때만 명시 단, 람다 코드로 명확히 동작을 알 수 없거나 코드 줄 수가 많아지면 람다를 쓰지 않는게 좋다. 람다는 이름도 없고 문서화도 못하기 때문. 함수 객체가 자기 자신을 참조해야 한다면 반드시 익명 클래스를 써야 한다. 람다에서의 `` this``는 바깥 인스턴스를 가리키는 반면, 익명 클래스에서의 `` this``는 인스턴스 자신을 가리킨다. 아이템 43. 람다보다는 메서드 참조를 사용하라 가독성 측면에서 하는 얘기인데, 꼭 메서드 참조가 깔끔하리..
[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..