개발자로서 살아남기 52

서버개발자로서 살아남기 - JPA 사용시 조회방법에 따른 영속성 여부

개요스터디에서 Spring-JPA 환경에서, 쿼리메소드와 @Query 어노테이션을 이용한 JPQL, 네이티브 쿼리을 활용한 조회에 대해 이야기를 하다가, 3개의 조회방법 중 어떤 방법이 영속될까 라는 궁금증이 생겼다.위에서 언급했던 3가지 조회 방법에 대해 영속성 여부을 알아보기로 한다쿼리메서드Query 어노테이션을 활용한 JPQLQuery 어노테이션을 활용한 네이티브 쿼리 테스트관련 내용을 리서치해보는 것도 좋지만, 일단 아묻따 테스트코드를 작성해서 영속성 여부를 확인하였다.사용할 테이블은 회원 정보가 있는 테이블이고, Pk는 memberId이다. 세팅@Autowired private MemberRepository memberRepository; @Autowired private EntityMan..

개발자가 반드시 알아야하는 데이터베이스 - MYSQL(InnoDB)에서 잠금된 데이터을 조회할 수 있는 이유

개요최근 mysql의 잠금에 대한 이슈를 많이 다루고 있는데, s-lock, x-lock된 데이터에 대해 단순 조회가 어떻게 가능할까 라는 생각이 들었다. 일차원적으로 당연히 lock이 되었으니, 읽기가 안되는 것이 아닌가? 라고 생각할 수 있지만, mysq은 비잠금읽기(Consistent NonLocking Reads)로 동작하여, 잠금된 데이터도 조회가 가능하다. 비잠금읽기에 대해 자세히 알아보자.여담으로 mysql 8.0 책을 제대로 읽었다면, 해당 질문에 대한 답을 쉽게 할 수 있을 것이다.(위 생각에 대해 구글링 중 undo를 보자마자 아맞다! 싶었다..)비잠금읽기비잠금읽기mysql(InnoDB)는 기본적으로 비잠금 읽기(Consistent Nonlocking Reads)을 사용한다. 이는 se..

JAVA - Synchronized와 ThreadLocal 을 이용한 동시성 문제 해결

개요static와 synchronized의 연관관계에 대해 한번 정리를 해보려고 한다. 일단 JAVA에서 static은 클래스가 로딩될 때 메모리의 정적 영역(Static Area)에 할당된다.이 영역은 특징은 다음과 같다.JVM이 시작될 때 생성되며, 프로그램의 실행이 끝날 때까지 유지된다.클래스의 모든 인스턴스가 공유하는 공통된 값은 가진다.즉 멀티스레딩 환경에서 주의하여 사용해야한다.테스트아래 예시는 주의하지 않고 사용한 코드이다.public class A { public static int a; public static void plus() { a++; } }public class ATest { @Test public void testP..

ELK - 샤드개수 조정 (Failed to submit a listener notification task. Event loop shut down? java.util.concurrent.RejectedExecutionException: event executor terminated elastic)

개요 replaylog 관련 timeout 에러가 계속 발생하여, 확인해 본 결과, elasticSearch에 문제가 있었고, 정확히는 wb911 머신에 문제가 발생하였다. 머신에 들어가서 확인해보니, elasticsearch는 작동하고 있었지만, 알 수 없는 ERROR 로그들이 남고있었다. 그 중 하나는 아래 로그이다. Failed to submit a listener notification task. Event loop shut down? java.util.concurrent.RejectedExecutionException: event executor terminated elastic 일단 NSight를 확인해보니, 머신이 터지기 직전이여서, 재부팅을 부탁드렸다(다행히도 머신이 문제가 발생하자마자 메..

레거시 프로젝트 리팩토링 하기 feat SpringBoot + JPA

개요 2년전에 우리 팀이 인수인계 받은 프로젝트가 있었다. 해당 프로젝트 역할은 원래 웹에서 게임DB을 사용하기 위해 만든 API 시스템이였는데, 게임서버, 회원 등 여러 도메인에서 게임DB을 이용하면서 규모가 커졌다. 이 프로젝트는 2018년 ~ 2019년 즈음에 구축되어, 새로 들어가는 이벤트 or 기능들 제외하고는 오래된 레거시 코드로 이루어져 있었다. 이슈가 있을 때, 코드를 수정하면서, 리팩토링도 같이 하곤 했는데, 이번에 request로 받는 파라미터 중 유저 ID을 유저 No로 받도록 수정해야하는 이슈가 있었다. 70% 정도의 API가 ID을 Request Param으로 받고 있었기 때문에, 대부분 코드를 수정했어야했다. 이때다 싶어, 리팩토링 작업도 같이 진행하면 어떻겠냐고 팀장님께 제안드..

개발자가 반드시 알아야하는 데이터베이스 - Master와 Slave에 쿼리 분산(Feat. MMM 구조)

개요저번 서버 회의시간에, @Transaction(readonly = true) 옵션에 대해 얘기를 하던 중, slave DB의 dataSource 을 따로 생성해서, Select 쿼리는 slave로 그외 나머지 쿼리는 master로 보내는 방법이 나왔었다. 관련해서 현재 게임 DB는 어떻게 구성되어 있고, 위 방법을 사용할 수 있는지, 알아보았다. MMM (Multi-Master Replication Manager) 구조리얼환경에서 사용중인 DB는 Master 1대와 Slave 2대로 구성되어 있다.Slave 중 1대는 Master와 VIP로 묶여있다. 그렇다면, VIP로 묶은 이유가 장애 대응 때 사용되는 것인지, 로드밸런싱 ip인지(부하분산) DBA분께 물어봤다. mmm vip로, 장애대응을 위해서..

개발자가 반드시 알아야하는 데이터베이스 - MYSQL IS NULL 조건문 쿼리 최적화 하기

개요저번 글에서 스카우터를 활용하여 API의 성능을 측정할 수 있는 Summary 기능을 소개했었다.https://code-killer.tistory.com/190해당 기능을 이용하여 slow 쿼리를 발견하였는데, 아래와 같았다.select * from temp t where t.col is null단순한 구문이라, 인덱스을 활용하여 쿼리 성능을 높이려고 했다.근데, 문득 null 값을 허용하는 컬럼도 인덱스 성능의 효과가 있을까? 라는 의문이 들어, 관련 내용을 찾아보고, 실험도 직접 해봤다.먼저 DB 환경에 따라 달라진다.오라클오라클은 인덱스에 null 값을 저장하지 않는다고 한다.즉 아래와 같은 null을 이용한 쿼리에 인덱스를 타지 않고, Full Scan을 진행한다.select * from te..

ELK - 엘라스틱 서치에 L4 붙일 때 문제점

개요 로그 수집 용도로 ELK를 사용하고 있었는데, 원래 보안 용도로 클라이언트에서 서버를 거쳐 로그를 수집하고 있었다. 로그 양이 많아지니, 서버의 부하가 몰려 성능 이슈가 발생할 수도 있었다. 방지를 위해, 클라에서 ELK로 바로 쏘도록 구조를 변경할 필요성을 느꼈고, VIP와 L4을 추가하도록 하였다. 원래 Elasticsearch는 자체 로드밸런싱 기능이 있어서, 1개의 머신으로 보내도 로드밸런싱을 하지만, 트래픽 양이 많을 때도, 제대로 작동할 지 몰라, 앞단에 로드밸런스를 놓기로 하였다. 문제 사내에서 ELK 구조는 머신 6대를 클러스터로 구성하여 사용하고 있다. 또한, 사용하는 L4 방식이 proxy 방식이다. 아래는 elasticsearch.yml의 일부 내용이다. bootstrap.mem..

스카우터를 활용한 서비스 성능 최적화

개요 우리팀에서는 APM 툴 스카우터을 사용하고 있다. 특히 스카우터의 XLog 기능과 알람 기능을 유용하게 사용하고 있다. 어느날, 오래된 프로젝트에서 deprecated 된 API들을 정리하는 일을 하는데, 존재하는 API가 500개가 넘어가고, 여기서 현재 사용중인 API을 체크하는일은 생각만 해도 막막했다. 쉽게 하는 방법이 없을까? 생각하다가 스카우터의 Summary 기능을 알게되어 사용해보았다. 사용법 먼저 스카우터에 접속한다. 전체 머신 기준으로 보려면 위 이미지 기준 Real에서 오른쪽 클릭을 한다. 주로 보는건 Service , SQL, API CALL이다. 스카우터 설정에 따라 다를수도 있지만 아마 대부분 아래와 같을 것이다. Service : 현재 프로젝트에서 호출하고 있는 API S..

Git 원격 저장소 성능 유지하기 (feat - Git 크라켄 성능 최적화)

개요 협업을 하면 가장 많이 사용할 git 명령어 중 pull, push의 속도가 현저히 느려짐을 체감했다. 아무래도, 여러 게임들이 하나의 프로젝트에 들어가기도 했고, 브랜치를 머지 후에 삭제하는 옵션을 적용안시켰기 때문에, 사용하지 않은 브랜치가 계속 쌓이고 있었다. 원격 저장소 뿐만 아니라, 사용하고 있는 Git 크라켄의 최적화에 대해서도 정리하였다. 1. git gc 명령어를 이용한다. garbage collect을 이용하여, 저장소를 효율적으로 관리한다. 자세한 설명은 아래 링크 참조 https://git-scm.com/docs/git-gc (깃 공식 Doc) ## 깃 크라켄 내 터미널에서는 사용 불가 -> git bash 이용 추천 GC 하려는 폴더로 이동 git gc 명령어 또는 git gc..

728x90