분류 전체보기 59

쿼리 성능 측정시 체크 리스트 정리

쿼리 성능을 측정하고자 할때 기본적으로 아래의 리스트를 체크해보도록 한다. 인덱스 스캔 관련 체크리스트 1. 인덱스 사용이 가능한가? - where 연락처 is null 처럼 null 조건만 있는 경우, 인덱스 사용이 불가능하다. - 쿼리에서 참조하는 컬럼들은 인덱스 안에 저장되어 있어야 한다. 2. 인덱스 범위 스캔이 가능한가? - 부정형 비교의 경우 인덱스 사용이 불가능하다. where 직업 '학생' where 직업 is not null - 인덱스 컬럼을 가공한 경우 인덱스 사용이 불가능하다. - 묵시적 형 변환을 한 경우 > 숫자형과 문자형이 비교될 때 숫자형이 우선시 되기 때문에 컬럼 타입과 맞춰주어야 한다. http://wiki.gurubee.net/pages/viewpage.action?pag..

Study/Oracle 2022.03.19

조인의 개념과 실행 절차

조인의 수행은 기본적으로 두 테이블씩 이루어진다. 두개씩 조인 후 나온 실행 결과 set 을 가지고 또 다른 테이블과 조인을 한다. Cartesian Product Select e.name, d.dname from emp e cross join depth d; Cartesian product는 조인 조건 없이 하는 Cross Join으로써 위와 같이 tab1의 row 수 * tab2의 로우 수 만큼 데이터가 출력된다. 이런 조인 조건은 Group by 에서 사용하던 rollup, cube나 grouping sets로 구현하는 것을 구현할 수 있다. ROLL_UP select deptno, job, sum(sal) as total from emp where deptno in ( 10, 20) group b..

Study/Oracle 2022.03.19

조인 기법과 조인 수행 원리

위와 같이 테이블과 인덱스 설정이 있다고 가정해보자. 모든 이미지 출처는 https://www.youtube.com/watch?v=13Yga-pv-ls&t=190s 이다. 전광철님 감사합니다. Nested Loop Join 하나의 테이블을 기준으로 각 row를 추출하고, 그때마다 순차적으로 상대 테이블에서 연관된 row들을 JOIN에 의해 추출하는 방식. 3번과 4번 작업을 보면 모두 Dept 테이블에서 이루어지고 있다. 첫번째로 풀스캔을 뜨면서 인덱스에 해당하는 값들을 Index Dept_index로 추출하고, 3번과 4번의 결과를 2번의 Nested Loop 작업으로 Join 연산을 하고 있다. 그 이후에 EMP테이블과 Join을 하는 과정을 1번 작업에서 해주고 있는 것이다. 따라서 튜닝을 할 때는..

Study/Oracle 2022.03.18

Oracle의 B-Tree Index

오라클에서 사용하는 인덱스 중 가장 기본적인 인덱스인 B-Tree Index에 대해 알아보자. B-Tree Index : Balanced Tree Index B - tree 인덱스는 계층구조를 가지고 있으며 Leaf, Internal(Branch) , Root 노드로 나뉜다. 리프 노도들은 소팅된 가운데 자기들끼리 연결되어 있다. 브랜치 노드는 리프 노드들에 인덱스 값을 전달하기 위해 분류와 분기를 위한 기준값만 저장한다. 비트리 인덱스는 널값을 제외하고 모든 인덱스 컬럼의 데이터 + 로우아이디를 리프노드에 정렬해서 저장한다(디폴트는 오름차순). 이때 로우아이디에는 Objext, File, Block, Row에 대한 정보를 가지고 있기 때문에, 블락을 찾아갈 수 있게 되는 것이다. -> Single Bl..

Study/Oracle 2022.03.18

자바 기본서를 다시 읽다. 4 - 표준 API의 함수적 인터페이스

자바 8에서부터는 빈번하게 사용되는 함수적 인터페이스(Functional Interface)는 java.util.function 표준 API 패키지로 제공한다. 이 패키지에서 제공하는 함수적 인터페이스의 목적은 메소드 또는 생성자의 매개 타입으로 사용되어 람다식을 대입할 수 있게 함이다. 함수적 인터페이스는 크게 Consumer, Supplier, Function , Operator, Predicate로 나뉘는데 각각의 특징은 아래와 같다. Consumer : 매개값 O , 리턴값 X Supplier : 매개값 X, 리턴값 O Function : 매개값 -> 리턴값으로 타입 변환 Operator : 매개값 -> 리턴값으로 값 연산 Predicate : 매개값 -> true/false 리턴 Consumer..

Study/Java 2022.03.16

자바 기본서를 다시 읽다. 3 - 로컬클래스와 익명객체, 그리고 람다식 (2)

이제 람다식을 정리해보자. 앞서 로컬클래스와 이름 없이 사용하는 로컬클래스인 익명 객체에 대해 알아보았다. 그리고 이 람다식은 런타임시 익명객체를 생성해주는 함수 생성 식이다. 이를 사용하면 자바 코드가 매우 간결해주고 컬렉션의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있다. 람다식은 아래와 같이 인터페이스 변수 = 람다식의 형태로 작성된다. Runnable runnable = () -> {}; 이렇게 보면 자바의 메소드를 선언하는 것 처럼 보이지만, 자바는 메소드만을 단독으로 생성할 수 없고, 항상 클래스의 구성 멤버로 선언하기 때문에 자바는 이 메소드를 가지는 객체를 생성하고 인터페이스 변수에 대입된다. 위 코드는 Runnable 변수에 대입되므로 람다식은 Runnable 익명 구현..

Study/Java 2022.03.15

자바 기본서를 다시 읽다. 3 - 로컬클래스와 익명객체, 그리고 람다식 (1)

람다식을 공부하다보니, 로컬클래스와 익명개체 그리고 람다식의 관계가 보였다. 람다식을 더 정확하게 사용하기 위해 로컬클래스와 익명개체부터 정리해보려고 한다. I. 로컬클래스 첫번째로, 로컬클래스는 중첩 클래스 중 하나로 하나의 클래스, especially 메소드 내부에서 선언되어 메소드가 실행 될 때에만 사용되는 클래스이다. 로컬클래스와 반대로 멤버클래스는 하나의 클래스 안에서 멤버변수로 선언되어 객체가 사용중에 언제든 재사용이 가능한 객체이다. 로컬클래스는 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없어 public, private 등의 접근 제한자가 사용이 불가능하다. 또한 static 필드와 메소드도 선언할 수 없다. 로컬클래스의 가장 중요한 특징은 다음과 같다. 로컬 클래스 내부에서 바깥 ..

Study/Java 2022.03.15

예약 시스템 개발하기 06. EmbeddedId와 ConverterNotFoundException

현재 예약 시스템은 화면에서 신청에 필요한 AccountId, 멤버십Id, 수업Id를 받아와 예약 히스토리에 해당 값을 insert하는 방식으로 진행한다. 이를 저장하기 위한 객체는 CourseReservation 객체였는데, 처음에는 AccountId만 PK로 지정했다가 수업Id와 AccountId를 같이 중복키로 등록해야 할 필요성이 생겼다. 이를 위해서 CourseReservationId라는 객체를 만들어주고 @Embeddable이라는 애노테이션을 붙여준다. 이렇게 PK만 따로 도메인을 만들어주면, 기존의 CourseReservation객체에서는 이를 주입받아서 사용하기만 하면 된다. @Data @Embeddable @NoArgsConstructor @AllArgsConstructor public ..

예약 시스템 개발하기 05. HttpMediaTypeNotSupportedException

오늘 해야할 일은 테스트 코드를 완성하고 뷰에 데이터를 뿌리는일이다. 첫번째로 post 로 통신하고 파라미터를 @RequestBody로 받는 reserveOneCourse 메소드에 대한 테스트 코드를 작성해보았다. @Test public void reserveOneCourse() throws Exception { String content = objectMapper.writeValueAsString(new CourseReservationDto((1L),1,1)); mockMvc.perform(post("/reservation/1") .content(content)) .andExpect(status().isOk()) .andDo(print()); CourseMembership vo = courseMembe..

자바 기본서를 다시 읽다. 2 - 인터페이스

인터페이스의 중요성은 두말하면 입 아프다. 인터페이스를 사용함으로써 개발자는 객체의 내부 구조를 알 필요가 없고 메소드만 알고 있으면 되고, 개발코드의 수정 없이 사용 객체를 변경할 수 있다. I. 인터페이스 구성 상수필드 : public static final의 특성을 갖는다. 이를 생략해도 컴파일 과정에서 자동으로 붙게 된다. 추상 메소드 : public static abstract의 특성을 갖는다. 디폴트 메소드 : public default의 특성을 갖는다. 정적 메소드 : public static의 특성을 갖는다. 객체가 없어도 인터페이스 만으로 호출 가능 이렇듯 인터페이스들의 모든 메소드는 기본적으로 public 접근제한자를 가지고 있기 때문에 이를 구현한 객체들은 public보다 낮은 접근제..

Study/Java 2022.03.11