Java Stack/Java
[Java] 양방향 참조 Enum 초기화 순서에 따른 문제 (순환 참조)
[Java] 양방향 참조 Enum 초기화 순서에 따른 문제 (순환 참조)
2022.04.02취급 대상 품목(Good)은 STONE, ALCOHOL, COMPUTER, SHIP, SUSHI 5가지 이고, 이 중 일부는 목적지(Destination) SEOUL, 일부는 BUSAN으로 보내야 한다. 그리고 목적지에 따라, 해당 목적지로 보내는 품목 리스트를 구할 수 있어야 한다. 그러면 아래와 같이 구현 할 수 있는데... @Getter @RequiredArgsConstructor enum Destination { SEOUL, BUSAN; private static final Map goodsByDestination = Arrays.stream(values()).collect(Collectors.toMap( e -> e, e -> Arrays.stream(Good.values()) .filter(v..
[Java] Jackson 프로퍼티명 snake_case <-> camelCase 변환
[Java] Jackson 프로퍼티명 snake_case <-> camelCase 변환
2021.08.01Jackson ObjectMapper 변환 https://stackoverflow.com/questions/10519265/jackson-overcoming-underscores-in-favor-of-camel-case A. @JsonProperty 애너테이션으로 각 필드에 명시해주는 방법 [Java] Jackson ObjectMapper Serialization 좀 귀찮지만, 줄임말 등을 내부 컨벤션에 맞는 이름으로 바꿔줄 수 있어서 오히려 유용할 수 있음. B. 각각의 data class에서 @JsonNaming 애너테이션으로 어떤 이름 변환 사용할지 명시해 주는 방법 ```java @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) ``` C...
[Java] HmacUtils, Mac이 thread-safe하지 않다?
[Java] HmacUtils, Mac이 thread-safe하지 않다?
2021.03.17일반적으로 Hash, HMAC 만들 때는 아래 Util 클래스 사용한다. org.apache.commons.codec.digest.DigestUtils org.apache.commons.codec.digest.HmacUtils 그러나 HmacUtils은 thread-safe 하지 않다. 정확히는, HmacUtils는 thread-safe 하지만 그 안에서 사용되는 Mac이 thread-safe 하지 않다. https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/digest/HmacUtils.html https://stackoverflow.com/questions/31898802/is-macdofinal-thread-..
[Java] Collection 초기화
[Java] Collection 초기화
2020.11.02www.baeldung.com/java-init-list-one-line www.baeldung.com/java-initialize-hashmap www.baeldung.com/java-combine-multiple-collections ```java Arrays.asList(“a”, “b”, “c”); String[] strs = {"a", "b", "c"}; ``` 자바의 immutable? ```java private static final Thing[] PRIVATE_VALUES = { ... }; public static final List VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES)); ``` ```java retur..
[Java] Enum to Json / Enum to Object
[Java] Enum to Json / Enum to Object
2020.04.27EnumConstant 하나를 `` {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 경로 문제
[Spring] resources 경로 문제
2020.03.18*** Spring에 대한 내용과 Jar에 대한 내용이 섞여있어서... 적당히 분리해서 이해해야 함. resources 이하에 있는 파일들(.yml, .properties, 인증서 등)은 컴파일 타임에 CLASS_PATH로 이동하여 함께 포함되어 빌드된다. spring의 경우 target/classes에 위치. jar로 컴파일 하도록 했으면 .jar에 포함된다. 그래서 리소스를 ClassPath 사용해서 제대로 불러왔다면 `` build/resources``를 통째로 날려도 잘 실행 된다. yml 등은 알아서 jar 내에 있는 것을 사용한다. 다만 소스코드 내에서 ClassPath를 쓰지 않고 그냥 File에 접근하게 되면, 실제 파일시스템에 있는 해당 경로로 가서 해당 파일이 있는지를 찾는다. 이 때 ..
[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 참고) 유효성 검사 비용이 지나치게 높거나 실용적이지 않을 때, 혹은 계산 과정에서 암묵적으로 검사가 수행될 때는 유효성..