Back-End 45

[MongoDB] MQL 기초 5 - 배열과 내장 Document를 다루는 방법 2 (Update)

❑ 공통 데이터 Insertdb.students.insertMany([ {_id: 1, grades: [85, 80, 80]}, {_id: 2, grades: [88, 90, 92]}, {_id: 3, grades: [85, 100, 90]}]) ❑ 배열의 값 변경하기 : $set[참고] $ : Positioning Operator 1. Array.$ : 배열 내 조건과 일치하는 첫 번째 element에 적용1.1. 배열 Element가 Value일 때 UpdateAS-IS){ _id: 1, grades: [85, 80, 80]}MQL)db.students.updateOne( { _id: 1, grades: 80 }, { $set: { "grades.$": 82 } })_id:1 이고, grades 배..

Back-End/MongoDB 2024.05.31

[MongoDB] MQL 기초 4 - 배열과 내장 Document를 다루는 방법 1 (Read)

1. 내장 Document 조회 (Inner Document)내장 Document는 Document 안에 필드가 Document인 것을 말한다.예시db.sales.findOne() 조회 결과{ ... customer : { gender:'M', age: 50, email:'hello@naver.com', satisfaction:5 } ...}Document를 조회한 결과 customer 필드는 Document를 갖고 있다. 이를 내장 Document라고 한다 조회방법 1. 내장 Document 전체를 filter로 적용내장 Document를 조회할 땐 filter에 해당 Document를 전부 명시해줘야 한다즉, 위의 customer를 조회하려면 다음과 같이 MQL을 써야한다.db.sales.findOn..

Back-End/MongoDB 2024.05.31

[MongoDB] MQL 기초 3 - 유용한 CRUD 쿼리 함수

1. Collection Method공식 DocumentCollection Methods Collection Methods - MongoDB Manual v7.0For details on a specific method, including syntax and examples, click on the link to the method's reference page.www.mongodb.com공식 Document에 아래에 소개한 쿼리 함수 외에도 find(), findOne() 같은 기본적인 함수부터 다양한 함수들이 소개되어 있다.생각보다 읽기 어렵지 않고, 가장 정확한 내용이므로 공식 문서를 보면서 익히는 연습을 하자 db.collection.bulkWrite()여러 개의 insert, update, de..

Back-End/MongoDB 2024.05.31

[MongoDB] SQL vs MQL 비교 문서

MQL = MongoDB Query LanguageMQL은 개발 언어처럼 함수 형태로 작성한다예: db.collection.find({}); SQL과 MQL 비교기본적인 것만 바로 참고할 수 있게 캡처함. 더 자세한 내용은 문서 들어가서 참고하기https://www.mongodb.com/docs/v7.0/reference/sql-comparison/ SQL to MongoDB Mapping Chart - MongoDB Manual v7.0In addition to the charts that follow, you might want to consider the Frequently Asked Questions section for a selection of common questions about Mong..

Back-End/MongoDB 2024.05.31

[MongoDB] Replica Set Local에 구축하기

1. Mongodb 커뮤니티 버전 설치1.1. 다운로드, 설치MongoDB: 애플리케이션 데이터 플랫폼 MongoDB: 개발자 데이터 플랫폼업계 최고의 최신 데이터베이스를 토대로 구축된 개발자 데이터 플랫폼을 사용해 아이디어를 더욱 빠르게 실현하세요. 공통 쿼리 인터페이스와 개발자들이 원하는 데이터 모델을 사용하는 동www.mongodb.com    제품 > 커뮤니티 에디션 클릭 Select package 클릭  다운로드 mongodb-macos-aarch64-7.0.6.tgz 파일을 압축 해제하면 MongoDB 설치가 된 것이다  1.2. 기본 세팅적절한 위치에 다음 폴더들을 생성한다mongodbmongodb/data : mongodb 인스턴스가 데이터를 저장시킬 위치mongodb/log : mongo..

Back-End/MongoDB 2024.05.31

[Java] JavaFX WebView에서 Axios, fetch 사용시 서버로 Body를 전달하지 못하는 문제

1. Trouble Java8의 JVM 환경에서 동작하는 JavaFX의 WebView에서는 Axios, fetch, Ajax 등의 기능을 제한적으로만 사용할 수 있어 Http Body를 넣을 수 없다 2. Root cause JavaFX의 WebView에서 제공하는 javascript 런타임 엔진은 JVM에 있다. 그리고 java 8버전의 javascript 런타임 엔진은 'Nashorn'이다. 문제는, Nashorn은 순수한 ES5.1 스펙(ECMAScript)을 구현한 순수 javascript 엔진이라는 점이다. 그렇기 때문에 Axios (ES6에 도입된 Promise 기반), fetch (ES6부터 내장 라이브러리), Ajax(XMLHttpRequest 기반이며 순수 javascript가 아님) 셋..

Back-End/Java 2023.03.28

[Java] lombok의 @Builder 사용시 필수 필드를 입력하게 하는 방법

Lombok의 @Builder를 사용해 빌더 패턴을 구현할 때, 특정 필드를 반드시 입력하도록 하는 필수 필드로 만들 수 있다. 방법1. @NonNull 애너테이션 사용하기 import lombok.Builder; import lombok.NonNull; @Builder public class Person { @NonNull private String name; @NonNull private Integer age; private String address; } 위의 코드에서 name과 age 필드는 @NonNull 애너테이션이 붙어 있기 때문에 필수 필드가 된다 따라서 Person.builder()를 호출할 때 이러한 필드를 지정하지 않으면 컴파일 오류가 발생함 Person.builder() .addre..

Back-End/Java 2023.03.14

[Kafka] 기초3 - 컨슈머 기본 동작과 예시

❑ 컨슈머의 기본 동작 컨슈머는 프로듀서가 카프카의 토픽으로 전송한 메시지를 가져오는 역할을 한다. 단순히 메시지만 가져오는 것으로 보일 수 있으나, 내부적으로는 컨슈머 그룹, 리밸런싱 등의 동작을 수행한다. 컨슈머 그룹(Consumer Group) 컨슈머 그룹은 하나 이상의 컨슈머들이 모여 있는 그룹을 의미하고, 컨슈머는 반드시 컨슈머 그룹에 속하게 된다. 그룹 내의 컨슈머들은 서로의 정보를 공유한다. 예를 들어, 특정 컨슈머에 문제가 생겨 종료된다면, 그룹 내 다른 컨슈머가 대신해 토픽의 파티션을 컨슘한다. 컨슈머 그룹은 파티션의 리더에게 토픽에 저장된 메시지를 가져오기 위한 요청을 보낸다. 필수는 아니지만, 파티션 수와 한 그룹 안의 컨슈머 수는 1:1 매핑이 이상적이다. 단, '파티션 수 < 컨슈..

Back-End/Kafka 2022.08.23

[Kafka] 기초2 - 프로듀서 기본 동작과 예시

❑ 프로듀서 디자인 프로듀서는 카프카의 토픽으로 메시지를 전송하는 역할을 담당한다. 프로듀서를 설정할 수 있는 여러가지 옵션이 있으므로 원하는 조건으로 메시지를 보내기 위해선 옵션을 적절히 사용할 수 있어야한다. 레코드(ProducerRecord) 레코드는 카프카로 전송하기 위한 실제 데이터이며, 토픽(Topic), 파티션(Partition), 키(Key), 밸류(Value)으로 구성된다. 토픽과 밸류(메시지 내용)는 필수 값이다. 파티션(특정 파티션을 지정), 키(특정 파티션에 레코드를 정렬)은 선택 옵션이다. 시리얼라이저(Serializer) 레코드의 키와 밸류를 Byte Array로 변환시킨다. 파티셔너(Partitioner) 레코드들은 프로듀서의 send() 메시지를 통해 시리얼라이저와 파티셔너를..

Back-End/Kafka 2022.08.11

[Kafka] 기초1 - 기본 구성과 핵심 개념(토픽, 파티션, 리플리케이션 등)

❑ 카프카 구성 Overview 구성 요소 설명 주키퍼(Zookeeper) 코디네이터 역할을 하는 아파치 프로젝트 애플리케이션. 카프카의 정상 동작을 보장하기 위해 메타데이터(metadata)를 관리하고 브로커의 상태 점검(Health check)을 한다. 카프카(또는 카프카 클러스터) 여러 개의 브로커를 구성한 클러스터를 의미 브로커(Broker) 카프카가 설치된 서버 또는 노드 프로듀서(Producer) 카프카로 메시지를 보내는 역할을 하는 클라이언트를 총칭 컨슈머(Consumer) 카프카에서 메시지를 꺼내가는 역할을 하는 클라이언트를 총칭 토픽(Topic) 카프카는 메시지 피드들을 토픽으로 구분하고, 각 토픽의 이름은 카프카 내에서 고유함 파티션(Partition) 병렬 처리 및 고성능을 얻기 위해..

Back-End/Kafka 2022.08.09

[JPA] EntityManager의 flush와 @Transactional

❑ 플러시(flush) 1. 플러시의 개념 플러시는 영속성 컨텍스트의 변경 내용을 DB에 반영한다 플러시라는 이름으로 인해 영속성 컨텍스트에 보관된 엔티티를 지운다고 생각하면 안된다. 영속성 컨텍스트의 변경 내용을 DB에 동기화하는 것이 플러시다. [참고] Clear 플러시를 하면 영속성 컨텍스트의 변경 내용을 DB에 반영(동기화)한다. 하지만 여전히 영속성 컨텍스트 내에는 기존에 보관된 엔티티 등의 정보가 캐시로 남아있다 Clear는 영속성 컨텍스트의 캐시를 전부 제거하는 역할을 해준다. 2. 플러시를 실행할 경우 구체적인 동작 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해 수정된 엔티티를 찾는다. 수정된 엔티티는 수정 쿼리를 만들어 쓰기 지연 SQL저장소에 등록한다 쓰기 지연 SQL 저장소의 ..

Back-End/JPA 2022.04.20

[Java] Java Array와 Hash의 데이터 접근/삽입 속도 비교

1. 서론Codility Lesson4. MissingInteger 문제를 풀면서 Hash와 Array간 데이터 접근/삽입 속도의 차이를 크게 체감할 수 있었다. 해당 문제에서 array로 접근하기엔 size를 100만개로 줘야 했기에 사이즈가 좀 크지 않은가 하는 생각에 Hash, Priorty Queue로 접근했는데 아무리 머리를 굴려봐도 Time Out이 났다. 그래서..! 메모리 제한도 없고, 그냥 배열로 풀라는 뜻인가 해서 배열로 풀었더니 바로 Pass. 도대체 Hash와 Array간 속도 차이가 얼마나 나길래 이런것인가 싶어서 직접 테스트해봤다. 2. 테스트 개요 array, HashMap, ConcurrentHashMap 세 가지에 대해 데이터 삽입/접근을 테스트한다 데이터 삽입(Add El..

Back-End/Java 2022.03.06

[Java] JUnit5 기본 Annotation

1. @Test 테스트 메서드임을 나타내는 어노테이션. 테스트 하려는 메서드에 붙여서 사용할 수 있다. public class MyTestClass { @Test void myTest1() { System.out.println("myTest1"); } } 2. @BeforeAll, @AfterAll: 생명주기 어노테이션 2.1. @BeforeAll 클래스가 실행되기 전 한 번만 실행되는 메서드 2.2. @AfterAll 클래스의 모든 테스트 메서드가 실행된 후 한 번만 실행되는 메서드 2.3. @BeforeEach 클래스의 각 테스트 메서드가 실행되기 전 매번 실행되는 메서드 2.4. @AfterEach 클래스의 각 테스트 메서드가 실행된 후 매번 실행되는 메서드 @Test 여러개 있을 때 Before/..

Back-End/Java 2022.03.03