application.yml 파일 spring: datasource: url: jdbc:oracle:thin:@127.0.0.1:1521:XE username: seohae password: pawd123 driver-class-name: oracle.jdbc.driver.OracleDriver Ojdbc6 나의 프로젝트 버전은 아래와 같다. id 'org.springframework.boot' version '2.4.2' Oracle DB 연동을 하기위해 Ojdbc6 을 build.gradle 에 추가했다. runtimeOnly 'com.oracle.database.jdbc:ojdbc6' 하지만 제대로 연동되지 않는다. Ojdbc6 을 포함하게되면 application.yml 파일 안의 driver-c..
오라클 이미지 설치 docker pull jaspeen/oracle-xe-11g docker-compose 파일 생성 version: '2' services: oracle11g: image: jaspeen/oracle-xe-11g container_name: oracle11g volumes: - ~/경로명:/u01/app/oracle jaspeen/oracle-xe-11g ports: - 1521:1521 여기서 경로명은 도커 안의 오라클의 데이터를 저장할 로컬 PC의 위치이다. docker-compose 파일 실행 1) 로컬PC에 이전에 생성한 docker-compose 파일의 위치로 이동 cd 경로 2) docker-compose 실행 docker-compose up -d 3) docker-compo..
문제 정수 X가 주어질때 정수 X에 사용할 수 있는 연산은 다음과 같이 4가지이다. 1) X가 5로 나누어떨어지면, 5로 나눈다. 2) X가 3으로 나누어 떨어지면, 3으로 나눈다. 3) X가 2로 나누어 떨어지면, 2로 나눈다. 4) X에서 1을 뺀다. 정수 X가 주어졌을때, 연산 4개를 적절히 사용해서 1을 만들어야한다. 이 연산을 사용하는 횟수의 최솟값을 출력해라. X = 26일 경우 1. 26 - 1 = 25 2. 25 /5 = 5 3. 5 / 5 = 1 출력값 : 3 나의 코드 풀이를 완성하지 못했다. 우선 마지막까지 해본 코드는 아래와 같다. 몫과 나머지를 이용해서 풀어보려고 했지만 최소 횟수를 구하기에는 역부족이였다. value = 26 result = 0 while value != 1: #..
문제 개미 전사는 부족한 식량을 충당하고자 메뚜기 마을의 식량창고를 몰래 공격하려고 한다. 메뚜기 마을의 식량창고는 일직선으로 이어져있고, 개미 전사는 선택적으로 약탈하여 식량을 빼앗을 예정이다. 이때 메투기 정찰병들은 일직선상에 존재하는 식량창고 중에서 서로 인접한 식량창고가 공격받으면 바로 알아챌 수 있다. 따라서 개미 전사는 정찰병에게 들키지않기 위해 최소한 한 칸 이상 떨어진 식량창고를 약탈해야한다. 예시 [1, 3, 1, 5] 개미전사는 두번째 식량창고와 네번째 식량창고를 선택했을때 최대값인 8개의 식량을 빼앗을 수 있다. 나의 코드 list = [1, 3, 1, 5] odd_sum = 0 even_sum = 0 for i, value in enumerate(list): if i % 2 == 0..
엘라스틱서치 검색 방법 엘라스틱 서치에서 제공하는 검색 API는 질의(Query)를 기반으로 동작한다. 1) URI 검색 2) Request Body 검색 URI 검색은 단순히 GET 방식처럼 URI 표기법을 사용하는 것이고, 2)번의 Request Body는 RESTFul API를 이용하여 Body에 조건을 표기하여 사용하는 방법이다. URI 검색 URI를 이용하는 방식은 HTTP GET 요청을 활용하는 방식이다. 'key=Value' 형식의 파라미터로 검색하고자 하는 검색 조건을 넣는다. 따라서 검색 조건에 따라 URI의 파라미터가 변경될 것이고, URI 표기법에 맞게 호출된 조건에 따라 결과를 내려준다. 하지만 파라미터로 표현할 수 있는 표현의 한계가 있기 때문에 Request Body 검색 방법을..
매핑 엘라스틱서치에서 매핑이란, 색인할때 문서의 데이터 유형에 따라 필드에 적절한 데이터 타입을 지정하는 것을 말한다. 매핑은 색인될 문서의 데이터 모델링이라고도 할 수 있다. 엘라스틱서치는 기본적으로 명시적으로 필드를 정의하지 않아도 데이터 유형에 따라 필드의 데이터 타입에 대한 매핑 정보가 자동으로 생성된다. 하지만 좀더 정확한 검색을 위해서는 수동적으로 매핑하여 필드에 적합한 데이터 타입으로 정의하는 것이 좋다. 색인 : 역색인 파일을 만드는 것 매핑의 의미 > 색인시 데이터가 어디에 어떻게 저장될지를 결정하는 설정이다. > 인덱스에 추가되는 각 데이터 타입을 구체적으로 정의하는 일이다. # 문서 (1) { "key" : "12345", "value" : "abced" } # 문서 (2) { "ke..
엘라스틱서치의 용어 1) 인덱스 엘라스틱서치는 하나의 인덱스에 하나의 타입만이 구성 가능하다. 인덱스(index)는 데이터 저장 공간으로, 하나의 노드에는 여러 개의 인덱스를 생성할 수 있다. 하나의 인덱스는 여러 노드에 분산 저장되어 관리된다. 엘라스틱서치의 인덱스 생성시 기본 구조 5개의 프라이머리(Primary) 샤드 + 1개의 레플리카(Replica) 샤드 2) 샤드 색인된 문서는 하나의 인덱스에 저장되고, 인덱스 내부에 색인된 데이터는 여러개의 파티션으로 나뉘어 구성된다. 이때의 파티션을 '샤드(Shard)'라고 한다. 3) 타입 인덱스의 논리적 구조이다. 데이터베이스에서 이와 같은 개념으로는 테이블이 있다. 4) 문서 데이터가 저장되는 최소 단위이다. 데이터베이스에서 이와 같은 개념으로는 행이..
들어가며 엘라스틱 서치는 검색 엔진이다. 여기서 검색 엔진(search engine)이란, 웹에서 정보를 수집하여 검색 결과를 제공하는 프로그램이다. 우리가 많이 사용하고있는 데이터베이스는 비정형 데이터를 색인하고 검색하는 것이 불가능하다. 비정형 데이터 : 정해진 규칙이 없는 데이터; 예) 텍스트, 음성, 영상 등 색인 : 키워드를 찾아보기 쉽도록 정렬한 목록 하지만 엘라스틱서치에서는 비정형 데이터를 색인하고 검색하는 것이 가능하다. 또한 엘라스틱서치의 장점 중의 하나인 역색인 구조을 사용함으로써 빠른 검색이 가능하다. 역색인 : 키워드를 통해 문서를 찾는 방식 관계형 데이터베이스와의 비교 엘라스틱서치 관계형 데이터베이스 인덱스 데이터베이스 샤드 파티션 타입 테이블 문서 행 필드 열 매핑 스키마 Que..
들어가며 컨슈머가 poll()을 호출할 때마다 컨슈머 그룹은 카프카에 저장되어있는 아직 읽지않은 메시지를 가져온다. 이렇게 동작할 수 있는 것은 컨슈머 그룹이 메시지를 어디까지 가져왔는지를 알 수 있기 때문이다. 컨슈머 그룹의 컨슈머들은 각각의 파티션에 자신이 가져간 메시지의 위치 정보를 기록하고 있다. 커밋 카프카는 각 컨슈머 그룹의 파티션 별로 오프셋 정보를 저장하기 위한 저장소가 별도로 필요하다. 만약 특정 컨슈머가 갑자기 다운되거나 컨슈머 그룹에 새로운 컨슈머를 추가하게된다면 컨슈머 그룹 내에서 리밸런스가 발생한다. 리밸런스가 일어난 후 각 컨슈머들은 이전에 처리했던 토픽의 파티션이 아닌 다른 새로운 파티션에 할당된다. 이때 컨슈머는 이전의 컨슈머가 가져간 데이터의 이후 시점부터 읽어들여야 한다...
컨슈머 그룹 카프카에는 프로듀서가 전달한 데이터를 저장하는 데이터 저장소인 토픽이 있다. 컨슈머는 해당 토픽에서 데이터를 가져오는데, 여러 컨슈머들은 컨슈머 그룹을 이루어 동시에 접속하여 메시지를 가져올 수 있다. 프로듀서가 토픽에 보내는 메시지 속도가 갑자기 증가하게되어, 컨슈머가 처리하지 못한 메시지들이 생기게된다. 해당 메시지들을 가져오는 컨슈머를 확장할 필요성이 생겼다. 만약 컨슈머만 확장한다면 기존과 신규 컨슈머의 오프셋(데이터의 저장 위치; 파티션별로 유니크한 순차적인 증가값을 위치로 가진다)가 뒤섞이면서 메시지들이 뒤죽박죽 될 것이다. 이를 해결하기 위해 카프카는 동일한 토픽에 대해 여러 컨슈머가 메시지들을 가져갈 수 있도록 컨슈머 그룹의 기능을 제공한다. 컨슈머 리밸런스 컨슈머 그룹 안에서..
들어가며 리플리케이션의 이해가 먼저 필요하다. devfunny.tistory.com/380?category=829528 카프카의 토픽과 파티션, 오프셋 토픽 카프카에서는 프로듀서가 전달하는 메시지를 '토픽'에 저장하고, 컨슈머가 해당 '토픽'에서 메시지를 가져온다고 하였다. 메시지의 저장소 역할을 하는 토픽은 데이터베이스의 '테이블'의 devfunny.tistory.com 팩터 리플리케이션의 팩터(Replication Factor)를 지정할 수 있는데, 팩터의 개수는 리플리케이션의 수와 같다. 리플리케이션 팩터는 default 값이 1개인데, 이를 2개로 수정하면 리플리케이션의 수가 2개가 된다. 카프카 클러스터 내에 3개의 브로커가 존재할 경우, 리플리케이션 팩터 수를 수정하지 않았을 때 default..
토픽 카프카에서는 프로듀서가 전달하는 메시지를 '토픽'에 저장하고, 컨슈머가 해당 '토픽'에서 메시지를 가져온다고 하였다. 메시지의 저장소 역할을 하는 토픽은 데이터베이스의 '테이블'의 역할과 같다. 또한 회원 테이블에서는 회원의 정보를 가져오고, 주문 테이블에서는 주문 정보를 가져오듯이 토픽도 특정 주제의 데이터들을 저장하는 저장소로 분류할 수 있고, 마찬가지로 컨슈머는 회원 토픽에서는 회원의 정보를, 주문 토픽에서는 주문의 정보를 가져온다. 따라서 토픽은 데이터를 구분하기 위한 단위로도 사용된다. 메시지를 받을 수 있도록 논리적으로 묶은 개념으로 데이터를 저장하는 데이터 저장소 파티션 카프카의 토픽은 분할된다. 이렇게 토픽을 분할한 것을 파티션이라고 한다. 만약 여러 프로듀서가 같은 토픽에 데이터를 ..
카프카의 기능 카프카의 높은 처리량, 빠른 메시지 전송, 운영 효율화 등을 위해 구현되어있는 기능을 알아보자. 1) 분산 시스템 분산 시스템이란, 같은 역할을 하는 여러 대의 서버로 이루어진 서버 그룹을 뜻한다. - 단일 시스템보다 더 높은 성능을 얻을 수 있다. - 분산 시스템 중 하나의 서버/노드 등에 장애가 발생하면 다른 서버/노드가 대신 처리한다. - 시스템 확장에 용이하다. 2) 페이지 캐시 OS의 페이지 캐시란, 메모리 중 남은 잔여 메모리의 일부를 페이지 캐시로 이용함으로써 처리 속도를 높이고 전체적인 성능을 향상시키는 것이다. 디스크에 읽기/쓰기를 하지 않고 페이지 캐시를 통해 읽고 쓰는 방식을 통해 전체적인 성능 향상을 높이게 되는데 카프카는 이를 이용하도록 디자인되었다. 3) 배치 전송..
카프카의 개념 카프카는 메시징 서버로 동작한다. 메시징 시스템이 무엇인지 먼저 알아보자. 메시징 시스템 메시징 시스템이란, 프로듀서(producer)와 컨슈머(consumer)가 서로 메시지를 전달할 때 직접 전달하는 것이 아닌 중간의 메시징 시스템을 거친 후 전달하는 것을 말한다. 프로듀서 (publisher/producer) 메시지라고 불리는 데이터 단위를 보내는 측 컨슈머 (subscriber/consumer) 데이터를 가져가는 측 카프카에서 프로듀서가 보내는 데이터가 토픽에 저장되고, 토픽(메시지 저장소)에 저장된 데이터를 가져가는 컨슈머는 원하는 토픽에서 데이터를 가져간다. 펍/섭(pub/sub) 모델 중앙에 메시징 시스템 서버를 두고 이렇게 메시지를 보내고 받는 형태의 통신 펍/섭 모델 이전에..
Webstorm 프로젝트 생성 File-New-Project 클릭하여 아래 Empty Project를 원하는 경로에 생성한다. Hexo 설치 1) hexo 설치 npm install hexo-cli -g 2) 셋팅 hero init 폴더명 cd 폴더명 npm install 3) hexo 배포를 위한 설치 npm insatll hexo-deployer-git --save 테마 적용 (next) 1) git submodule 적용 git submodule add https://github.com/theme-next/hexo-theme-next themes/next 2) 변경사항 푸쉬 방법 1) cd themes\next# 테마 경로로 이동 git add . git commit -m "커밋메세지" 2) cd ..