본문 바로가기

개발/Java

(11)
Java GC(Garbage Collector) 배경오늘은 java의 GC에 대해 알아볼고 합니다. 메모리 관리를 위해 java에서 사용한다고 알고만 막연하게 알고 있는데, 같이 알아보도록 하죠! 내용왜 GC가 필요할까요? 우리는 프로그램 중에 많은 변수, 메서드 등을 사용하고 있습니다. 이 변수와 메서드, 다른 객체들이 사용되지 않는데 메모리에 계속 남아 있게 된다면 메모리가 사용할 수 있는 공간이 줄어들어 점점 성능이 떨어지게 될 겁니다. 이를 방지해 주는게 GC죠. GC는 프로그램이 동적으로 할당했던 메모리 영역 중 필요없게 된 영역을 알아서 해제해주는 역할을 합니다. 여기서 동적으로 할당한 메모리 영역은 Heap 영역을 뜻하고, 필요없게 된 영역은 어떤 변수도 가리키지 않게 된 영역을 말합니다. C나 C++에서는 이를 직접 관리를 해서 귀찮은 ..
TaskScheduler를 이용한 주문 취소 구현해보기 배경요구사항 명세서를 받게 되었을 때 주문을 취소하는 부분에 '5분 이후 취소 불가'라고 되어 있어서 단순히 DB에 저장할 때 생성시간 저장해놓고, 주문 취소 API가 날라올 시 조회 후 생성 시간이 5분 초과면 삭제 못하게 하면 되는거 아닌가? 라고 간단하게 생각하고 구현했습니다. 하지만 고객(튜터)분들이 요구했던 내용과는 조금 달랐죠. 튜터분들의 요구사항은 주문 후 5분까지 DB에 저장되지 않았다가 주문 취소가 없을 시 DB에 저장 쿼리를 보내는 것을 구현해보라는 것이었습니다... 역시 사람은 각자 생각하는게 다르더군요. 또 한번 소통의 중요성과 중간 보고 중요성을 느낍니다! ㅎㅎ 무튼 이런 요구사항을 알고 나니 조금 복잡해졌습니다.. 어떻게 구현해야할까...?  조금 힌트를 얻어보니 tread를 이..
디버깅 배경개발 입문자인 저는 아직도 코드를 짤 때마다 System.out.println을 써서 여기저기 찍어보는 일이 대다수고, logging정도만 가끔씩 활용해서 문제를 해결하려고 합니다. debugging을 봐도 사실 어떻게 해야될지 잘 모르겠고... 하지만 더이상 이렇게 갈 순 없겠죠? 디버깅을 조금씩 써보면서 문제점을 빠르게 찾고 해결할 수 있는 능력을 길러야 겠습니다. 오늘은 디버깅에 대해 알아보도록 하죠. 내용디버깅의 처음 시작은 프로그램의 흐름을 파악할 수 있는 break point를 활용해 의심가는 지점을 찾는 것입니다.intellij 기준으로 코드 왼쪽편 라인 근처에 빨간색으로 break point를 찍을 수 있죠. 이 break point는 디버깅을 시작하게 되면 멈추게 되는 포인트입니다. ..
Fetch Join 배경프로젝트 피드백을 받으면서, 튜터분들이 항상 질문하던게 있다. '그렇게 하면 성능이 많이 떨어질 것 같습니다.. 혹시 N+1 문제 고려를 해보셨을까요?', 'DB에서 쿼리를 날려서 가져올 때마다 계산을 진행하게 되면 성능이 많이 저하될것 같은데 다른 방법 혹시 생각해보신거 있을까요?' 등등.. 항상 성능에 관한 것들이 대부분이었던 것 같습니다. 그만큼 현업에서는 성능에 초점을 맞추고 있다는 거겠죠? (물론 비즈니스 로직을 잘 만든다는 가정하에...) 저는 아직까지 비즈니스 로직을 잘 구현하지는 못합니다만..(도메인도 많이 다뤄보질 않았구요 ㅎㅎ) 앞으로는 비즈니스 로직을 구현 하면서 성능 문제도 어느정도 고려를 해봐야 겠다는 생각이 들었습니다. 그중 가장 크게 생각나는 것이 바로 DB와 App간의 소..
Block vs Non-Block & Sync vs Async 배경오늘도 우아한테크의 테코톡을 보며 내용을 정리해 보는 시간을 가져보겠습니다. Sync vs Async? 동기와 비동기를 말하는 것 같은데 이 부분은 평소에 관심이 좀 있던 부분이었으나 Block vs Non-Block은 어떤 것인지 살펴보도록 하겠습니다. 내용Block vs Non-Block먼저 block에 대해서 이야기 해보겠습니다. blocking이란 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다 시작하는 것을 말합니다.  non-blocking이란 다른 주체의 작업에 관련없이 작업을 하는 것입니다. blocking과 non-blocking의 가장 큰 핵심은 다른 주체가 작업할 때 자신의 제어권이 있는지 없는지로 판단한다고 합니다.  Sync vs Asyn..
Thread Pool 배경우아한테크의 테코톡을 보고 배운 내용들을 간단하게 정리해 볼까 합니다.  내용Program  / Process / Thread 스레드를 사용하면서 하나의 프로세스 안에 두 가지 이상의 작업을 병렬 처리 가능(CPU Core가 여러개일 경우) 그러면 단순히 thread를 무한히 늘리면서 작업을 할 수 있을까요? 하나의 요청에 대해서 하나의 thread를 생성하게 된다면 어떻게 될까요? thread는 생성 비용이 크기 때문에 점차 늘어날 수록 메모리를 많이 사용하게 되면서 서버 응답시간이 늘어나게 됩니다. 특히 Java의 경우 One-to-One Threading-Model로 thread를 생성하게 됩니다. process의 처리속도보다 빠르게 요청이 들어오게 된다면 thread가 무한히 생성되게 될 겁니..
static method(정적 메서드) 배경정보처리기사 실기를 공부할 때 외우기에 바빴던 디자인 패턴... 실제 프로젝트에서 어떻게 쓰일까 생각만 하고 있었는데, 진행했던 프로젝트의 피드백을 받으면서 response dto 클래스들을 반환할 때 생서자를 이용하는 대신 static method를 활용해 보는것도 생각해 보라는 의견을 주셨습니다. static method 명명규칙으로 함수명을 만들게 되면, 함수 명만 보고도 어떤 기능을 하는지 유추할 수 있기 때문에 좋을 것같다... 라고 하셨는데 처음엔 이해가 잘 가지 않았습니다. 무슨 말일까...? 싶었지만 같이 보내주신 블로그 글을 보면서 '아 이럴 때 사용했었고 이런 의미였구나!'라고 느꼈습니다. 내용참고한 블로그의 글은 아래쪽에 적어놓도록 하겠습니다. 정말 잘 정리되어 있으니 다른 글들도..
Request, Response Logging 배경프로젝트를 진행하면서 테스트 코드에 익숙치 않다보니 App 실행 후 postman을 활용해 작성한 API와 비즈니스 로직을 테스트 하는 경우가 많았습니다. 테스트 코드 작성이 중요하다는걸 알면서도 제 실력 부족으로 납기를 제대로 못 맞출 것 같은 느낌이 들어서 자꾸 어느정도 코드를 완성하고 App으로 실행하게 되네요.. 실력 부족은 차차 매꾸는걸로 하고... 일단 맨날 local에서 postman으로 테스트를 하다가 github action으로 ec2에 직접 올려서 배포 환경에서 테스트를 팀원들과 진행하게 되었습니다. 일과시간 중에는 상관이 없지만 일과 시간이 끝나고 각자 따로 작업해서 자동으로 ec2에 배포가 될 때, 서버에 문제가 생기는 경우가 발생하기도 했습니다. 일단 늦은 밤 팀원들에게 메시지..