Backend/개발
-
[DB] 커버링 인덱스, 실행 계획 Using indexBackend/개발 2023. 9. 11. 01:25
작년에 작성했던 인덱스로 조회 시 개선되는 성능 확인해 보기 에 이어서, 이번에는 실행계획을 확인하고, 커버링 인덱스가 사용되는 쿼리는 어떤 것인지 좀 더 정리해보려고 한다. 기본 개념 및 특징 예전에 정리했던 인덱스 개념 https://github.com/kang-jisu/dev-study-log/blob/main/background/database/%EC%9D%B8%EB%8D%B1%EC%8A%A4.md 인덱스 insert, update, delete (Command)의 성능을 희생하고 select(Query)의 성능을 향상시킨다. 데이터 파일이 있는 디스크에 직접 접근하지 않고, 메모리 저장소 내(인덱스) 안에서 최대한 해결하면서 성능을 개선할 수 있다. 클러스터드 인덱스 물리적으로 데이터가 정렬되어..
-
[Spring Boot] @Transactional Rollback 관련 트러블슈팅Backend/개발 2023. 1. 30. 02:26
사이드프로젝트 게임 저장로직에 문제가 생겨서 해결하다 알게 된 내용을 정리해보려고 한다. 생각보다 간단하고 많이 봤던 이슈였는데 발견하는데 좀 오래 걸려서 기록 남기기용.. 게임을 저장할 때 1. 게임 정보 저장 2. 팀 정보 저장 3. 참가자 정보 저장 3-1. 회원 정보 업데이트 이렇게가 @Transactional로 걸려서 한 트랜잭션에 묶여있는데 3-1. 회원정보 업데이트를 하는 로직에 외부 API (라이엇 API)를 호출하는 부분이 있었다. 우리는 게임 등록을 보통 새벽 12~1시쯤 하게 되고, 게임마다 10명의 참가자의 정보를 외부 API를 호출해서 가져오고 있었는데 이때 왜인지 timeout이 자주 나서 한동안 게임등록이 자꾸 실패했다. 그런데 게임 등록이 모두 실패하는 게 아니고 1,2는 저..
-
[Spring Boot] List의 null값 처리하기2 - 일급컬렉션, @RequestBodyBackend/개발 2022. 5. 15. 16:04
컨트롤러에서 List로 된 요청을 받아오는 과정에서, null이나 empty List가 왔을 때 처리하는 방법에 대한 글이다. 이전에 올렸던 [Spring Boot]List의 null 값 처리하기1 - CustomConverter로 @RequestParam 에서 좀 애매한 부분이 있었는데, 다른 해결 방안이 될 수 있을 것 같아서 적어본다. 이전 글은 param, List 이고 이번 글은 body, List 라 조금 다를 수도 있지만 일단 기록용 ㅎㅎ;; 요청으로 받을 DTO를 json파일로 받아와 게임을 등록하는 API가 있었는데, 이 json파일을 리스트로 한번에 받아올 수 있게 하려고 한다. public ResponseEntity saveGameRecords( @RequestBody List rio..
-
[Spring Boot] 카카오 로그인 - 1Backend/개발 2022. 5. 1. 13:20
oauth 로그인을 구현하는 방법 oauth의 기본 로직은 다음과 같다. 출처 : https://datatracker.ietf.org/doc/html/rfc6749 보통 OAuth의 인증 종류(grant type)으로 Autorization Code을 주로 사용한다. Resouce Owner로 부터 리소스 사용 동의를 받으면 Authorization Server는 Client에게 Token을 발급해준다. Client는 Token을 가지고 Resource Server에게 Resource Owner의 정보를 요청한다. Client는 받은 정보를 이용해서 로그인을 진행하거나, 추가적인 회원가입으로 애플리케이션에 필요한 기능을 개발한다 Access Token이 만료되면 웹페이지를 사용하고 있는 Resource ..
-
[Spring Boot] JPA Flush 특징, 문제 해결Backend/개발 2022. 4. 17. 20:16
JPA 특징 중 쓰기지연과 Flush에 관련한 글이다. JPA JPA는 엔티티를 영속성 컨텍스트에서 관리하며, JPA의 모든 데이터 변경은 트랜잭션 안에서 실행된다. tx.begin() tx.commit() tx.rollback() 쓰기지연 쓰기 지연이란 트랜잭션을 커밋하기 직전까지 데이터베이스에 엔티티를 저장하지 않고 내부 쿼리 저장소에 SQL을 모아뒀다가, 트랜잭션을 커밋할 때 모아둔 쿼리를 반영하는 과정이다. 이때 실제로 반영하는 작업을 flush라고 한다. 쓰기 지연의 이점 성능상 이점 (50개의 insert를 50번씩 하는 것보다 한 번에 50개를 다 하는 게 낫다) 데이터베이스 테이블 row에 lock 걸리는 시간 최소화 Flush 플러시 하는 방법 트랜잭션 커밋 시 flush 자동 호출 em..
-
[Spring Boot] List의 null 값 처리하기1 - CustomConverter로 @RequestParamBackend/개발 2022. 4. 7. 17:18
요청이 컨트롤러에게 전해질 때 HandlerAdapter -> ArgumentResolver -> Handler(Controller)로 전해지는데 이때 ArgumentResolver에서 Converter를 사용해서 값을 변경한다. @RequestParam으로 값을 받아올 때 ", "로 구분하면 List로 받아와 지는 것도 StringToCollectionConverter에서 변환이 이뤄지기 때문이다. public ResponseEntity result( @RequestParam(required = false) List searchNames, @RequestParam(required = false) List gameTypes) { // 빈 값 들어올 경우 if (searchNames != null) { s..
-
[DB] 인덱스로 조회시 개선되는 성능 확인해보기Backend/개발 2022. 2. 23. 20:33
DB의 인덱스 라는 개념이 분명히 우리가 목차나 여러가지 인덱스를 접할 기회가 많은데도 되게 와닿지 않는다고 느꼈다. 아무리봐도 이론으로 글만 보려니까 재미가 없어서 그런지.. 그래도 중요한 개념이라 정리해보고 있는데 그런김에 실습을 한번 해보았다. 현재 하고있는 토이프로젝트에 1년간 쌓인 게임 데이터는 총 1200개이고 한 판에 참가하는 인원이 10명이라 참가자에 대한 데이터는 12000개가 쌓여있었다. 만약에 챔피언ID를 기준으로 해당 챔피언을 사용한 게임을 조회한다거나, 뭐 count를 세서 기간내에 가장 많이 사용된 챔피언이 무엇인지 검색할 일이 있다면 !? 일단 mysql query 몇가지를 정리해본다. select count(*) as cnt from game_record_participant..
-
[Spring Boot] Trouble ShootingBackend/개발 2022. 1. 27. 00:00
프로젝트 ControllerTest , 게임 조회 구현 기록 Jackson 버전 Pagable Pageable 객체 선언 방법 List를 Page로 바꾸는 방법 @PageDefault RequestParam에 List verify와 then should DeleteIn vs DeleteById vs DeleteInBatch Query로 Delete @Modifying의 clearAutomatically @Transcational @OneToMany의 Cascade와 orphanRemoval orphanremoval = true 매핑관계가 있을 때 delete(entity) 오류 findTopByOrderBy Jackson 버전 java.lang.NoClassDefFoundError: com/fasterx..