Java 6

같은 클래스인데 왜 ClassCastException이 발생하는걸까? Redis Cache Manager가 DevTools와 만났을 때

캐싱 했더니 ClassCastException이 발생한다. java.lang.ClassCastException: com.example.demo.User cannot be cast to com.example.demo.User ?????????????? 이해할 수 없는 에러 메시지였다. 앞뒤가 똑같은 클래스구만 왜 캐스팅이 안된다는 건지 의문이었다. https://brunch.co.kr/@springboot/212 Spring Boot DevTools 클래스로더 이슈 - 스프링부트 관련 잡다한 기술 이야기 | "Spring Boot DevTools 클래스로더 이슈"라는 제목으로 글을 작성하였는데, 막상 글을 다 작성한 후 다시 읽어보니 너무 잡다한 내용이 되었다. 그래서, 이 글 brunch.co.kr 이 ..

Java의 File Path 상대경로

Path를 나타내는 방법에는 절대경로와 상대경로가 있다. 절대경로 : 시스템 루트 디렉터리에서부터 시작해 모든 경로를 표시한다. 상대경로 : 특정한 디렉터리(현재 디렉터리)를 기준으로 위치를 표시한다. 그렇다면, 자바(JVM)는 어디를 상대경로의 기준 디렉터리로 인식하는 걸까? System.getProperty("user.dir"); 시스템 프로퍼티를 읽어보면 바로 알 수 있다. intelliJ에서는 프로젝트 내부에 들어있는 파일들의 상대경로를 간단히 구해올 수 있다. 우클릭 -> Copy Path -> Copy Path... -> 4. Path from repository root

Java Garbage Collection

더보기 https://d2.naver.com/helloworld/1329 Garbage Collection stop-the-world! GC 실행 중에는 애플리케이션이 멈춘다. GC를 실행하는 쓰레드를 제외한 나머지 모든 쓰레드가 작업을 멈춘다. 어떤 GC 알고리즘이라도 stop-the-world는 발생한다. GC 튜닝은 대개 이 stop-the-world 시간을 줄이는 것이다. 메모리를 명시적으로 해제할 때? 해당 객체를 null로 지정하기 System.gc() 호출하기 -> 절대 하지 말 것. 성능저하! 가비지 컬렉터의 두 가지 가설 - Weak Generational Hypothesis 1. 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다. 2. 오래된 객체에서 젊은 객체로의 ..

Custom Annotation을 AOP로 처리하기

Custom Annotation은 사용할 수 있는 범위가 정말 넓다. 속성은 눈에 명확히 보이면서, 복잡한 로직은 한 꺼풀 숨겨두고 싶을 때 유용하게 쓸 수 있다. 이번에 Custom Annotation을 사용했던 케이스는 조건에 따라 분기처리가 필요하고, 비즈니스 로직과 직접적인 연관이 없는 앞단의 필터링 작업이면서, 두 곳에서 중복 발생되는 작업이었다. 이런 경우에 if문을 사용할 경우, 비즈니스 로직과 얽혀 코드가 복잡해진다. AOP만 사용할 경우, 필터링 작업이 눈에 보이지 않아 추후에 혼란을 야기할 수 있다. 따라서, 코드는 분리하면서, 작업을 따로 정의해두었다는 표시도 눈에 잘 띄게 해주는 방법이 Custom Annotation + AOP 방식이라고 판단했다. Custom Annotation ..

Object가 8바이트인 이유? Wrapper Class가 16바이트인 이유?

Object : 8바이트 = 레퍼런스 주소(4바이트) + GC 카운팅(1바이트) + 락(1바이트) + 해시(2바이트) Integer = Object(8) + int(4) + 의미없는 패딩값(4) 객체들은 8바이트 단위로 이루어져 있다. (8, 16, 32, 64) 그 이유는 비트연산을 통해 빠르게 memory access를 하기 위함이다. 비트연산 >> 세번하면 x8이 된다. 8에 안맞추면 매번 memory access 시 더하기 연산을 추가로 해주어야하기 때문에 느려진다. https://stackoverflow.com/questions/11926415/why-do-java-objects-have-to-be-a-multiple-of-8

Assert.assertEquals(double, double, delta)

JUnit은 기존의 assertEquals(double, double)을 deprecated 처리하고 assertEquals(double, double, delta) 값을 권장하고 있다. 이유는 오차가 delta 값의 범위 내에 있을 경우, 서로 같다고 보고 테스트를 통과할 수 있도록 하기 위해서이다. double은 계산을 거치면 부정확한 값이 된다. https://stackoverflow.com/questions/33274030/why-is-my-assertequals-deprecated-in-junit/33274105