[KOSTA 교육 10일차] 인덱스, 뷰, 시퀀스 | 앞으로의 수업 방향성 | Hadoop vs Spark | REST | OAuth2.0 | JSTL, EL, ThymeLeaf, React | UTF-8 | 클래스, 객체, 인스턴스 | Java 기본 강의 - 변수(Variable)

junjun·2024년 4월 23일

KOSTA

목록 보기
9/48

인덱스 ( Index )

  • 테이블에 대한 검색 속도를 향상시키기 위해 칼럼에 생성하는 DB 객체

  • Full-Scan 시 O(N)의 시간복잡도가 걸리는 것을 Tree 자료구조를 활용해 O(logN)의 시간으로 찾을 수 있게 해줌.

  • 메모리를 차지하고, 삽입/수정/삭제 시 인덱스 테이블 또한 업데이트 되어야 한다.

  • 조회 연산이 빈번하고, 삽입/수정/삭제 연산이 많지 않은 테이블에서 생성하는 것이 유리하다.

인덱스의 종류

  • 고유/비고유 인덱스

  • 클러스터링 인덱스, 비 클러스터링 인덱스

  • 함수 기반 인덱스
    : 단순 컬럼이 아니라, SAL * 10 처럼 하나의 연산 결과값을 가지고 인덱스를 만들 수도 있다.

!! 단일 컬럼에 인덱스 vs 복합 컬럼에 인덱스 !!

  • 예를 들어, 전화번호에 대한 인덱스1, 이름에 대한 인덱스2 이렇게 두 개의 인덱스를
    각각 사용할 때와
  • (전화번호, 이름)에 대한 인덱스를 하나만 사용하는 경우
    어떤 차이가 날까?
  • 저장 공간의 차이
    - 복합 인덱스 사용 시, WHERE 절의 조건 매칭 순서가 중요하다.
    • 인덱스 생성 시, 선언된 순서에 맞게 인덱스 트리(B+ Tree)가 생성된다.
  • WHERE절에서 원본 컬럼을 변형할 때, 인덱스 트리를 타지 않는다.

인덱스의 효율적인 사용 방법

  • WHERE 절 / 조인 조건절에서 자주 사용되는 컬럼

  • 전체 데이터 중 10~15% 이내의 데이터를 검색하는 경우 ( = 성별에 대한 인덱스를 만든다면, 전체 데이터 중 50%를 찾게 되어있다. )

  • 테이블에 저장된 데이터의 변경이 드문 경우 ( 수정, 삭제 시 인덱스 트리에 대한 변경 연산까지 포함되니까 )

인덱스를 설정하면 좋을 칼럼의 특징

1) 카디널리티가 높은 컬럼

  • 컬럼의 유니크한 값들이 많은 경우 카디널리티가 높다고 한다.
  • 20대 회원 테이블에서 나이 컬럼은 카디널리티가 낮다.
  • 20대 회원 테이블에서 주소 컬럼은 카디널리티가 높다.

2) 선택도가 낮은 컬럼

  • 컬럼의 특정 값을 주었을 때, 그 기준으로 선택된 튜플이 별로 없다.
  • 성별은 선택도가 높다. ( Male / Female )
  • 학번은 선택도가 낮다. ( 각 학생별로 UNIQUE함 )

3) 활용도가 높은 컬럼

  • WHERE 절에서 자주 사용되는 컬럼인지의 여부가 활용도이다.
  • 당연히 활용도가 높은 컬럼에 대해 우선적으로 인덱스를 부여하는 것이 좋다.

4) 중복도가 낮은 경우

  • 여기서 중복도는 카디널리티 개념이 아닌, 인덱스 자체의 중복도이다/.
  • 같은 컬럼에 대해 중복으로 설정된 인덱스가 있다면 생성하면 안된다는 이야기이다.
  • 인덱스 또한 메모리를 먹으니, 당연히 중복 인덱스를 만들면 성능상으로 좋지 않을 것이다.

뷰( View )

뷰의 개념

  • 하나 이상의 기본 테이블이나 다른 뷰를 이용하여 생성되는 가상 테이블

  • 뷰에 대한 수정이 이루어지면, 해당하는 원본 테이블도 수정된다.

  • 중요 데이터를 보호하기 위한 보안의 기능도 수행한다.

  • 사용자가 관심있는 데이터만을 미리 가공해놓아, 사용자에게 편의성을 제공한다.

  • 뷰는 테이블과 거의 비슷한 기능을 지원하지만, 일부 DML은 지원되지 않을 수도 있다.

뷰의 종류

  1. 단순 뷰
  • 하나의 테이블에 대해 생성한 뷰

  • 한 테이블에서 일부 컬럼만 뽑아와서 생성한 경우

  1. 복합 뷰
  • 조인을 통해 생성한 뷰

  • 여러 테이블에서 조인 조건을 통해 생성한 뷰

  1. 인라인 뷰
  • FROM 절에서 참조하는 테이블의 크기가 클 경우, 필요한 행과 컬럼만으로 구성된 집합을 재정의하여 질의문을 효율적으로 구성할 수 있다.

  • 이를 통해 연산 비용을 줄일 수 있다. ( cf. Driving Table, Driven Table )

  • 보통 WITH 절로 분리해서 사용한다.

  • 임시적으로 잠깐 쓰는 뷰이다. ( FROM절의 서브쿼리라고도 한다 )

뷰의 삭제

  • DROP VIEW 뷰이름;

  • 뷰를 정의한 기본 테이블의 구조나 데이터에는 어떤 영향도 없다.

시퀀스 ( Sequence )

  • 유일(UNIQUE)한 값을 생성해주는 오라클 객체

  • 시퀀스를 생성하면 기본키와 같이 순차적으로 증가하는 컬럼을 자동적으로 생성할 수 있다.

  • 테이블과 독립적으로 생성되고 저장되는 객체이다.
    - 테이블들이 다같이 동일한 시퀀스를 공유할 수도 있지만, 일반적으로 테이블 당 하나씩 시퀀스 번호를 두고 쓴다.

    • 시퀀스 번호가 고갈되는 경우, BOARD2 와 같이 새로운 테이블을 생성해서 새로운 시퀀스로 다시 시작해야할 수도 있기 때문이다.
  • 게시판의 게시글과 같이 딱히 잡을만한 PK가 없을 때 시퀀스를 사용하여 PK를 잡을 수 있다.

  • Spring JPA에서 @Id @GeneratedValue 어노테이션을 통해 Sequence를 엔티티의 PK로 잡아줄 수 있다.


깨알 상식) 빅데이터 : Hadoop vs Spark

1. Hadoop

  • 슈퍼 컴퓨터 없이 서버 여러 대를 연결해 빅데이터 분석을 가능하게 함.

  • 대용량의 데이터를 적은 비용으로 더 빠르게 분석할 수 있도록 하는 플랫폼.

  • 빅데이터 처리와 분석을 위한 플랫폼 중 사실상 표준(De Facto)

  • 수천 대의 분산된 x86 장비에 대용량 파일을 저장할 수 있는 기능을 제공하는 분산 파일 시스템 (HDFS)과, 저장된 분산 파일을 분산된 서버의 CPU와 메모리 자원을 이용하여 빠르게 분석하는 맵-리듀스(MapReduce) 플랫폼으로 구성됨.

  • 맵리듀스에서 map 함수가 모두 종료되어야 reduce 함수가 실행되어 성능 손실이 큼.
    이후에 되어 위 기능에 대한 보완이 이루어졌지만, 성능상에 손실이 있음.

  • 실시간 서비스 제공이 불가능하여 하둡은 배치성 통계작업에만 주로 투입됨.

2. Spark

  • 대규모 데이터 처리를 빠른 속도로 실행시켜주는 엔진

  • 인메모리 데이터 엔진을 통해 초기 맵리듀스의 성능상 한계를 크게 극복함.

  • 스파크가 하둡에 비해 10배 정도 속도가 더 빠름.

  • 하둡 기반으로 구동하는 것을 목적으로 만들어졌다.

  • Java, Python, R 등 다양한 언어를 사용하여 스파크와 연동이 가능하다.


앞으로 배울 Java 목차 간단 소개

  1. 변수
  • 데이터를 담는 그릇
  1. 연산자
  • 변수에 대한 연산
  1. 조건문
  • 조건별로 분기를 거쳐 변수에 대해 연산
  1. 반복문
  • 반복되는 연산에 대한 간단히 처리
  1. 배열
  • num1, num2... 와 같이 같은 타입의 변수를 여러개 두기는 비효율적,
    하나의 변수로 여러 개의 같은 타입 변수를 가리키기 위해 배열을 도입
  1. OOP
  • 객체지향의 개념, 클래스/객체/인스턴스, 상속/다형성/추상화/캡슐화를 왜 사용하는가?
  1. 예외처리
  • 프로그램을 어떤 상황이 와도 끝까지 동작하도록 하는 것이 목표인 예외처리

  1. I/O ( 입출력 )
  • File 입출력...
  • Socket
  • Serialization ( From Memory To Stream )
  1. Networking
  • 네트워크 I/O
  1. Applet, AWT

1~7까지가 크게 한 묶음 ( 기본 언어 문법 + OOP )

8~10 까지가 크게 한 묶음

Java 수업은 이 두가지로 이루어진다.

그리고.. 배열과 함께 배우는 Collection Framework은 매우 중요하다.

왜냐하면, 이 프레임워크를 통해 REST 방식으로 받아온 데이터를 처리할 것이기 때문이다!

REST

  • 매우 국소적으로 이야기하면, '화면이 안 바뀌면서 데이터를 가져오는 것' (비동기 처리)

  • HTTP를 이용한 분산형 웹 서비스

  • 분산된 서비스를 우리가 가져와서 사용한다.

  • 카카오 로그인 API, 네이버 지도 API, 공공 데이터를 가져오는 것 등등
    지구 상의 모든 서비스는 전부 다 REST방식으로 주고받을 수 있다.

  • 그리고 이렇게 분산된 서비스, 데이터를 요청할 때 '토큰'이라는 개념이 등장하는데,
    이것이 바로 OAuth이다. 최근 OAuth의 버전은 OAuth2.0이다.

"REST" 방식으로 개발해봤어요?

  • == 분산된 '남의' 서비스에서 서비스나 데이터 가져와서 ( 이용해서 ) 지원자님의 프로젝트의 어플리케이션에 적용해봤어요? 와 동일한 말이다.

Java Part2. I/O, Networking

  • HTML, Servlet, jQuery를 배움. ( UI, 웹개발 기초 )

  • Model-View-Controller Pattern을 적용하여 개발함. ( 이 때, HTML, JavaScript )

  • 최종적으로 Spring Framework + React를 배운다. ( 우리 클래스 최종 목표 )

아스키코드와 유니코드 / UTF-8, UTF-16

  • 인코딩 방식

  • 인코딩 : 컴퓨터가 이해할 수 있는 0,1 형식으로 바꾼다.

  • 좀 더 보충 필요

객체란 무엇인가?

  • 객체지향 프로그래밍은, 존재하는 모든 것을 프로그램으로 표현하려고 노력한다.

  • 객체는 실세계에 존재하는 것을 프로그램으로 표현한 것이다.

  • 존재하는 모든 것은 '속성'과 '기능'으로 나누어 볼 수 있다.

  • 즉 객체는 정적인 상태의 값과 동적인 행위를 가진다.

  • 이 객체를 담는 그릇이 클래스이다.

  • 메서드는 객체의 기능

  • 해당 객체를 메모리에 올리는 것이 인스턴스

원시타입과 레퍼런스 타입

  • 변수 : 하나의 값을 저장할 수 있는 기억공간

  • 컴퓨터의 주소는 0xFFFFFFFF ( 16진수 * 8자리 => 32 자리수 ), 4byte의 범위를 갖는다.

  • 이 때, 주소값을 간단하게 나타내면, 0x47F3D64C1E .. 와 같을 것이다.

  • 또한, 이 주소값은 자바 프로그램을 돌릴 때마다 항상 메인 메모리의 다른 지점에 올라갈 것이다.

  • 이에 변수의 개념이 필요하다.
    변수는 해당 메모리 주소에 개발자가 알아볼 수 있는 이름(태그)를 붙여놓는 것과 같다.

  • 그렇게 태깅된 메모리 공간을 변수라 할 수 있다. ( 하나의 값을 저장할 수 있는 기억공간이다. )

원시타입의 종류와 크기

  • boolean 논리형 1byte

  • char 문자형 2byte ( 유니코드 기반 문자열 저장 )

  • byte, short, int, long : 정수형 / 1,2,4,8 바이트

  • float, double : 실수형 / 4, 8 바이트

해당 바이트의 크기와 표현범위를 숙지해놔야 추후 '형변환(Type Casting)' 시 이해하기 편할 것이다.

0개의 댓글