전체 글
Happy Hacking!
-
계획 뭔가 오늘 밀도 높게 산건 아니고 평범한 하루였는데 작업들을 잘게 쪼개니까 많이 한 것 처럼 됐다. 오늘 익힌 내용 웹소켓과 폴링 https://www.youtube.com/watch?v=R_agd5qZ26Y 이 영상에 나오는 기능 중 하나에 쓰인다. 우버의 운전수가 탑승객에게 주기적으로 실시간 위치 정보를 쏴준다. 이때 사용자 수도 많고 실시간 데이터도 많다는 걸 고려해야 한다. 2초마다 폴링한다고 하면 1. 탑승객 API측 레이턴시, 2. 탑승객 API측 부하를 가진다고 한다. 만약 운전수가 위치 정보를 업데이트했을 때, 탑승객은 재수 없으면 2초 후에 받아보게 된다. 계속해서 API 서버에 질의하므로 부하가 발생한다. 이러한 이유로 웹소켓을 선택하는 편이 부하를 줄일 수 있다고 한다. 여기서 ..
웹소켓과 폴링계획 뭔가 오늘 밀도 높게 산건 아니고 평범한 하루였는데 작업들을 잘게 쪼개니까 많이 한 것 처럼 됐다. 오늘 익힌 내용 웹소켓과 폴링 https://www.youtube.com/watch?v=R_agd5qZ26Y 이 영상에 나오는 기능 중 하나에 쓰인다. 우버의 운전수가 탑승객에게 주기적으로 실시간 위치 정보를 쏴준다. 이때 사용자 수도 많고 실시간 데이터도 많다는 걸 고려해야 한다. 2초마다 폴링한다고 하면 1. 탑승객 API측 레이턴시, 2. 탑승객 API측 부하를 가진다고 한다. 만약 운전수가 위치 정보를 업데이트했을 때, 탑승객은 재수 없으면 2초 후에 받아보게 된다. 계속해서 API 서버에 질의하므로 부하가 발생한다. 이러한 이유로 웹소켓을 선택하는 편이 부하를 줄일 수 있다고 한다. 여기서 ..
2023.08.08 -
계획 오늘 익힌 내용 RAM에는 왜 Random이란 단어가 들어갈까? 일반적으로 보조기억 장치(HDD)는 헤더를 움직여서 원하는 부분을 읽는다. 따라서 이는 순차 접근 메모리라 부른다. 그러나, 메모리의 경우 원하는 데이터가 어디 있든 직접 접근할 수 있다. 따라서 랜덤 접근이라고 한다. +) RAM(Random Access Memory)는 전기 신호로 값을 저장한다. 위 그림은 1bit 메모리의 예시인데, 위처럼 전기 신호가 계속 돌면서 저장하는 구조이다. 만약 전기 신호가 끊어져 0 값이 계속 들어가게 되면 값이 휘발된다. +) ROM(Read Only Memory)은 바이너리 코드를 사용해 개별 셀에 써 비휘발성 메모리이다. 따라서 펌웨어 등 컴퓨터 부품에 사용된다. Hash 공부한 내용 해시의 성..
RAM에 Random이란 단어가 들어가는 이유 / Hash 공부(Java)계획 오늘 익힌 내용 RAM에는 왜 Random이란 단어가 들어갈까? 일반적으로 보조기억 장치(HDD)는 헤더를 움직여서 원하는 부분을 읽는다. 따라서 이는 순차 접근 메모리라 부른다. 그러나, 메모리의 경우 원하는 데이터가 어디 있든 직접 접근할 수 있다. 따라서 랜덤 접근이라고 한다. +) RAM(Random Access Memory)는 전기 신호로 값을 저장한다. 위 그림은 1bit 메모리의 예시인데, 위처럼 전기 신호가 계속 돌면서 저장하는 구조이다. 만약 전기 신호가 끊어져 0 값이 계속 들어가게 되면 값이 휘발된다. +) ROM(Read Only Memory)은 바이너리 코드를 사용해 개별 셀에 써 비휘발성 메모리이다. 따라서 펌웨어 등 컴퓨터 부품에 사용된다. Hash 공부한 내용 해시의 성..
2023.08.07 -
계획 오늘 한 일 영속성 전이 엔티티가 영속성 컨텍스트에 올라가는 순간 ATDD 미션을 하다가 Section에 대한 POST 요청에서 Location 헤더에 id 값이 null이 찍히는 현상이 발견되었다. 코드는 다음과 같다. 신기하게도 동작은 제대로 하고있고, db에도 엔티티가 제대로 들어가고 있었다. 따라서 이건 영속성 컨텍스트의 문제가 아닐까 하는 생각이 들었다. 여기서 Section은 Line에서 ManyToOne으로 가지고 있고, OrphanRemoval = true, CascadeType.ALL을 준 상황이었다. 서비스 레이어가 지저분해지는 것이 싫어 SectionRepository.save()와 같은 동작은 따로 안 하고 Line.addSection()에서 영속성 전이를 통해 레코드를 추가하..
영속성 전이 엔티티가 영속성 컨텍스트에 올라가는 순간 / lambda와 익명 객체와의 차이 / PO와 기획자의 차이계획 오늘 한 일 영속성 전이 엔티티가 영속성 컨텍스트에 올라가는 순간 ATDD 미션을 하다가 Section에 대한 POST 요청에서 Location 헤더에 id 값이 null이 찍히는 현상이 발견되었다. 코드는 다음과 같다. 신기하게도 동작은 제대로 하고있고, db에도 엔티티가 제대로 들어가고 있었다. 따라서 이건 영속성 컨텍스트의 문제가 아닐까 하는 생각이 들었다. 여기서 Section은 Line에서 ManyToOne으로 가지고 있고, OrphanRemoval = true, CascadeType.ALL을 준 상황이었다. 서비스 레이어가 지저분해지는 것이 싫어 SectionRepository.save()와 같은 동작은 따로 안 하고 Line.addSection()에서 영속성 전이를 통해 레코드를 추가하..
2023.08.03 -
계획 문서 템플릿 작성은 매우 중요한 일인데도 자꾸 미루게 되는 것 같다. 내일은 다른 걸 제쳐두고 이것부터 먼저 처리하도록 하자. 배운 일 정렬하려는 레코드 수가 메모리보다 크다면 최근 오픈 카톡방에서 이런 주제의 톡이 나왔다. 해당 부분은 RealMySQl 9.2.3.1 소트 버퍼에서 나온다. 메모리의 소트 버퍼에서 정렬을 수행하고, 그 결과를 임시로 디스크에 기록한다. 그리고 레코드를 가져와서 다시 정렬해서 반복적으로 디스크에 임시 저장한다. 이 병합 정렬을 멀티 머지(Multi-merge)라고 표현한다. 여기서 sort_buffer 크기만큼 레코드를 쪼개기 때문에 suffer_buffer를 무작정 크게 잡는다고 해서 성능에 이점을 얻을 수 있는 건 아니다. MySQL에서는 sort_buffer가 ..
정렬하려는 레코드 수가 메모리보다 크다면 / JWT / resolver vs proxy vs handler계획 문서 템플릿 작성은 매우 중요한 일인데도 자꾸 미루게 되는 것 같다. 내일은 다른 걸 제쳐두고 이것부터 먼저 처리하도록 하자. 배운 일 정렬하려는 레코드 수가 메모리보다 크다면 최근 오픈 카톡방에서 이런 주제의 톡이 나왔다. 해당 부분은 RealMySQl 9.2.3.1 소트 버퍼에서 나온다. 메모리의 소트 버퍼에서 정렬을 수행하고, 그 결과를 임시로 디스크에 기록한다. 그리고 레코드를 가져와서 다시 정렬해서 반복적으로 디스크에 임시 저장한다. 이 병합 정렬을 멀티 머지(Multi-merge)라고 표현한다. 여기서 sort_buffer 크기만큼 레코드를 쪼개기 때문에 suffer_buffer를 무작정 크게 잡는다고 해서 성능에 이점을 얻을 수 있는 건 아니다. MySQL에서는 sort_buffer가 ..
2023.08.01 -
계획 오늘 한 일 peek()을 사용하면 스트림 체이닝을 디버그할 수 있다 peek()는 forEach와 달리 스트림 요소를 소모하지 않기 때문에 filter()나 map() 결과를 디버그하기 좋다 fileStream.map(File::getName) .filter(s -> s.indexOf('.') != -1) .peek(s -> System.out.printf("filename=%s%n", s)) .map(s -> s.substring(s.indexOf('.') + 1)) .peek(s -> System.out.println("filename=%s%n", s)) .forEach(System.out::println); IO 스트림, 문자스트림, 보조 스트림 스트림은 단방향으로 흐르기 때문에 입력 스트림..
peek() / Java 스트림 종류 / 성격 기질 검사계획 오늘 한 일 peek()을 사용하면 스트림 체이닝을 디버그할 수 있다 peek()는 forEach와 달리 스트림 요소를 소모하지 않기 때문에 filter()나 map() 결과를 디버그하기 좋다 fileStream.map(File::getName) .filter(s -> s.indexOf('.') != -1) .peek(s -> System.out.printf("filename=%s%n", s)) .map(s -> s.substring(s.indexOf('.') + 1)) .peek(s -> System.out.println("filename=%s%n", s)) .forEach(System.out::println); IO 스트림, 문자스트림, 보조 스트림 스트림은 단방향으로 흐르기 때문에 입력 스트림..
2023.07.27 -
한 일 뭔가 요즘 하루는 꽉꽉 채워서 사는 것 같은데 자바 공부는 따로 못하고 있다. 시간을 누수하는 포인트가 있나? 요즘 운동을 자주 가긴 하는데 운동에 다녀오면 공부에 집중하기 힘들다. 매일 가지는 말고 날짜를 좀 조정해 봐야겠다. 배운 것 테스트하기 쉽도록 객체 쪼개기 이건 어디서 권장하는 스타일은 아니고, 내가 개발한 야매 비법이다. 메서드를 단위 테스트할 때 가끔 주입받는 객체에 따라서 테스트하기 어려워질 때가 있다. 예를 들어, 다음과 같은 코드가 있다고 하자 class A { public Something doSomething(Location location) { int x = location.getX(); int y = location.getY(); return makeSomething(x..
테스트하기 쉽도록 객체 쪼개기 / ProxySQL의 캐치프라이즈(문제 해결 전에 문제 인식부터. 문제 인식 전에 도메인부터) / 설계를 뒤엎는 것은 도메인을 조금 더 이해한 것이다한 일 뭔가 요즘 하루는 꽉꽉 채워서 사는 것 같은데 자바 공부는 따로 못하고 있다. 시간을 누수하는 포인트가 있나? 요즘 운동을 자주 가긴 하는데 운동에 다녀오면 공부에 집중하기 힘들다. 매일 가지는 말고 날짜를 좀 조정해 봐야겠다. 배운 것 테스트하기 쉽도록 객체 쪼개기 이건 어디서 권장하는 스타일은 아니고, 내가 개발한 야매 비법이다. 메서드를 단위 테스트할 때 가끔 주입받는 객체에 따라서 테스트하기 어려워질 때가 있다. 예를 들어, 다음과 같은 코드가 있다고 하자 class A { public Something doSomething(Location location) { int x = location.getX(); int y = location.getY(); return makeSomething(x..
2023.07.26