전체 글

서버는 꺼지지 않아요
· 언어/JAVA
누군가 JVM이 무엇인지에 대해, 그리고 정확히 어떤 역할을 하는지에 대해 물어본다면 명확하기보단 두루뭉실한 대답이 많이 나올 것만 같다. 그냥 대충 뭐.. 자바 코드 실행시키고 관리해주는거야.. 자칭 Java가 주력인 개발자이면서 JVM 위에 대충벌레가 기어다닌다는 것.. 매우 부끄러운 일이다. JVM의 정의와 하는 역할에 대해 다시 한 번 정리해보자! Java Virtual Machine (JVM) JVM은 자바 가상 머신(Java Virtual Machine)의 줄임말이다. JVM은 자바 코드를 OS 독립적으로 실행시켜줄 수 있는 매우 중요한 도구이다. OS가 무엇이든간에, 해당 OS에 맞는 JVM을 설치하기만 하면 자바 코드를 실행시킬 수 있다. 우리는 Azul, 오라클, 아마존 등의 벤더 사에..
· 언어/JAVA
이전에 게시했던 ReentrantLock과 유사하게 자바에선 synchronized 키워드를 통해 특정 클래스 및 인스턴스에 대한 동기화를 제공한다. 개인적으론 synchronized 키워드를 직접 코드단에 사용하기보단 코어한 라이브러리들을 뜯어보며 발견한 경우가 대부분이었기에 동기화라는 키워드로 느낌만 대충 이해하고 있었다. 하지만 synchronized는 사용 방식에 따라 락 범위에 약간의 차이가 있고, 이를 이해하지 않고 사용하면 예상치 못한 문제를 만나게 될 수 있다. synchronized를 락의 관점에서 정리해보자! 1. synchronized method 아래와 같이 메서드 단위로 synchronized를 선언할 수 있다. public class SampleClass { public sync..
· 개발자취
문제상황 프로젝트에서 시간 관련 객체는 모두 타임존 정보가 없는 LocalDateTime 객체로 처리되고 있다. 사실 별 이유가 있었던 것은 아니고 잘 몰라서였다.(흑흑) 서버의 타임존은 KST로 설정되어있었기 때문에 요청값과 응답값이 모두 별도의 타임존 값 없이 암묵적으로 KST 시간대로 통일되어 돌아가고 있었다. 그런데 프로젝트에 여러 클라이언트들이 붙으며 작업을 할수록 문제가 생겼다. 서비스에서 사용자 개인이 직접 표시 시간대를 설정할 수 있고, 이 설정값에 따라서 KST로 설정되어있는 시간 데이터를 다시 적절히 계산하여 내려줘야하는데 이걸 서버 측에서 모두 하자니 누락되는 부분이 발생할 확률이 매우 높았고, 표시 시간대 데이터를 매번 조회해야하므로 성능상 좋지도 않았다. 결국 성능과 유지보수 측면..
🎉 경축 🎉 무려 23년 7월에 게시하였고 12월에 Merge, 그리고 그 이후 3개월 후인 오늘 Jakarta mail-api 2.1.3 버전에서 나의 PR이 릴리즈되었다 😊 남들이 보면 별 거 아닌 것일수도 있지만... 학생 시절엔 이런 건 도대체 어떤 사람들이 하는걸까 싶었는데 직접 해보니 감개가 무량하다. 무엇보다 어디사는지 어떻게 생겼는지도 모르는 사람이랑 몇 달간 커뮤니케이션하면서 문제 해결 과정을 공유한 것이 너무 좋은 재미있었고 좋은 경험이었다! 개발하면서 이건 왜 이렇게 했을까 저건 왜 저렇게 했을까 불편함을 참 많이 느끼는 나인데 또 다른 프로젝트들도 드나들면서 고칠만한 거 없는지 더 찾아봐야겠다 흐흐흐 글 보러가기 https://seongonion.tistory.com/145 생애 ..
· 언어/JAVA
자바에서는 스레드 간 동기화 작업을 지원하기 위해 synchronized와 ReentrantLock을 지원한다. 그 중 ReentrantLock은 synchronized와 비교해 조금 더 유연한 락 획득 및 관리 방식을 지원하고 있다. 기본적인 작동 방식을 익혀보자. 공정한 락과 비공정한 락 ReentrantLock 인스턴스를 생성할 때는 fair 라는 인자를 설정해 락 획득을 "공정"하게 처리할지 아닐지를 설정할 수 있다. 여기서 "공정"하다는 의미는 락 획득을 대기 중인 스레드들에 대하여 가장 오래 대기한 스레드에게 먼저 락을 점유할 수 있도록 우선권을 준다는 의미이다. 생성자에서 볼 수 있다시피, fair 인자에 따라 아예 다른 인스턴스를 생성해주는 것을 확인할 수 있다. 인자가 없는 기본 생성자도..
· 언어/JAVA
종종 필요하지만 그때마다 매번 까먹어서 검색하게되는 동시성 검증을 위한 테스트 코드 작성법을 정리해보자. 동시성 검증 테스트 코드의 개념은 간단하다. 1. 검증하고자 하는 메서드를 별개의 스레드에서 동시에 실행시킨다. 2. 실행시킨 스레드의 모든 작업이 끝날 때까지 기다린다. 3. 결과를 확인하다. java.util.concurrent 패키지에 존재하는 클래스들을 적절히 사용하여 위 작업들을 수행할 수 있다. 책의 개수를 카운트하는 간단한 예제 코드를 만들어보자. @Service public class BookCountService { private int count; public void setCount(int count) { this.count = count; } public int getCount(..
· 개발자취
서론 입사 후 가장 많은 커밋을 남긴 프로젝트라고 한다면 역시 PHP 기반 레거시 코드를 Java + Spring Boot 기반 프로젝트로 마이그레이션 한 메일 API가 되겠다. 비슷한 시기에 개발된 모바일 애플리케이션에서만 선제적으로 배포되어 다소 시험적으로 운영되던 해당 프로젝트는 이제 정말 웹 환경에서의 본격적인 릴리즈를 앞두고 있다. (두근두근) 릴리즈가 얼마 남지 않은 현 시점에서, 프로젝트 중 가장 많은 트래픽을 받을 것으로 예측되는 엔드포인트의 쿼리가 어떤 식으로 개선되어왔는지 정리하고자 한다. 참고로 사내 메일 데이터는 MySQL 데이터베이스에서 관리되고 있으며, 본문에 작성되는 코드들은 모두 예시를 위해 임의로 작성되었음을 알린다. 문제상황 메일 API에서 가장 많은 트래픽을 받는 엔드포..
서론 서버 성능 향상을 위해 쿼리를 튜닝할 일이 잦아지면서, 최근에는 아무리 간단해보이는 쿼리라도 explain을 통해 실행 계획을 반드시 살펴보는 습관이 생겼다. 실행 계획에서 확인할 수 있는 정보는 매우 다양한데, 그 중 Extra 컬럼에 나오는 Using temporary와 Using filesort은 가능한 제거할 수 있도록 해야한다는 말을 동료 및 선임 개발자분들에게 많이 들었다. 해당 키워드가 대략적으로 무엇을 의미하는지는 느낌적으로 이해하고 있었지만, 왜 발생하는지 그리고 정확하게 무엇을 의미하는지 정리해보고자 한다. MySQL의 정렬 방식 Using Temporary와 Using filesort는 모두 MySQL의 데이터 정렬 방식과 연관이 있다. MySQL이 조회한 데이터를 정렬하는 방식..
SeongOnion
조무래기 코딩