[composer] autoload

composer를 사용해서 간단하게 autoload를 사용하는 방법

1. monolog 패키지 설치해보기

composer require monolog/monolog

2. 패키지 로드하기

index.php

<?php
include './vendor/autoload.php';

use Monolog\Logger;

$log = new Logger('name');

3. 내 클래스 로드해보기

컴포저 autoload는 psr-4 규칙을 따르고 있기 때문에 클래스 생성시 네임스페이스를 규칙에 맞게 정하고 composer.json 파일에 namespace prefix와 클래스를 정의한 디렉토리를 매핑해주는 설정을 추가한다.

composer.json

{
    "require": {
        "monolog/monolog": "^2.2"
    },
    "autoload": {
        "psr-4": { // Js 네임페이스 접두사를 lib에 매핑
            "Js\\" : "lib/" 
        }
    }
}
/lib/src/Foo.php

<?php
namespace Js\Src;

class Foo{
    public function say()
    {
        return 'hello';
    }
}
index.php

<?php
include './vendor/autoload.php';

use Monolog\Logger;
use Js\Src\Foo;

$log = new Logger('name');
$foo = new Foo();
echo $foo->say();
composer dump-autoload

Foo 클래스에서 사용한 Js 네임스페이스 접두사를 lib디렉토리에 매핑해 주었기 때문에 autoload가 실행 될때 자동으로 지정한 경로의 클래스를 로드할 수 있게 된다.

참조

  • composer.json schema
  • psr-4
  • http://blog.ujsstudio.com/2021/01/09/psr-4-%eb%84%a4%ec%9e%84%ec%8a%a4%ed%8e%98%ec%9d%b4%ec%8a%a4-%ea%b7%9c%ec%b9%99/

[mysql] 인덱스 정리

인덱스란

  • 책의 목차와 같이 테이블 컬럼에 대한 인덱스를 생성해서 데이터를 검색속도를 향상 시키는것
  • 인덱스를 타면 풀스캔을 피할 수 있어서 데이터 검색 속도가 빠르다.

풀스캔

  • 인덱스가 없는 테이블에서 데이터를 찾을 때 처음부터 마지막 레코드까지 조회하여 검색 조건과 비교하게 된다.
  • 많은 양의 데이터를 조회 할 경우 풀스캔은 모둔 레코드를 조회하기 떄문에 성능이 느려지게 된다.

언제쓰면 좋을까

  • SELECT 쿼리에서 성능이 잘나오지만 INSERT, UPDATE, DELETE 쿼리에서는 때에 따라 다르다.
  • UPDATE, DELETE는 WHERE절에 잘 설정된 인덱스로 조건을 붙여주면 조회할 때 성능은 크게 저하 되지 않는다 (인덱스로 인해 데이터 조회에 속도가 빨라지는 것이고 데이터 수정 자체가 빨라지는 것이 아님)
  • INSERT의 경우, 새로운 데이터가 추가되면서 기존 인덱스 페이지에 저장되어 있던 탐색 위치가 수정되어야 하므로 효율이 좋지 않다.
  • WHERE 절에서 자주 사용되는 Column
  • 외래키가 사용되는 Column
  • join에 자주 사용되는 Column
  • ORDER BY, ORDER BY
  • 데이터양이 많은 테이블

인덱스 칼럼 기준

  • 카디널리티가 높은 것
  • 전체 행에 대한 특정칼럼의 중복 수치를 나타낸 지표로 복합인덱스인 경우 카디널리티가 높은 순에서 낮은순으로 구성하는게 좋다.

인덱스 사용방법

  • 생성
CREATRE INDEX 인덱스이름 ON 테이블이름(필드1, 필드2, ...)
  • 삭제
ALTER TABLE 테이블이름 DROP INDEX 인덱스이름
  • 실행계획
SHOW INDEX FROM 테이블 이름
구분설명
Table테이블 이름
Non_unique인덱스가 중복된 값을 저장할 수 있으면 1, 저장할 수 없으면 0을 표시함
Key_name인덱스의 이름을 표시하며, 인덱스가 해당 테이블의 기본 키라면 PRIMARY로 표시함
Seq_in_index인덱스에서의 해당 필드의 순서를 표시함
Column_name해당 필드의 이름을 표시함
Collation기본적인 정렬 형태, A오름 차순, NULL: 정렬구분 없음
Cardinality인덱스에서 저장된 유일한 값들의 수를 표시함
Sub_part인덱스 접두어를 표시함
Packed키가 압축되는 방법을 표시함
Null해당 필드가 Null을 저장 할 수 있으면 YES, 그렇지 않으면 ”를 표시함
Index_type인덱스에 사용되는 메소드를 표시함 인덱스 모드(BTREE, FULLTEXT, HASH, RTREE) / FULLTEXT 는 5.7 이상에서 유효
Comment해당 필드를 설명하는 것이 아닌 인덱스에 관한 정보를 표시함
Index_comment인덱스에 관란 모든 기타 정보를 표시함
실행계획 정보

유의사항

  • 최소한 첫번째 인덱스 조건은 조회조건에 포함되어야만 한다.
    • 인덱스 컬럼순서와 조회쿼리 컬럼 순서를 지킬필요는 없다.
  • 인덱스로 사용된 컬럼값 그대로 사용해야 인덱스가 사용된다.
    • 인덱스는 가공된 데이터를 저장하고 있지 않다.
  • AND 연산자는 검색 범위를 좁혀주지만 OR 연산자는 비교할 행이 더 늘기 때문에 풀 스캔이 발생할 확률이 높다.
  • 범위조건일때 해당 컬럼은 인덱스를 타지만, 그 뒤 인덱스 컬럼들은 인덱스가 사용되지 않는다.
  • null 값의 경우 is null 조건으로 인덱스 레인지 스캔 가능
  • LIKE 검색시 %가 앞에 위치하면 풀스캔 발생

참조

psr-4 네임스페이스 규칙

  • “class” 라는 용어는 class, interface, trait 등의 기타 유사한 구조를 말한다
  • 정규화 된 클래스 이름의 형식
    • \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
    • 정규화 된 class 이름은 NamespaceName(공급자 네임스페이스) 라고하는 최상위 네임스페이스를 가져야한다. 회사명 아이디등 주로 사용한다. (MUST)
    • 정규화 된 class 이름은 하나 이상의 SubNamespaceNames를 가질 수 있다.(MAY)
    • 정규화 된 class 이름은 마지막 클래스 이름(terminating class name)을 가져야 한다.(MUST)
    • 밑줄(_)은 정규화 된 클래스 이름의 어느 부분에도 특별한 의미가 없다.
    • 정규화 된 클래스 이름의 알파벳 문자는 대소문자의 조합 일 수 있다 (MAY)
    • 모든 클래스 이름은 대소문자를 구분하여 참조해야한다.(MUST)
  • 정규화 된 class 이름에 해당하는 파일을 로드 할때
FULLY QUALIFIED CLASS NAMENAMESPACE PREFIXBASE DIRECTORYRESULTING FILE PATH
\Acme\Log\Writer\File_WriterAcme\Log\Writer./acme-log-writer/lib/./acme-log-writer/lib/File_Writer.php
\Aura\Web\Response\StatusAura\Web/path/to/aura-web/src//path/to/aura-web/src/Response/Status.php
\Symfony\Core\RequestSymfony\Core./vendor/Symfony/Core/./vendor/Symfony/Core/Request.php
\Zend\AclZend/usr/includes/Zend//usr/includes/Zend/Acl.php
네임스페이스 예제

  • 정규화 된 클래스 이름에서 선행 네임 스페이스 구분 기호(”)를 포함하지 않는 하나 이상의 상위 네임스페이스와 하위 네임스페이스로 구성된 (“namespace prefix”)는 적어도 하나의 base directory에 “대응”한다.
    Acme\Log\Writer : ./acme-log-writer/lib/
  • “Namespace prefix” 다음에 이어지는 하위 네임스페이스 이름은 “base directorty” 내의 하위 디렉토리에 해당하며 네임스페이스 구분 기호는 디렉토리 구분 기호를 나타낸다. 하위 디렉토리 이름은 하위 네임스페이스 이름의 대소문자와 일치해야 한다.
    \Aura\Web\Response\Status : /path/to/aura-web/src/Response/Status.php
  • 마지막에 존재하는 class이름은 .php 로 끝나는 파일 이름과 같아야 한다.
    \Aura\Web\Response\Status : /path/to/aura-web/src/Response/Status.php

postman 실행 오류

OpenFailedError: UpgradeError Dexie specification of currently installed DB version is missing

앱삭제 후 재설치 해도 문제 해결이 되지 않음

  1. ~/Library/Application Support로 이동
  2. postman 폴더명 백업 postman.old
  3. postman 재실행
  4. 정상작동

다시 ~/Library/Application Support으로 가보면 postman 디렉토리가 새로 생성된걸 확인 할수 있음

참고 : https://support.postman.com/hc/en-us/articles/360025359014-How-to-resolve-the-Could-not-open-Postman-error-

cURL

command line tool and library
for transferring data with URLs

지원 프로토콜

DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Telnet and TFTP. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, HTTP/2, HTTP/3, cookies, user+password authentication (Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos), file transfer resume, proxy tunneling and more.

기본사용

curl ipconfig.me

자주 사용하는 옵션

shortlong설명
-v–verbose내용을 자세하게 출력한다
-X–requestrequest method 지정
-H–headerrequest header 지정
-d–data사용자가 HTML 양식을 채우고 제출하는 방식과 동일한 POST 요청의 지정된 데이터를 HTTP 서버로 보냄
-o–output지정된 이름으로 파일저장

예제보기

#URL
POST /v1/synthesize HTTP/1.1
Host: kakaoi-newtone-openapi.kakao.com
Content-Type: application/xml
Authorization: KakaoAK {rest_api_key}
#REQUEST
curl -v -X POST "https://kakaoi-newtone-openapi.kakao.com/v1/synthesize" \
-H "Content-Type: application/xml" \
-H "Authorization: KakaoAK kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" \
-d '<speak>
그는 그렇게 말했습니다.
<voice name="MAN_DIALOG_BRIGHT">잘 지냈어? 나도 잘 지냈어.</voice>
<voice name="WOMAN_DIALOG_BRIGH" speechStyle="SS_ALT_FAST_1">금요일이 좋아요.</voice>
</speak>' > result.mp3

참조

같이보기

[laravel] This cache store does not support tagging 해결방법

태그가 지정된 캐시를 저장하고자 할때 ‘This cache store does not support tagging.’ 라는 에러가 발생했다.

코드 :

$articles = Cache::tags('article')->remember.env($cacheKey, now()->addMinutes(30), function () {
            return Article::latest()->paginate(10);
        });

문제해결:

캐시드라이버가 file 또는 database 에서는 태그기능을 지원하지 않는다.
.env 에서 CACHE_DRIVER값을 redis 또는 memcache또는 array로 변경한다.

#CACHE_DRIVER=file
CACHE_DRIVER=array

설정캐시를 날려 수정한 사항이 반영되도록 한다.

php artisan config:cache

만약 드라이버를 수정하지 않고 특정 위치에서만 사용하고 싶을때는 Cache파사드의 store메서드에 드라이버를 인자로 전달하면 된다.

        $articles = Cache::store('array')->tags('article')->remember($cacheKey, now()->addMinutes(30), function () {
            return Article::latest()->paginate(10);
        });