본문 바로가기

전체 글

(129)
WHERE 절 서브쿼리를 포함하는 쿼리 최적화 최근 Real MySQL 8.0 책 스터디를 하다보니 쿼리 최적화하는데 관심이 생겼다. 그러다보니 그 전까지는 신경쓰지 않았던 쿼리들 실행계획을 살펴보며 쿼리를 최적화하고있다. 주로 실행계획에서 인덱스를 사용하지 않고 fullscan 하는 쿼리들을 튜닝하고 인덱스를 생성하는 작업을 하고 있는데,  where 절 컬럼 인덱스를 생성해도 fullscan을 하는 쿼리를 발견했다.  서브쿼리를 에서 SELECT 한 PRIMARY 키를 메인 쿼리 IN 절로 조회하는 쿼리 였다.당연히 PK 로 IN 절에서 조회하므로 인덱스를 사용해 rows 수가 서브쿼리에서 조회된 수만 나올줄 알았는데 메인쿼리의 모든 row 수가 나왔다. 이 과정을 이해하려면 옵티마이저에서 작동하는 서브쿼리 처리에 대해서 이해해야한다. -- 서브..
CloudWatch에 앱 로그스트림 생성 Logback 이란? logback은 스프링 오픈소스 logging 프레임워크로 slf4j 의 구현체입니다. spring-boot-starter-web 에 있는 spring-boot-starter-logging에 기본으로 포함되어 있어서 별도의 라이브러리 추가가 불필요 합니다. 스프 링 부트에서는 application.xml에 properties값만 세팅해도 설정이 가능하지만 보통 상세 설정을 위해 logback-spring.xml 을 사용합니다. 로그 레벨은 총 5가지로 TRACE < DEBUG < INFO < WARN < ERROR 순으로 출력 레벨을 지정할 수 있습니다. 로깅의 주요 설정 요소는 공식 메뉴얼을 참고합니다. https://logback.qos.ch/manual/index.html lo..
읽기 전용 Query, Transaction 성능 최적화 영속성 컨텍스트는 엔티티 변경 감지를 위해 스냅샷 인스턴스를 메모리에 관리하므로 많은 메모리를 사용하게 됩니다. 한 트랜젝션 내에 엔티티 생성이나 수정이 없다면 읽기 전용으로 메모리를 최적화해 성능을 향상시킬 수 있습니다. 1. 스칼라 타입으로 조회 엔티티가 아닌 필드만 조회하면 영속성 컨텍스트는 조회 값을 관리하지 않습니다. 따라서 필드값 조회해서 DTO로 받는 방법을 사용할 수 있습니다. select o.id, o.name, o.price from orderItem o 2. 읽기 전용 쿼리 힌트 사용 하이버네이트 전용 힌트 org.hibernate.readOnly 를 사용하면 읽기 전용으로 조회할 수 있다. TypedQuery query = em.createQuery("select o from Ord..
상속 관계 Entity에서 자식 Entity 조회하기 with HibernateProxy @Entity @Inheritance(strategy=InheritanceType.JOINED) @Table(name="setting") @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class Setting { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="id") private Long id; ... } @Entity @Table(name = "item_setting") @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class ItemSetting extends Setting { @..
SpringBoot3.x 버전에서 QueryDsl 사용 설정 시 이슈 정리 1. 쿼리 결과 집합 transform, ResultTransformer and GroupBy 사용하기 QueryDsl 사용시 쿼리 결과를 다양한 타입으로 결과 집합, 그룹화하여 받을 수 있는 transform + GroupBy를 유용하게 사용했었습니다. SpringBoot 3.x 버전 이상의 환경에서는 2.x 버전과 다른 설정을 해주어야 사용이 가능합니다. JPAQueryFactory에 JPQLTemplates.DEFAULT 설정을 적용해 주어야만 사용이 가능합니다. @Configuration public class QuerydslConfig { @PersistenceContext private EntityManager entityManager; @Bean public JPAQueryFactory jp..
Scheduling 시 Exception 발생 처리 문제 1분마다 DB 조회해서 스케줄링으로 처리하는 로직이 있는데, 프로세스 중 Runtime Exception 이 발생하였습니다. 그런데 그 처리 로직 메소드에는 @Transactional 이 걸려있어서 예외 발생시에는 rollback 이 되고 있었는데요. 때문에 1분마다 도는 스케줄링에 계속해서 같은 예외에 걸려서 다른 프로세스로 넘어가지를 못하고 계속해서 에러를 내뿜고 있었습니다. org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only 스케줄러의 로직은 다음과 같습니다. @Component @RequiredArgsCo..
서버 Nginx 설정 location 블럭 proxy 설정하기 복합적인 구조를 가지는 애플리케이션의 서버를 구성할때, nginx의 설정파일인 /etc/nginx/nginx.conf 파일 내부에서 location 블록의 url 패턴 구성을 통해 로드밸런싱을 할 수 있습니다. location 문법의 위치조정 부호와 패턴 우선순위 nginx는 클라이언트가 접근한 path에서 가장 적합한 location 블럭 매칭을 찾아 처리합니다. 여러개가 일치해도 처리하는 우선순위가 있습니다. 1순위. = exactly 완전한 일치 URI가 정확히 일치해야 되고, get방식 문자열 전달 가능. ex) domain.com/admin?param 정규식을 사용할 수 없음. location = /admin { proxy_pass http://127.0.0.1:8080; } 2순위. ^~ pr..
컴퓨터에서 2개 이상의 username을 쓰는 경우 permission 오류 Intellij 에서 두개의 계정을 등록해서 쓰고 있었는데. 아무리 터미널에서 git username을 글로벌로 설정하고, git config --list 로 확인해 보아도 원하는 계정으로 잘 설정이 되어있었다. 하지만 메인 브랜치에 push 하려고 하는 데 permission 오류가 나서 되지 않았다. 찾아보니 remote add origin "{git https web url}" 로 설정하는 것으로는 부족하다. 해당 주소에 대한 권한이 없기 때문에 403 에러가 발생하는 것. set-url 명령어로 직접 username을 명시하고 인증하자. git remote set-url origin https://{깃허브-username}@{깃허브 web url} 로 설정해주니까 push 가능하게 됨. https..