백엔드 6주차 정리

김지영·2022년 6월 27일
0

API를 실행했을 때 중간에 에러가 발생해서 끝까지 실행되지 못한다면, 여러 곳에서 예상치 못한 문제들이 발생할 수 있습니다. 이를 대비해서 트랜잭션 내에서 이미 성공한 부분들도 싹 다시 롤백을 해줘야 하는데, 이는 데이터의 consistency를 지켜주기 위함입니다. 트랜잭션의 속성들엔 크게 4가지가 있는데, consistency (일관성)이 그 중 하나입니다. 나머지 3개는 atomicity (원자성), isolation (격리성), 또 durability (지속성)이고, 이 4가지를 통틀어 ACID라는 약자를 사용합니다.
수업시간에 배운 isolation 레벨에는 크게 4개가 있는데, 각 레벨마다 허용되는 범위가 다릅니다. Read-Uncommitted의 경우엔 dirty-read (완료되지 않은 작업의 데이터) 까지도 읽고, serializable의 경우엔 dirty-read, non-repeatable-read, phantom-read 모두 차단합니다.

6주차 이튿날에는 ES6의 새로운 기능인 promise에 대해 배웠습니다. Promise는 자바스크립트 비동기 처리에 사용되는 객체이며, new 오퍼레이터를 사용해 생성할 수 있습니다:
new Promise();
Promise 객체에는 3개의 상태 (state)가 있으며, "pending" (결괏값: undefined), "fulfilled" (결괏값: a result value), 또 "rejected" (결괏값: an error object), 이렇게 3가지 입니다. Promise가 리턴되는 함수를 호출하고 then()을 이용해서 결괏값을 받고 처리해주며, 실패 상태는 catch()로 값을 받고 처리합니다 (with a try/catch statement). 여러개의 비동기 처리를 병렬로 처리할 때에는 Promise all을 사용합니다. 이 경우에 내부의 각 promise들의 처리 순서는 보장되지 않습니다.

나흘째와 닷새째에는 검색 프로세스에 대해 배웠습니다. SQL 쿼리들을 이용해 board라는 테이블에서 원하는 자료를 빼오는 연습을 했고, 같은 결과를 얻을 때 최적의 방법을 찾을 수 있는 옵티마이저 활용 방법도 배웠습니다. "explain"이라는 명령어를 통해 옵티마이저에게 실행계획을 물어볼 수 있습니다. 이 과정에서 어떠한 컬럼에 인덱스를 생성해 줌으로써 (create index...) 속도를 향상시킬 수 있다는 걸 배웠습니다. (인덱스를 생성해 주고 그 컬럼으로 검색)

검색을 빠르게 하기 위한 데이터베이스를 두가지 사용했습니다: Redis와 Elasticsearch인데요. Redis는 in-memory 캐시 시스템을 사용하는 DB로서, 속도가 느린 디스크에 액세스 하지 않고, 메모리 액세스만으로 검색을 끝낼 수 있습니다. Cache miss일 경우 나중을 위해 Redis DB에 결과를 저장해주도록 코드를 짰습니다. Elasticsearch의 경우 역인덱싱 개념을 이용해 찾고자 하는 자료를 엄청나게 빠른 속도로 얻을 수 있게 해줍니다. Elasticsearch를 위해 데이터를 가공해주는 툴인 Logstash도 간단히 사용해봤는데, .conf 파일을 사용해 input과 output을 설정해 주었습니다. Input에서는 MySQL 웹사이트에서 다운받은 커넥터 파일 (확장자: .jar)을 드라이버 라이브러리에 연결시켜 주고, 계정 ID와 비밀번호 등을 입력해 주었고, output에서는 가지고 온 자료를 엘라스틱서치에 넣는 작업을 해주었습니다. 아래의 코드조각은 수업시간에서 가져온 것인데, elasticsearch의 포트넘버 (i.e. 9200)와 인덱스 등을 입력해 준 것을 볼 수 있습니다.

output {
    elasticsearch {
        hosts => "elasticsearch:9200"
        index => "myproduct03_new"
    }
}
profile
아줌마

0개의 댓글