개발일기
-
"스프링 입문을 위한 자바 객체 지향의 원리와 이해"라는 책을 읽다가 내가 동적 로딩에 대해서 잘못 알고 있었음을 알게 되었다. 다음과 같은 소스코드가 있다. public class A { public static void main(String[] args) { System.out.println("main"); System.out.println(B.value); } } class B { static int value = 0; static { System.out.println("B"); } } 위와 같은 코드를 실행하면, 나는 B -> main -> 0이 호출될 것이라고 생각했으나, 정답은 main -> B -> 0 순으로 호출된다. 처음에는 그 이유가 Java의 동적 로딩(Dynamic loading) ..
static 영역은 동적 로딩 과정에서 초기화되지 않는다"스프링 입문을 위한 자바 객체 지향의 원리와 이해"라는 책을 읽다가 내가 동적 로딩에 대해서 잘못 알고 있었음을 알게 되었다. 다음과 같은 소스코드가 있다. public class A { public static void main(String[] args) { System.out.println("main"); System.out.println(B.value); } } class B { static int value = 0; static { System.out.println("B"); } } 위와 같은 코드를 실행하면, 나는 B -> main -> 0이 호출될 것이라고 생각했으나, 정답은 main -> B -> 0 순으로 호출된다. 처음에는 그 이유가 Java의 동적 로딩(Dynamic loading) ..
2023.11.01 -
주의! 이 글은 정답이 아닌, 제가 이해한 내용을 바탕으로 글을 작성했습니다. 틀린 내용이 있을 확률이 높으며, 문제가 되는 내용이 있으면 얼마든지 지적해 주시면 감사하겠습니다! 현재 풀고 있는 과제에서 COUNT 쿼리를 최적화할 필요가 있어 조사를 하다가 이런 글을 발견했다. https://m.blog.naver.com/birdparang/221574304831 이 글에서는 다음과 같은 Stack Overflow의 질문에 대한 풀이를 해주는데, 일단 질문을 보자 https://stackoverflow.com/questions/511820/select-count-is-slow-even-with-where-clause 질문의 요는 pk를 활용해 (cluster) index를 태워 count 쿼리를 날리는데..
InnoDB에서 clustred-index 기반 COUNT 쿼리의 Disk I/O 줄이기주의! 이 글은 정답이 아닌, 제가 이해한 내용을 바탕으로 글을 작성했습니다. 틀린 내용이 있을 확률이 높으며, 문제가 되는 내용이 있으면 얼마든지 지적해 주시면 감사하겠습니다! 현재 풀고 있는 과제에서 COUNT 쿼리를 최적화할 필요가 있어 조사를 하다가 이런 글을 발견했다. https://m.blog.naver.com/birdparang/221574304831 이 글에서는 다음과 같은 Stack Overflow의 질문에 대한 풀이를 해주는데, 일단 질문을 보자 https://stackoverflow.com/questions/511820/select-count-is-slow-even-with-where-clause 질문의 요는 pk를 활용해 (cluster) index를 태워 count 쿼리를 날리는데..
2023.10.16 -
최근 사이드 프로젝트 서버가 유난히 자주 죽어 몇가지 처리를 해주었다. 그 과정에서 처리한 방법과 느낀 점들을 몇가지 정리해 보았다. 일단 로그를 읽어 문제를 살펴보니, Jackson에서 문제가 발생하는 듯 싶었다. 로그는 다음과 같다. ```json [2023-09-28 04:58:17:441494769] ^[[32m[reactor-http-epoll-2]^[[0;39m ^[[31mWARN ^[[0;39m ^[[1;37m[io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught:^[[33m311^[[0;39m]^[[0;39m - An exception 'java.lang.OutOfMemoryError: Java heap space' [e..
사이드 프로젝트 서버 OOM 문제 삽질한 내용들최근 사이드 프로젝트 서버가 유난히 자주 죽어 몇가지 처리를 해주었다. 그 과정에서 처리한 방법과 느낀 점들을 몇가지 정리해 보았다. 일단 로그를 읽어 문제를 살펴보니, Jackson에서 문제가 발생하는 듯 싶었다. 로그는 다음과 같다. ```json [2023-09-28 04:58:17:441494769] ^[[32m[reactor-http-epoll-2]^[[0;39m ^[[31mWARN ^[[0;39m ^[[1;37m[io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught:^[[33m311^[[0;39m]^[[0;39m - An exception 'java.lang.OutOfMemoryError: Java heap space' [e..
2023.10.15 -
WAN에서 내 컴퓨터로 요청을 보낼 때는 내 컴퓨터가 사용하는 공유기의 Public IP로 접근하게 된다. 여기서 궁금증이 들었다. 만약 공유기 내에 있는 여러 머신들이 같은 포트의 애플리케이션을 열어놓게 된다면, 공유기에서는 내 컴퓨터가 외부에서 요청한 서버인 것을 어떻게 알아차릴 수 있을까? 답은 포트 포워딩(Port Forwarding)이다. 공유기는 사실 모든 머신들의 포트를 외부로 열어주지 않는다. 포트 포워딩이라는 설정이 되어야만 private network에 존재하는 특정 호스트의 특정 애플리케이션을 열어준다. 즉, 외부에서 어디로 접속하면 어떤 머신의 어떤 포트로 연결할지 매핑해 주는 역할이라고 볼 수 있다. private ip의 경우 외부에서 접근할 수 없기 때문에 외부에서 접근하려면 이..
WAN에서 한 private network에 접근하는 방법WAN에서 내 컴퓨터로 요청을 보낼 때는 내 컴퓨터가 사용하는 공유기의 Public IP로 접근하게 된다. 여기서 궁금증이 들었다. 만약 공유기 내에 있는 여러 머신들이 같은 포트의 애플리케이션을 열어놓게 된다면, 공유기에서는 내 컴퓨터가 외부에서 요청한 서버인 것을 어떻게 알아차릴 수 있을까? 답은 포트 포워딩(Port Forwarding)이다. 공유기는 사실 모든 머신들의 포트를 외부로 열어주지 않는다. 포트 포워딩이라는 설정이 되어야만 private network에 존재하는 특정 호스트의 특정 애플리케이션을 열어준다. 즉, 외부에서 어디로 접속하면 어떤 머신의 어떤 포트로 연결할지 매핑해 주는 역할이라고 볼 수 있다. private ip의 경우 외부에서 접근할 수 없기 때문에 외부에서 접근하려면 이..
2023.09.18 -
Isolation Level과 MVCC 여태 한 트랜잭션 내에서 SELECT문을 실행하면 s-lock을 거는줄 알았다. 그 이유는, ACID 특성 중, Isolation에 의해 다른 트랜잭션에서 수정한 결과가 현재 트랜잭션에 영향을 미쳐선 안된다고 생각했기 때문이다. 그러나, InnoDB로 실제로 실행해본 결과 s-lock을 걸지 않음을 알 수 있었다. 그럼에도 불구하고 다른 트랜잭션에서 수정한 결과가 현재 트랜잭션에 반영되지 않음을 볼 수 있었다. 그 이유는 뭘까? 바로 그건 트랜잭션 격리 수준(Isolation Level) 때문이다. InnoDB의 default isolation level은 REPEATABLE_READ이다. 때문에 다른 커넥션에서 수정한 결과가 현재 커넥션에 간섭할 수 없다. 그렇다..
Isolation Level과 MVCCIsolation Level과 MVCC 여태 한 트랜잭션 내에서 SELECT문을 실행하면 s-lock을 거는줄 알았다. 그 이유는, ACID 특성 중, Isolation에 의해 다른 트랜잭션에서 수정한 결과가 현재 트랜잭션에 영향을 미쳐선 안된다고 생각했기 때문이다. 그러나, InnoDB로 실제로 실행해본 결과 s-lock을 걸지 않음을 알 수 있었다. 그럼에도 불구하고 다른 트랜잭션에서 수정한 결과가 현재 트랜잭션에 반영되지 않음을 볼 수 있었다. 그 이유는 뭘까? 바로 그건 트랜잭션 격리 수준(Isolation Level) 때문이다. InnoDB의 default isolation level은 REPEATABLE_READ이다. 때문에 다른 커넥션에서 수정한 결과가 현재 커넥션에 간섭할 수 없다. 그렇다..
2023.09.16 -
알라딘 온라인 중고를 활용하면 좋은 퀄리티의 책을 합리적인 가격으로 구할 수 있다. 중고가로 구할 때 문제가 되는 점은, 배송비다. 위 경우만 해도 5000원 중 3300원이 배송비기 때문에 생각보다 많은 비중을 끼친다. 배송비를 아낄 수 있는 가장 좋은 방법은, 같은 판매자에게서 구매하는 것이다. 그런데 내가 사고싶은 책이 여럿 있을 때 어떤 판매자가 중복되는지, 그런다 하더라도 어떤 조합의 가격이 더 낮은지 일일이 비교해야 한다. 여기서 문제점을 발견해 기술로 해결해보면 어떨까 해서 기능을 구현해 보았다. 정의한 문제 : 온라인 중고 구매시 배송비 포함한 최저가 조합을 찾기 번거롭다. 레포 : https://github.com/JerryK026/aladin-best-price 처음에는 그 날 바로 만..
알라딘 최저가 계산기 회고알라딘 온라인 중고를 활용하면 좋은 퀄리티의 책을 합리적인 가격으로 구할 수 있다. 중고가로 구할 때 문제가 되는 점은, 배송비다. 위 경우만 해도 5000원 중 3300원이 배송비기 때문에 생각보다 많은 비중을 끼친다. 배송비를 아낄 수 있는 가장 좋은 방법은, 같은 판매자에게서 구매하는 것이다. 그런데 내가 사고싶은 책이 여럿 있을 때 어떤 판매자가 중복되는지, 그런다 하더라도 어떤 조합의 가격이 더 낮은지 일일이 비교해야 한다. 여기서 문제점을 발견해 기술로 해결해보면 어떨까 해서 기능을 구현해 보았다. 정의한 문제 : 온라인 중고 구매시 배송비 포함한 최저가 조합을 찾기 번거롭다. 레포 : https://github.com/JerryK026/aladin-best-price 처음에는 그 날 바로 만..
2023.09.13