반응형

@Resource 어노테이션

자바 표준,이름으로 찾을때

JSR-250 표준 어노테이션에 속한다.

의존성을 찾는 순서

  1. 이름
  2. 타입
  3. 지정자

@Inject 어노테이션

자바 표준,타입으로 찾을 때

JSR-330 표준 어노테이션에 속한다.

의존성을 찾는 순서

  1. 타입
  2. 지정자
  3. 이름

@Autowired 어노테이션

스프링 표준,타입으로 찾을때

@Autowired 어노테이션은 @Inject 어노테이션과 유사하다.

의존성을 찾는 순서

  1. 타입
  2. 지정자
  3. 이름

참고문헌

https://hilucky.tistory.com/254 [Spring] @Resource, @Inject, @Autowired]
https://www.baeldung.com/spring-annotations-resource-inject-autowire [영문 가이드]

반응형

'Spring > spring framework 기본 및 이론' 카테고리의 다른 글

[Spring] AOP 포인트컷 표현식  (2) 2020.05.15
[Spring] 스케쥴 설정  (0) 2020.05.15
@Autowired @Resource @Inject 차이  (0) 2020.05.10
component 과 bean 의 차이점  (0) 2020.05.10
localeResolver 란  (0) 2020.05.10
반응형

응답값 정리

200 번대 응답(Response) : 성공(Success)

200

OK

* 요청 정상 처리.

204

No Content

* 요청 정상 처리하였지만, 돌려줄 리소스 없음.

* 응답에 어떠한 엔티티 바디(Entity Body)도 포함하지 않음.

* 서버에서 처리 후, 클라이언트에 정보를 보낼 필요가 없는 경우 사용. 

206

Partial Content

* Range가 지정된 요청인 경우, 지정된 범위만큼의 요청을 받았다는 것을 알려줌. 

300 번대 응답(Response) : 리디렉션(Redirection)

301

Moved Permanently

* 요청된 리소스에는 새로운 URI가 지정되어 있기 때문에, 이후로는 새 URI를 사용해야 한다는 것을 나타냄. (영구적인 URI 변경)

302

Found

* 요청된 리소스에는 새로운 URI가 지정되어 있기 때문에, 이후로는 새 URI를 사용해야 한 다는 것을 나타냄. 301과 유사하지만, 302는 일시적인 URI 이동) 

303

See Other

* 이 응답은 요청에 대한 리소스는 다른 URI에 있기 때문에 GET 메서드를 사용해서 얻어야 한다는 것을 나타냄. 302 코드와 같지만, 303은 리디렉션 위치를 GET 메서드를 통해 얻어야 한다고 명확하게 되어 있음. 

304

Not Modified

* 요청한 리소스가 마지막 요청 이후 변경된 적이 없기 때문에 기존 클라이언트의 로컬 캐시 리소스를 사용하도록 알려줌.

300번대로 분류되어 있지만, 리디렉션과는 관계없는 처리를 함.

307

Temporary Redirect

* 임시로 페이지를 리다이렉트 함.

304응답

브라우저가 서버에 GET 요청을 보낼 때,
요청하는 정보를 이미 디스크에 가지고 있을 경우(캐시되어 있는 경우)
브라우저는 이 데이터가 변경되었는지 여부를 확인하는 요청을 보내게 된다.
이와 같은 요청을 Conditional Get Request 라고 하며,
서버는 요청 데이터가 변경되지 않았을 경우 응답 코드로 304 (Not Modified) 를 리턴한다.
물론, 데이터가 변경되었다면 변경된 데이터를 응답으로 보내게 된다.

400 번대 응답(Response) : 클라이언트 에러 (Client Error)

400

Bad Request

* 클라이언트의 요청 구문이 잘못됨.

* 브라우저는 이 응답을 200 OK 응답과 동일한 형태로 취급함.

401

Unauthorized

* 요청 처리를 위해 HTTP 인증(BASIC 인증, DIGEST 인증) 정보가 필요함을 알려줌.

접근 허용을 차단함. 최초 요청에는 인증 다이얼로그 표시하고, 두번째는 인증 실패 응답을 보냄. 

403

Forbidden

* 접근 금지 응답. Directory Listing 요청(서버 파일 디렉토리 목록 표시) 및 관리자 페이지 접근 등을 차단하는 경우의 응답. (파일 시스템 퍼미션 거부, 허가 되지 않은 IP 주소를 통한 액세스의 거부 등)

* 서버는 엔티티 바디에 접근 거부에 대한 이유를 명시하여 보낼 수 있음.

404

Not Found

* 클라이언트가 요청한 리소스가 서버에 없음

405

Mothod Not Allowed

* 허용되지 않는 HTTP 메서드를 사용함. 

500 번대 응답(Response) : 서버 에러 (Server Error)

500

Internal Server Error

* 서버에서 클라이언트 요청을 처리 중에 에러가 발생함.

503

Service Unavailable

* 서버가 일시적으로 요청을 처리할 수 없음.

* 서버가 과부하 상태이거나 점검중이므로 요청을 처리할 수 없음을 알려줌.

504

Gateway Timeout

* 서버를 통하는 게이트웨이에 문제가 발생하여 시간이 초과됨.

505

HTTP Version Not Supported

* 해당 HTTP 버전에서는 지원되지 않는 요청임을 알려줌.

참고문헌

https://ooz.co.kr/260 status정리

반응형
반응형

1. 설치 및 실행

http://jmeter.apache.org/download_jmeter.cgi
여기서 binaries zip 파일 다운 받고 압춘 푼 뒤 bin 폴더에서 jmeter.bat 파일 실행

2. 설명


Name : 테스트 이름이다. 당연하지만 안 중요하다.

Comments : 첨부할 설명이다. 당연하지만 안 중요하다.

Action to be taken after a Sampler error : 샘플러가 에러시에 취할 행동이다. 사실 보통 Continue를 두면 에러와 무관하게 루프를 돌게된다.

만약 다른 행동을 취하고 싶다면 해도된다.

Number of Threads : 쓰레드를 동시에 몇개 생성할지이다. 즉 동시에 몇개의 트랜잭션을 실행시킬지이다.

이는 사람이 동시에 접속하는 효과를 낸다. 10명이서 동시에 접속하는 상황을 만들고 싶다면 10을 사용하면된다.

Ramp-Up Period : 주기를 의미한다. 아래의 Loop Count가 1 이상일때 의미가 있는데 예를 들어 루프가 10이고 Ramp-Up이 10이면 10초에 한번씩 작동하게 되므로 총 100초동안 테스트가 진행되게 된다.

Loop Count : 스레드의 반복 횟수를 의미한다. 10이면 10번 반복한다. Forever에 체크하면 무한 반복한다.

Delay Thread creation until needed : 스레드의 생성을 필요할 때까지 기다린다. 체크를 해제하면 안기다리고 날리는데 반응성은 더 좋아지긴 하는데 안정성을 위해서 체크해 두자.

Scheduler : 위의 모든 작업을 스케줄화 해서 할 수 있다.

Duration : Scheduler를 체크했을때만 사용가능. Thread Properties의 총작업을 하는 시간을 의미한다. 예를들어 100초를 정하면 위의 작업을 딱 100초동안 실행한다. 100초안에 걸리는 작업이면 조기에 정지되지만 위의 작업이 100초를 넘어간다면 더이상 실행하지 않고 멈춘다.

Startup delay : 위의 작업을 실행하기 위한 유예기간을 의미한다. 쓰레드 그룹이 한개일때는 별 필요없지만 쓰레드 그룹을 여러개 돌릴떄는 서로 차등을 줄 수 있다.


그래프 사용법


jp@gc - Response Times vs Threads
사용자 변화에 따른 응답 속도

jp@gc - Transaction Throughput vs Threads
사용자 변화에 따른 초당 처리 건수

jp@gc - Composite Graph
여러 결과 그래프를 함께 보여준다. 문서에서는 다음 결과 그래프들을 함께 보여주도록 설정하였다.
jp@gc - Active Threads Over Time
jp@gc - Response Times Over Time
jp@gc - Transactions per Second


사용시 주의사항

종종 outOfMemory 가 나오는데 이건 heap 사이즈를 늘려줘야 함.
jmeter 힙사이즈는 jmeter.bat 파일 내에
아래 처럼 작성

set HEAP=-Xms1024m -Xmx1024m  또는 set HEAP=-Xms2048m -Xmx2048m

참고문헌

https://soul0.tistory.com/279
https://dlevelb.tistory.com/708

반응형

'Tool 사용 > 개발툴' 카테고리의 다른 글

[vscode] mac vscode 단축키(keymap)  (0) 2020.08.11
[vscode] 터미널에서 vscode 실행하기  (0) 2020.07.04
[vscode] 맥 vscode 단축키  (1) 2020.07.03
[Intellij] 맥 인텔리제이 단축키  (0) 2020.06.28
Bitbucket 사용하기  (0) 2020.06.04
반응형

FTP 보안 프로토콜(SFTP, Secure FTP, FTPS)

1. SFTP(SSH File Transfer Protocol)

정확히 말하면 SFTP 프로토콜은 FTP를 사용하지 않는다. SFTP는 SSH 기반의 새로운 파일 전송 프로토콜이다. SSH 서버가 구축되어 있어야 한다. Telnet을 대체하는 원격관리 프로토콜인 SSH를 이용하기 때문에 구축 및 유지 비용이 적고 다른 보안 FTP 메커니즘에 비해 일반 사용자들이 사용하기에 편리하여 많이 사용된다.

일반 사용자들은 FileZilla, SSH Secure Shell v3.29 또는 pscp, WinSCP 프로그램을 이용한다. 상용S/W로는 VanDyke Software 社에서 나온 SecureFX가 있다.

특히 FileZilla는 Open S/W이고 아래에서 소개한 FTPS(FTP over SSL)까지 지원하기 때문에 추천한다.

2. FTP over SSH(Secure FTP)

SSH 연결 위에 일반 FTP로 터널링 연결을 함으로써 접속 시에 계정 정보가 암호화 되어 악의적인 공격자에게 노출되지 않지만 데이터는 암호화 되지 않는다.

이 방법은 ssh를 이용하여 터널링을 구성한 다음, 일반 ftp로 접속하는 방법이기 때문에 일반 사용자들이 사용하기에는 쉽지 않다.

  • SSH(Secure Shell)

원격 컴퓨터에 안전하게 액세스하기 위한 유닉스 기반의 명령 인터페이스 및 프로토콜
강력한 암호화 기능을 구현해 모든 데이터가 암호화 되기에 높은 보안을 지원

3. FTPS(FTP over SSL)

FTP가 TLS/SSL 보안 연결에서 동작한다. TLS(Transport Layer Security)/SSL(Secure Sockets Layer)

FTP Secure 또는 FTP-SSL로 알려진 FTPS는 TLS(Transport Layer Security)와 Secure Sockets Layer (SSL) 암호화 프로토콜이 더해진 FTP의 확장판이다. SSL 레이어 위에서 FTP를 수행하는 것으로서 command 와 data 모두 암호화 된다.

4. FTP

FTP는 21포트(TCP 21)를 사용하고, SFTP는 22포트를 사용하죠. 21 포트를 이용한 FTP접속은 로그인 정보를 평문으로 전송하기 때문에 보안에 취약하다. SFTP는 이름 그대로 이러한 점을 보완한 Secure FTP로, 보다 안전한 호스팅 서비스를 이용하기 위해서는 SFTP를 사용한다.

반응형
반응형

1. HTTP의 특징과 쿠키와 세션을 사용하는 이유

HTTP 프로토콜이 connectionless, stateless한 특성이 있기 때문입니다.
connectionless
클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징
stateless
통신이 끝나면 상태를 유지하지 않는 특징

1. 개요

  • 공통점 : 사용자의 정보(데이터)를 저장할 때 이용된다.

  • 차이점 :

  • 쿠키 :
    1) 사용자의 로컬에 저장되었다가 브라우저가 요청시 왔다갔다하게 됨(보안에 취약)
    2) 세션과 달리 여러 서버로 전송이 가능함
    3) 세션이 브라우저 단위로 생성되어 브라우저 종료시 사라지는데 반해, 쿠키는 유효시간 설정을 할 수 있음. ex) 7일
    4) 클라이언트가 재요청시 웹페이지 요청과 함께 쿠키값도 전송 - 자동으로 서버에 전송

    • 쿠키의 제한
      클라이언트에 300개까지 쿠키저장 가능, 하나의 도메인당 20개의 값만 가질 수 있음. 하나의 쿠키값은 4KB까지 저장
      5) Response Header 에 Set-Cookie 속성을 사용하여 클라이언트에 쿠키 생성
      6) 만료시간이 있지만 파일로 저장되어서 브라우저를 종료해도 계속해서 정보가 남아 있을 수 있다.
      7) 서버에 요청시 속도가 빠름
  • 세션 :
    1) 서버에 데이터를 저장하여 쿠키에 비해 보안에 안전함
    2) 브라우저 단위로 생성됨 => 익스플로러를 켜고 크롬을 켜고 하면 각각 2개의 세션이 생성되는 것
    3) 브라우저를 종료할때까지 유지되는 상태 - 일정시간동안 같은 브라우저로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지하는 기술
    4) 클라이언트가 Request 를 보내면, 해당 서버의 엔진이 클라이언트에게 유일한 ID를 부여하는데 이것이 세션ID.
    5) 서버의 자원을 사용하기 때문에 무분별하게 만들면 서버의 메모리가 감당할 수 없어질 수 있어 속도가 느려질 수 있다. - 비교적 느림

    세션 프로세스
    1) 클라이언트가 서버에 접속시 세션 ID를 발급
    2) 서버에서는 클라이언트로 발급해준 세션ID를 쿠키를 사용해 저장(JSESSIONID)
    3) 클라이언트가 다시 접속할때, JSESSIONID 를 이용해서 세션ID값을 서버에 전달

    즉, 세션을 구별하기 위해 ID가 필요하고 그 ID만 쿠키를 이용해서 저장. 쿠키는 자동으로 서버에 전송되므로 서버에서 세션아이디에 따른 처리를 한다.

2. 세션과 쿠키를 이용한 자동 로그인 구현

로그인에 성공했을 때 사용자 DB 테이블에 sessionId와 유효시간 속성에 값을 지정하는 겁니다. 그리고 쿠키에는 세션Id를 넣는다.
"인터셉터"에서 해당 쿠키값이 존재하면 사용자 DB 테이블 내에서 유효시간이 아직
남아 있으면서 해당 세션 Id를 가지고 있는 사용자 정보를 검색해 해당 사용자 객체를 반환하는 겁니다.

요즘 추세

세션은 사용자의 수 만큼 서버 메모리를 차지하기 때문에 요즘은 이런 문제들을 보완한 토큰 기반의 인증방식을 사용하는 추세입니다.

그 중 JWT( JSON Web Token )라는 것 사용

참고문헌

https://interconnection.tistory.com/74 [쿠키 세션]

반응형
반응형

1. 티스토리(tistory)

http://tistory.com

 

TISTORY

나를 표현하는 블로그를 만들어보세요.

www.tistory.com

SEO 90

범용적으로 너무 좋음(여러가지 주제)
한 계정당 5개까지 블로그 운영 가능
여러가지 스타일로 커스텀 하기 간편
카카오톡과 연관되어 앞으로가 더 기대되는 블로그 플랫폼 중 하나 - 업데이트 공지로 카톡계정으로 사용토록 변경

2. 네이버 블로그(naver)

https://section.blog.naver.com/

 

네이버 블로그

당신의 모든 기록을 담는 공간

section.blog.naver.com

SEO 56점

뭐가 장점인지 모르겠다. 네이버에서 검색이 쉬운거 빼고.
진짜 네이버는 커스텀도 어렵고, 특히 헤더 태그에 접근이 불가해 구글에 검색 등록 및 외부 타 사이트 라이브러리를 추가할 수 가 없다.

3. brunch

brunch.co.kr

 

글이 작품이 되는 공간, 브런치

You can make anything by writing. - C.S.Lewis-

brunch.co.kr

SEO 90점

카카오 로그인 가능
심플한 UI 및 기능이 장점이자 단점. 개발 블로그에는 부적합(코드블럭을 넣을 수 없다)

4. velog

http://velog.io

SEO 90점

github, facebook, google 로그인 가능

특징 : 개발자 특화된 블로그 시스템. velopert 라는 개발자가 만든 블로그 플랫폼.

전체보기로 최근 올린 개발 블로그 및 트렌드 블로그를 IT 개발 관련된 내용만 볼 수 있는게 개발자에게는 큰 장점
구독기능이 없음

5.  github.io

SEO 100

로컬에서 커밋 하고 푸쉬하면서 블로그를 작성할 수 있는 장점
윈도우의 경우 로컬에서 블로그 로컬실행하기 조금 어렵고, 간편하게 블로그를 만드는 용도는 아님.
간지가 조금 날 수 있음.

6. 구글 블로거

SEO 90

다른 블로그와 소통하기 어려움
UI 가 깔끔하고 이쁨
플랫폼이 구글인게 제일 장점

 

참고문헌

http://korean-daeddo.blogspot.com/2015/12/goggle-blogger.html

 

구글 블로거 장단점 및 비전 (with 네이버 및 티스토리)

구글 블로거를 왜 사용하여야 하는가에 대한 글입니다.

korean-daeddo.blogspot.com

7. buymeacoffee 블로그

https://www.buymeacoffee.com

 

Buy Me A Coffee | Where creators make money doing what they love

Buy Me A Coffee is the best way for creators and artists to accept one-off support and membership from their fans.

www.buymeacoffee.com

SEO 92

Paypal 등으로 커피 값 후원이 가능한 블로그입니다.
플러그인으로 다른 블로그 및 타 사이트에 버튼을 둬서 유입시킬 수도 있습니다.
국내유저가 없음. 우리나라 사람들은 아무도 후원을 해줄리가 없다.

8. medium 블로그

https://medium.com/

 

Medium – Get smarter about what matters to you.

Medium is not like any other platform on the internet. Our sole purpose is to help you find compelling ideas, knowledge, and perspectives. We don’t serve ads—we serve you, the curious reader who loves to learn new things. Medium is home to thousands of

medium.com

SEO 100

종종 레퍼런스 찾다보면 미디움으로 하는 개발블로그가 은근히 많다. 하지만 대부분 외국 유저.
gist 를 지원. script 로 embed 가 아닌 .git 으로 코드 삽입 가능.
단순한 UI 및 기능. 심플

계속 업로드 예정입니다.

 

반응형
반응형

table

어떤 테이블에 대한 접근을 표시하고 있는지는 table 필드에 표시되어있다.

id

id는 SELECT에 붙은 번호를 말한다. MySQL은 조인을 하나의 단위로 실행하기 때문에 id는 그 쿼리에 실행 단위를 식별하는 것이다. 따라서 조인만 수행하는 쿼리에서는 id는 항상 1이 된다.

select_type

select_type은 항상 SIMPLE 이된다. 복잡한 조인을 해도 SIMPLE이 된다. 서브쿼리나 UNION이 있으면 id와 select_type이 변한다.

SIMPLE: 단순 select ( union이나 서브쿼리를 사용하지 않음 )

PRIMARY: 가장 외곽에 있는 select문

UNION: union에서의 두번째 혹은 나중에 따라오는 select문

DEPENDENT UNION: union에서의 두번째 혹은 나중에 따라오는 select문, 외곽 쿼리에 의존적이다.

UNION RESULT: union의 결과물

SUBQUERY: 서브쿼리의 첫번째 select

DEPENDENT SUBQUERY: 서브쿼리의 첫번째 select, 바깥 쪽 쿼리에 의존적이다.

DERIVED: from절의 서브쿼리

partitions

partitions는 파티셔닝이 되어 있는 경우에 사용되는 필드이다. 이 쿼리에서 사용된 테이블을 모두 파티셔닝이 되어 있지 않기 때문에 이 필드가 모두 NULL로 출력되았다. 파티셔닝 되어 있는 경우는 반드시 이 필드를 확인하자

type

type은 접근 방식을 표시하는 필드다. 접근 방식은 테이블에서 어떻게 행데이터를 가져올것인가를 가리킨다.

ALL, eq_ref는 조인시 기본 키나 고유키를 사용하여 하나의 값으로 접근(최대 1행만을 정확하게 패치), ref는 여러 개의 행을 패치할 가능성이 있는 접근을 의미한다.접근 방식은 대상 테이블로의 접근이 효율적일지 여부를 판단하는 데 아주 중요한 항목이다.

이들 접근 방식 가운데도 주의가 필요한 것은 ALL, index, ref_or_null이다.

ALL, index 두 가지는 테이블 또는 특정 인덱스가 전체 행에 접근하기 때문에 테이블 크기가 크면 효율이 떨어진다. ref_or_null의 경우 NUL이 들어있는 행은 인덱스의 맨 앞에 모아서 저장하지만 그 건수가 많으면 MySQL 서버의 작업량이 방대해진다. 다시 말해서 ALL 이외의 접근 방식은 모두 인덱스를 사용한다.

접근 방식이 ALL 또는 index인 경우는 그 쿼리로 사용할 수 있는 적절한 인덱스가 없다는 의미일 수도 있다. 위 쿼리에서 Country 테이블에 대한 접근은 ALL이지만 이는 WHERE 구의 조건을 지정하지 않았기 때문이다. 그러한 쿼리에서 드라이빙 테이블에 접근한다면 전체 행을 스캔 할수 밖에 없다.

접근 방식설명

  
const기본 키 또는 고유키에 의한 loockup(등가비교), 조인이 아닌 가장 외부의 테이블에 접근 하는 방식, 결과는 항상 1행이다. 단 기본 키, 고유 키를 사용하고 있으므로 범위 검색으로 지정하는 경우 const가 되지 않는다
system테이블에 1행밖에 없는 경우의 특수한 접근 방식
ALL전체 행 스캔, 테이블의 데이터 전체에 잡근한다.
index인덱스 스캔, 테이블의 특정 인덱스의 전체 엔트리에 접근한다.
eq_ref조인이 내부 테이블로 접근할 때 기본키 또는 공유 키에 의한 lookup이 일어난다. const와 비슷하지만 조인의 내부 테이블에 접근한다는 점이 다르다
ref고유 키가아닌 인덱스에 대한 등가비교, 여러 개 행에 접근할 가능성이 있다.
ref_or_nullref와 마찬가지로 인덱스 접근 시 맨 앞에 저장되어 있는 NULL의 엔트리를 검색한다.
range인덱스 특정 범위의 행에 접근한다
fulltextfulltext 인덱스를 사용한 검색
index_merge여러 개인스턴스를 사용해 행을 가져오고 그 결과를 통합한다.
unique_subqueryIN 서브쿼리 접근에서 기본 키 또는 고유 키를 사용한다. 이 방식은 쓸데 없는 오버헤드를 줄여 상당히 빠르다.
index_subqueryunique_sunquery와 거의 비슷하지만 고유한 인덱스를 사용하지 않는 점이 다르다. 이 접근 방식도 상당히 빠르다

possible_keys

possible_keys 필드는 이용 가능성있는 인덱스의 목록이다. [테이블 검색에 사용할 수 있는 인덱스]

key

possible_keys 필드는 이용 가능성있는 인덱스의 목록 중에서 실제로 옵티마이저가 선택한 인덱스가 key가 된다. 위 EXPLAN 에서는 County 테이블(첫 번째 행)의Key는 NULL 인데 이는 행 데이터를 가져오기 위해 인덱스를 사용할 수 없다는 의미이다.

실제 사용한 key 임

key_len

key_len 필드는 선택된 인덱스의 길이를 의미한다.

중요한 필드는 아니지만 인덱스가 너무 긴 것도 비효율적이므로 기억해두자.

rows

rows는 이 접근 방식을 사용해 몇 행을 가져왔는가를 표시한다. 최초에 접근하는 테이블에 대해서 쿼리 전체에 의해 접근하는 행 수, 그 이후에 테이블에 대해서는 1행의 조인으로 평균 몇 행에 접근했는가를 표시한다. 단 어디까지나 통계 값으로 계산한 값이므로 실제 행 수와 반드시 일치하지 않는다.

filtered

filtered는 행 데이터를 가져와 WHERE 구의 검색 조건이 적용되면 몇행이 남는지를 표시한다. 이 값도 통계 값 바탕으로 계산한 값이므로 현실의 값과 반드시 일치하지 않는다.

extra

Extra 필드는 옵티마이저가 동작하는데 대해서 우리에게 알려주는 힌트다. 이 필드는 EXPLAN을 사용해 옵티마이저의 행동을 파악할때 아주 중요하다.

참고문헌

https://cheese10yun.github.io/mysql-explian/ [MySQL 실행계획]

반응형
반응형

쿼리 실행 절차

  1. 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리한다.
  2. SQL의 파싱 정보(파스 트리)를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다.
  3. 두번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다.

첫 번째 단계를 "SQL 파싱(Parsing)"이라고 하며, MySQL 서버의 "SQL 파서"라는 모듈로 처리합니다. 만약 SQL 문장이 문법적으로 잘못됐다면 이 단계에서 걸러집니다. 또한 이 단계에서 "SQL 파스 트리"가 만들어집니다. MySQL 서버는 SQL 문장 그 자체가 아니라 SQL 파스 트리를 이용해 쿼리를 실행합니다.

두 번째 단계는 첫 번째 단계에서 만들어진 SQL 파스 트리를 참조하면서, 다음과 같은 내용을 처리합니다.

불필요한 조건의 제거 및 복잡한 연산의 단순화  
여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정  
각 테이블에 사용된 조건과 인덱스 통계 정보를 이용해 사용할 인덱스 결정  
가져온 레코드들을 임시 테이블에 넣고 다시 한번 가공해야 하는지 결정

물론 이 밖에도 수많은 처리를 하지만, 대표적으로 이런 작업을 들 수 있습니다. 두 번째 단계는 "최적화 및 실행 계획 수립" 단계이며, MySQL 서버의 "옵티마이저"에서 처리합니다. 또한 두 번째 단계가 오나료되면 쿼리의 "실행 계획"이 만들어집니다.

세 번째 단계는 수립된 실행 계획대로 스토리지 엔진에 레코드를 읽어오도록 요청하고, MySQL 엔진에서는 스토리지 엔진으로부터 받은 레코드를 조인하거나 정렬하는 작업을 수행합니다.

옵티마이저의종류

1. 비용 기반 최적화(Cost-based optimizer, CBO)
2. 규칙 기반 최적화 방법(Rule-based optimizer, RBO)

비용 기반 최적화는 쿼리를 처리하기 위한 여러 가지 가능한 방법을 만들고, 각 단위 작업의 비용(부하) 정보와 대상 테이블의 예측된 통계 정보를 이용해 각 실행 계획별 비용을 산출한다. 이렇게 산출된 각 실행 방법별로 최소 비용이 소요되는 처리 방식을 선택해 최종 쿼리를 실행하게 된다.

규칙 기반 최적화는 각 테이블이나 인덱스의 통계 정보가 거의 없고, 상대적으로 느린 CPU 연산 탓에 비용 계산 과정이 부담스러웠기 때문에 사용되던 최적화 방법이다. 현재는 거의 대부분의 RDBMS가 비용 기반의 옵티마이저를 채택하고 있으며, MySQL 역시 마찬가지이다.

통계정보

MySQL에서 관리되는 통계 정보는 대략의 레코드 건수와 인덱스의 유니크한 값의 개수 정도가 전부이다. 오라클과 같은 DBMS에서는 통계 정보가 상당히 정적이고 수집에 많은 시간이 소요되기 때문에 통계 정보만 따로 백업하기도 한다. 하지만 MySQL에서 통계 정보는 사용자가 알아채지 못하는 순간순간 자동으로 변경되기 때문에 상당히 동적인 편이다. 하지만 레코드 건수가 많지 않으면 통계 정보가 상당히 부정확한 경우가 많으므로 "ANALYZE" 명령을 이용해 강제적으로 통계 정보를 갱신해야 할 때도 있다. 특히 이런 현상은 레코드 건수가 얼마 되지 않는 개발용 MySQL 서버에서 자주 발생한다.

MEMORY 테이블은 별도로 통계 정보가 없으며, MyISAM과 InnoDB의 테이블과 인덱스 통계 정보는 다음과 같이 확인할 수 있다. ANALYZE 명령은 인덱스 키값의 분포도(선택도)만 업데이트하며, 전체 테이블의 건수는 테이블의 전체 페이지 수를 이용해 예측한다.

MyISAM 테이블의 ANALYZE는 정확한 키값 분포도를 위해 인덱스 전체를 스캔하므로 많은 시간이 소요된다. 이와는 달리 InnoDB 테이블은 인덱스 페이지 중에서 8개 정도만 랜덤하게 선택해서 분석하고 그 결과를 인덱스의 통계 정보로 갱신한다.

https://12bme.tistory.com/160 [mysql 옵티마지이져원리 부터 실행계획까지]

반응형

+ Recent posts