본문 바로가기

전체 글252

GiftFunding) 스켸줄러 이용해 친구 요청 거절 항목을 하루 뒤 삭제 내 프로젝트에서 스켸줄러가 이용될 구간은 많은데 우선은 친구 요청을 거절했을 때 하루에 한 번씩 REJECT 항목을 찾아 제거 해주려고 한다. 그러기 위해서는 일단 Friend 테이블에 updated_at 컬럼을 추가해야한다. 스켸줄링 기능 구현 1. main application에 @EnableScheduling 추가 2. scheduler를 사용할 Class에 @Component, Method에 @Scheduled추가. @Scheduled 규칙 -> Method는 void타입 -> Method는 매개변수 사용 불가 요렇게 해주면 됨. 참고로 @Component 꼭 해줘야 된다 ! cron 규칙에 따라 원하는 시간 작성하면 끝 2023. 12. 13.
동시성(Concurrency) 이슈 동시성이란 ? 어떤 두 사건이 같은 시간에 일어나는 것을 이르는 말 나의 경우는 여러군데서 동시성 이슈가 발생할 수 있다. 현재까지 구현한 기능에서 보면 A->B에게 , B->A에게 동시에 친구요청을 거는 일이 발생한다면 동시성 이슈가 발생하게 된다. Y ?) - A가 B에게 친구요청을 걸었을 때 WAIT 상태의 Friend 컬럼 생성. - A->B 요청이 처리되기 전의 상태로 B가 A에게 친구요청을 걸었을 때 똑같이 WAIT상태의 컬럼 생성. 정상적으로 A->B, B->A 요청이 순차적으로 들어왔다면 B가 A에게 친구요청을 걸수 없다. (이미 상대에게 요청이 들어온 건에 대해서 자신이 또 상대에게 요청을 걸 수 없게 해놨으므로) 위와 같은 상황을 경쟁 상태라고 한다. 경쟁상태(race condition.. 2023. 12. 13.
트랜잭션 트랜잭션이란 ? 트랜잭션은 쪼갤 수 없는 작업의 단위로 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 수행되어야 할 일련의 연산들을 의미. 여기서 작업의 단위는 질의어 한문장이 아니다 ! 작업 단위는 많은 질의어 명령문들을 사람이 정하는 기준에 따라 정하는 것 ex) 사용자 A가 사용자 B에게 송금시 1. A의 계좌에서 금액 차감 : update로 A의 잔고 변경 2. B의 계죄에 금액 추가 : update로 B의 잔고 변경 작업 단위 : 출금 update + 입금 update를 통틀어 하나의 트랜잭션 이라고 함. =>> 두 쿼리문이 모두 성공적으로 완료되어야만 하나의 작업 완료 트랜잭션의 특징 ACID 트랜잭션의 특징 4가지는 원자성(Atomicity), 일관성(Consistency),.. 2023. 12. 13.
Page로 페이지 처리하기 Pageable : 페이징을 제공하는 인터페이스 getPageNumber() : 현재 페이지 번호를 반환(0부터 시작) getPageSize() : 한 페이지당 최대 항목 수를 반환 getOffset() : 현재 페이지의 시작 위치를 반환 getSort() : 정렬 정보를 반환 next() : 다음 페이지 정보를 반환 previous() : 이전 페이지 정보를 반환 * Pageable을 이용하면 페이지 번호, 페이지당 항목 수, 정렬 정보등을 지정할 수 있다. * Pageable로 지정한 정보들을 가지고 Page 객체를 반환할 수 있고, Page 객체는 조회된 데이터와 페이지 정보를 함께 갖게 된다. PagRequset : Spring Data JPA에서 제공하는 Pageable 구현체 중 하나로, 페이.. 2023. 12. 10.
GiftFunding) Elasticsearch를 활용하여 상품검색 기능 구현 해줘야 할 일은 크게 3가지 1. 인덱스 생성 2. 데이터 저장 3. 검색 API 요청 * Elasaticsearch의 Client 자바에서 ES API를 이용하기 위해서 ES에서 만들어 놓은 클라이언트가 필요함. ES 7버전까지 Client는 HighLevelClient와 LowLevelClient가 있음. HighLevelClient는 API를 추상화시켜 놓아서 SDK 형식으로 사용할 수 있음. ES 8버전으로 넘어오면서 이 기능이 더이상 사용되지 않음. Elasticsearch 연결 build.greadle에 아래의 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch' Elasticsearch 구.. 2023. 12. 9.
GiftFunding) Docker Compose로 es와 kibana 띄우기 + nori 까지 설치 이전 포스팅에서 따로따로 docker image 다운받고 실행시켜줬는데 이걸 docker-compose를 이용해서 한 번에 실행시키도록 했다. Docker Compose? 여러 개의 컨테이너들을 관리, 실행하기 위한 툴로 각각 독립된 컨테이너의 실행을 정의. yml 포맷으로 작성되고 여러 컨테이너들을 한 번에 관리할 수 있게 도와줌. 작성 법 : 프로젝트 루트 경로에 파일을 만들고 실행 설정을 적어둠. 터미널에서 도커 명령어를 사용하여 컨테이너를 실행하거나 종료시킴. : yml 파일은 크게 버전 정의, 서비스 정의, 볼륨 정의, 네트워크 정의의 4가지 항목으로 구성. 많이 사용하는 것은 서비스 정의이고, 볼륨과 네트워크는 서비스로 생성된 컨테이너에 선택적으로 사용. : yml파일에서 들여쓰기 할 때 탭은.. 2023. 12. 9.
GiftFunding) 도커에 Elasticsearch, Kibana 컨테이너 다운 및 실행 Elasticsearch를 설정하는 방법 2가지 1. 공식 사이트에서 다운받아 실행 2. docker이미지 사용 나는 docker이미지를 사용하는 방식으로 구현해보겠다. Docker에 Elasticsearch image 다운 $ docker pull docker.elastic.co/elasticsearch/elasticsearch:7.9.1 image 설치 확인 $ docker images 컨테이너 구동 docker run —name [붙여줄컨테이너이름] -e [환경변수지정] -d(프로세스를 백그라운드로 실행한다는 의미) -p [포트정보] 실행할 이미지 정보까지 입력 $ docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --n.. 2023. 12. 8.
Elasticsearch) Mapping ES는 인덱스에 도큐먼트를 추가하면 자동으로 매핑이 생성됨. 집어넣은 데이터의 도큐먼트 모양에 따라 다양한 매핑들이 생성. Mapping은 RDB의 스키마(속성)라고 생각. GET [인덱스명] //setting, mapping정보 다 볼 수 있음. GET [인덱스명]/_mapping // mapping 정보만 확인 가능. 매핑 정의 데이터가 입력되어 자동으로 매핑 생성되기 전에 미리 먼저 인덱스의 매핑을 정의해놓으면 정의 해놓은 매핑에 맞추어 데이터가 입력됨. PUT { "mappings": { "properties": { "":{ "type": "" … } … } } } 이미 만들어진 매핑에 필드 추가는 가능 PUT /_mapping { "properties": { "": { "type": "" … }.. 2023. 12. 8.
Elasticsearch) 데이터 색인과 텍스트 분석 풀텍스트 검색을 하기 위해서는 데이터를 검색에 맞게 가공해야함. ES는 데이터를 저장하는 과정에서 가공작업을 처리. ES는 데이터를 저장할 때 역 인덱스(Inverted Index) 방식으로 저장 > RDB에서 데이터를 찾을 때 RDB는 테이블 구조로 데이터를 저장하여 텍스트를 찾으려면 한 줄씩 like문을 이용해서 찾음. -> 데이터가 늘어날 수록 검색해야 할 대상이 늘어 효율성이 떨어짐. -> Row안의 모든 내용을 읽어야 하기 때문에 기본적으로 속도가 느림 > Elastic Search에서 데이터 저장 각 문장의 단어를 하나하나 쪼개서 단어가 어떤 도큐먼트에 있는지 가리키는 인덱스를 만듦. 추출된 각 키워드를 텀(Term)이라고 부름. 역인덱스가 있으면 해당 단어를 포함하는 도큐먼트의 id를 바로 .. 2023. 12. 8.
728x90