전체 글

전체 글

    JPA 성능 개선기 1. 쿼리 개수 및 시간 로깅

    서론 Spring Data JPA를 사용하면 메소드 이름만으로도 쿼리문을 자동으로 만들어준다. 덕분에 쿼리문을 작성하지 않고도 빠르게 개발이 가능하다. 그러나 잘못사용할 경우 N+1 문제와 같이 쓸데없이 많은 쿼리가 날라가 성능저하가 발생할 수 있다. JPA 성능을 개선하기 전 각각의 요청마다 얼마나 많은 쿼리가 발생하는지 눈으로 확인하기 위해 쿼리 개수 및 시간을 로그로 찍어보려고 한다. JPA에서 쿼리 개수 및 시간을 측정하는 방법 StatementInspector 하이버네이트에서 제공하는 기능 중 StatementInspector이라는 것이 있다. StatementInspector를 이용하면 JPA가 자동으로 생성하는 SQL문을 중간에 조회하거나 수정할 수 있다. hibernate 공식 문서 공식 ..

    Mysql 쿼리최적화

    서론 쿼리최적화를 왜 해야할까? 그 이유는 바로 긴 로딩시간으로 인한 사용자 이탈을 방지하기 위해서이다. 웹 애플리케이션에서는 DB를 조회하고 저장하는 작업이 주를 이루는데, 쿼리 성능이 낮다면 자연스레 응답속도 또한 늦어질 수 밖에 없다. 로딩 속도가 사용자 경험 뿐만 아니라 회사의 매출액과도 직결된다는 내용의 기사도 있다. 참고 : 웹 로딩 속도 1초에 아마존 매출 68억달러 달렸다 문제되는 쿼리 확인 아래 SQL문을 통해 실행 시간이 긴 쿼리를 확인할 수 있다. # 실행 시간이 긴 쿼리 확인 SELECT query, exec_count, sys.format_time(avg_latency) AS "avg latency", rows_sent_avg, rows_examined_avg, last_seen ..

    더미데이터 100만개를 넣기위한 여정

    인덱스를 통해 쿼리 실행계획을 개선하려고 한다. 실제 서비스를 운영하는 DB라고 가정하고 실행계획을 보기 위해 더미데이터 100만개를 각 테이블에 넣어야 했다. 테이블마다 100만개의 더미데이터를 넣는 것은 쉽지 않다. 더미데이터를 생성하고 넣으면서 시도했던 방법을 정리해봤다. 실제 성공한 방법은 방법 6 이다. 방법 1 - mockaroo를 이용해서 데이터를 생성하고 삽입 랜덤 데이터를 자동으로 만들어주는 mockaroo라는 사이트가 있다. 이 사이트를 이용하면 내가 원하는 형태로 랜덤 데이터를 생성할 수 있다. 적절한 Type이 없다면 Regular expression 타입을 고르고 내가 원하는 문자열을 만들 수도 있다. 참고 : Mockaroo - regular-expressions 그러나 무료 버..

    [트러블 슈팅] The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

    상황 DB와 was를 연결하는 과정에서 에러가 발생했다. 서버가 DB에 패킷을 보냈으나, JDBC Driver가 DB로부터 어떠한 패킷도 받지 못했다는 에러메시지가 출력되었다. 원인 Mysql 설정 파일에서 bind-address를 제대로 설정해주지 않아 생긴 문제였다. 설정 파일은 /etc/mysql/mysql.conf.d 경로 내에 mysqld.cnf라는 이름으로 존재한다. 아래 명령어를 입력하면 리눅스 내 my.cnf 설정파일이 어디에 존재하는지 알 수 있다. mysqld --verbose --help | grep -A 1 'Default options' 해결 방법 설정파일에 들어가면 bind-address 값이 127.0.0.1로 되어 있다. 이것을 0.0.0.0 으로 변경한 뒤 mysql을 재시..

    Lv2 레벨로그

    Java Optional의 사용의 이점 Custom exception 활용의 이점 Spring DI(Dependency Injection, 의존관계 주입)이란 무엇인가요? DI의 방법들과 장단점에 대해 설명해주세요. 컴포넌트, 컴포넌트스캔이란 @Component와 @Controller, @Service, @Repository 차이 스프링 컨테이너 JDBC API vs 스프링 JdbcTemplate 스프링 JdbcTemplate의 장점 스프링 JdbcTemplate의 단점 ⇒ ORM이 필요한 이유 @Transactional을 이용한 트랜잭션 처리 커밋과 롤백 @Transactional과 @Transactional(readOnly = true) 차이 트랜잭션 전파 속성 ⇒ 기본 속성 외 다른 것들을 사용해본..

    Logging 전략 수립(with Logback)

    1. 상황 우아한테크코스 Lv3 3차 데모데이 필수 요구사항에 '디버깅할 수 있는 로그 파일 출력' 요구사항이 추가되었다. 따라서 로컬, 개발, 운영 서버에 맞는 각기 다른 로깅 전략이 필요했다. 2. Logging 전략 Logback vs Log4j2 Logback, Log4j2 중 어떤 로깅 프레임워크를 사용할 지 고민했다. Log4j1의 경우 2015년 8월 아파치 측에서 더이상 지원하지 않는다고 발표했기 때문에 고려하지 않았다.(https://blogs.apache.org/foundation/entry/apache_logging_services_project_announces) 팀 내에서 로깅을 경험한 사람이 없었기에, 우선은 Logback을 사용하기로 결정했다. Logback은 Spring bo..

    JPA Entity의 equals와 hashCode

    문제가 발생한 코드 상황 코치의 스케쥴을 업데이트하는 로직에서 Entity의 equals와 hashCode를 재정의하지 않아 List의 contains 메서드가 항상 false인 문제가 발생했다. 요약 equals와 hashCode를 재정의하지 않으면 어떤 문제가 발생하는지 알아본다. 또한, JPA의 Entity에서 equals와 hashCode를 재정의하지 않으면 어떻게 동작하는지 알아본다. 원인 위 문제는 equals를 재정의하지 않아 생긴 문제였다. List 내의 Schedule들은 모두 비영속 상태이므로 JPA와 상관없이 순수 자바 로직 문제이다. contains 메서드는 내부적으로 .equals() 동등 비교를 진행한다. 내부 요소 중 인자로 받은 값과 .equals() 비교를 진행했을 때 tr..

    Optional

    서론 면접 질문으로 Optional에 대한 꼬리질문을 받았다. 옵셔널에 대한 소개와 이점 null을 그냥 반환하면 안되나요? 옵셔널 처리 방법? 옵셔널을 사용하면서 주의해야할 점은? 인텔리제이 옵셔널을 파라미터로 넣으면 경고가 뜨는데 왜그럴까? 꼬리 질문에 대해 제대로 답변하지 못했기에 Optional을 다시 공부하는 마음가짐으로 이 글을 작성하게 되었다. NullPointerException 피하기 NullPointerException는 골치 아픈 문제이다. 1965년 처음으로 null을 도입한 토니 호어(Tony Hoare)도 null을 만들었을 때를 회상하며, 이는 10억 달러짜리 실수라고 했다. null 때문에 발생할 수 있는 문제는 아래 예제를 통해 살펴보자. public class Person..