반응형

이번에는 몽고DB에서 데이터 조회를 해볼 것이다.

find는 RDB(MySQL과 같은...)에서의 SELECT 같은 역할을 한다.

find에도 옵션이 상당히 많기 때문에 여기서는 최소한의 기능을 알아볼 예정이다.

일단 find를 사용하기 전에 임시로 아래와 같이 데이타를 등록해놓았다.

 

db.temps.insert({name: '홍길동', age: 20, gender: '남'});
db.temps.insert({name: '최길동', age: 21, gender: '남'});
db.temps.insert({name: '김길동', age: 22, gender: '여'});
db.temps.insert({name: '윤길동', age: 23, gender: '여'});
db.temps.insert({name: '박길동', age: 24, gender: '남'});
db.temps.insert({name: '고길동', age: 25, gender: '남'});
db.temps.insert({name: '모길동', age: 26, gender: '여'});
db.temps.insert({name: '공길동', age: 27, gender: '남'});
db.temps.insert({name: '구길동', age: 28, gender: '남'});
db.temps.insert({name: '정길동', age: 29, gender: '남'});
db.temps.insert({name: '서길동', age: 30, gender: '남'});

 

위와 같이 데이타 삽입을 하고 아주 간단하게 다음과 같이 조회해볼 수 있다.

 

temps 컬렉션의 모든 항목이 표시된다.

MySQL로 예를 들면 'SELECT * FROM temps' 와 같은 명령과 동일하다고 보면 된다.

그리고 위의 경우 데이타가 깔끔하게 보여지지만 필드가 많아질 수록 제대로 정렬이 안되어서 보기 불편할 수가 있다. 그럴 때는 아래와 같이 find() 뒤에 .pretty()를 붙여주면 다음과 같이 데이터를 더 정리된 형태로 볼 수 있다.

 

이와 같이 잘 정렬되어 보여진다.

이제 다음으로는 기본적인 조건 옵션을 붙여보도록 할 것이다.(MySQL의 WHERE절과 같은)

 

도큐먼트 조회시 조건 걸기

이름이 '김길동'인 사람을 조회해보도록 하겠다.

db.temps.find({name: '김길동'});

위와 같이 단순하다. find() 명령안에 { } 중괄호로 원하는 조건을 감싸주기만 하면 된다.

 

만약 조건을 더 붙이고 싶다면 콤마(,)로 구분하여 뒤에 연결시켜주면 된다.

db.temps.find({name: '김길동', age: 22});

예를 들어, 위와 같은 명령이라면 name이 김길동이고 age가 22인 도큐먼트를 가져오게 된다.

 

도큐먼트 조회시 숫자를 비교하는 조건 걸기

조회할 경우 특정 데이타와 완전히 동일한지만 비교할 수도 있지만, 위의 데이타로 예를 들면 20~25세의 도큐먼트만

가져오는 등의 숫자 비교 조건을 걸 수도 있다.

 

MySQL의 경우 'SELECT * FROM temps WHERE age >= 20 AND age <= 25' 이런 형태로 단순하게 부호를 이용해서

비교가 가능하지만 MongoDB에서는 용법이 조금 다르다.

MongoDB에서는 다음과 같이 사용할 수 있다.

 

db.temps.find({age: {$gte: 20, $lte: 25}});

이와 같이 조건이 적용된 것을 확인할 수 있다.

위 명령을 분석해보면 $gte, $lte 라는 것들을 연산자(operator)라고 한다.

기본적으로 필드가 앞에 있고 필드 뒤에 연산자를 중괄호{}로 감싸서 사용하게 된다.

 

$gte는 greater than or equals이란 의미로 '같거나 크면'이라는 조건의 의미를 갖는다.

$lte는 less than or equals이란 의미로 '같거나 작으면'이라는 조건의 의미를 갖는다.

이외에 다양한 연산자가 존재한다.

 

$gt : 주어진 값보다 큰 경우

$lt : 주어진 값보다 작은 경우

$eq : 주어진 값과 일치하는 경우

$ne : 주어진 값과 일치하지 않는 경우

$in : 주어진 배열 안에 속하는 값

$nin : 주어진 배열 안에 속하지 않는 값

 

위는 비교 연산자이고, 그 외에 논리 연산자, 문자열 연산자 등 다양한 연산자가 따로 존재한다. 

그것은 각 연산자 사용시에 다시 알아보도록 하겠다.

 

도큐먼트 조회시 정렬하기

가져온 데이타들을 소팅할 수 있는 방법을 알아볼 것이다.

위에서 insert한 데이타들을 기준으로 age 필드의 데이타를 내림차순으로 정렬해보려 한다.

db.temps.find().sort({age: -1});

아주 간단하게 정렬이 되었다.

find()뒤에 sort()명령을 붙여줄 수 있고 중괄호 안에 원하는 정렬 기준을 지정해주면 된다.

age: -1는 age 필드를 내림차순으로 정렬한다는 의미이다.

-1은 내림차순이지만 오름차순으로 정렬하고 싶다면 {age: 1}과 같은 형태로 사용하면 된다.

이 때 .sort() 명령 뒤에 .pretty()를 붙여서 더 정리된 형태로 표시할 수도 있다.

 

도큐먼트 조회시 특정 개수만 표시하기, 특정 위치의 데이타 가져오기

데이타 수량이 너무 많거나 페이지네이션 구현 등을 위해 특정 개수만 표시하고 싶을 때가 있다.

이 때는 .limit()이라는 명령을 사용할 수 있다.

 

db.temps.find().limit(1);

이와 같이 가져올 데이타의 상위 1개의 데이타만 가져오게 된다.

페이지네이션 구현을 위해 많이 사용하게 된다. 페이지네이션 구현시에는 특정 개수만 가져오는 것도 필요하지만,

특정 위치의 도큐먼트를 가져오는 것도 필요하다.

이 때는 .skip()이라는 명령을 사용할 수 있다.

 

db.temps.find().skip(2).limit(2);

조회할 데이타의 2개 뒤의 데이타들 중 2개만 가져오는 명령이다.

이를 통해서 페이지네이션을 구현할 수 있다.

 

여기까지 find의 기본적인 내용들을 다루어보았고, 다음에는 여기서 설명하지 않았던 다른 연산자들에 대해서도

알아보려 한다.

반응형
반응형
defaultConfig {
    // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
    applicationId "com.test.abcd"
    minSdkVersion flutter.minSdkVersion
    targetSdkVersion flutter.targetSdkVersion
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
}

 

위 코드에서 보다시피 각 속성들이 참조로만 지정되어 있다.

Flutter 2.8 전에는 직접 입력되어져 있었으나 2.8 이후부터는 위처럼 참조 형태로 바뀌게 되었다.

 

기본 값은 무엇으로 되어있는지 확인하기 위해 검색을 해보았다.

위와 같이 검색해보았으나, 참조되어있는 부분 빼고는 원 출처가 어디인지 나오지 않았다.

그 이유는 프로젝트 내에 해당 정보가 있지 않고 플러터 SDK 경로안의 gradle 파일을 참조하기 때문이다.

 

해당 파일의 위치는 아래와 같다.

플러터 경로가 C:\flutter라고 가정할 경우 C:\flutter\packages\flutter_tools\gradle\flutter.gradle 파일안에 해당 정보가 있다.

 

파일을 열어보면 위와 같이 선언되어 있는 것을 확인할 수 있다.

굳이 왜 저렇게 했을까 싶다. 플러터 버전을 업그레이드하면서 자기 마음대로 해당 Sdk버전을 변경해버릴 수 있기 때문에, 나의 경우는 위 선언 내용을 그대로 사용하지 않는다.

 

applicationId "com.test.abcd"
minSdkVersion 16
targetSdkVersion 31
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName

위와 같이 숫자를 직접 대입해서 쓰는 것도 간편하고 나쁘지 않은 방법이라고 본다. (기존의 방법)

하지만 나는 현재 아래처럼 사용하고 있다.

def flutterCompileSdkVersion = localProperties.getProperty('flutter.flutterCompileSdkVersion')
if (flutterCompileSdkVersion == null) {
    flutterCompileSdkVersion = '31'
}

def flutterMinSdkVersion = localProperties.getProperty('flutter.flutterMinSdkVersion')
if (flutterMinSdkVersion == null) {
    flutterMinSdkVersion = '16'
}

def flutterTargetSdkVersion = localProperties.getProperty('flutter.flutterTargetSdkVersion')
if (flutterTargetSdkVersion == null) {
    flutterTargetSdkVersion = '31'
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
    compileSdkVersion flutterCompileSdkVersion.toInteger()

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.test.abcd"
        minSdkVersion flutterMinSdkVersion.toInteger()
        targetSdkVersion flutterTargetSdkVersion.toInteger()
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
        }
    }
}

flutterVersionCode, flutterVersionName은 local.properties를 참조하는 형태로 되어있었는데,

compileSdkVersion, minSdkVersion, targetSdkVersion 또한 그렇게 참조하는 형태로 바꿔버리는 것이다.

sdk.dir=C:\\Users\\Master\\AppData\\Local\\Android\\sdk
flutter.sdk=C:\\flutter
flutter.buildMode=debug
flutter.versionName=1.0.0
flutter.versionCode=1
flutter.flutterCompileSdkVersion=31
flutter.flutterMinSdkVersion=16
flutter.flutterTargetSdkVersion=31

그리고 local.properties 파일을 위와 같이 수정해주면 좀 더 깔끔한 형태로 sdk 버전을 관리할 수 있게 된다.

 

반응형
반응형

 

이더리움 주소와 개인 키(Private Key)의 조합을 계정(account)이라고 한다.

이더리움 계정은 이더리움 잔고를 보유하고 트랜잭션을 전송할 수 있다.

 

이더리움에는 아래와 같이 2가지 유형의 계정이 존재한다.

 

​외부 소유 계정(Externally Owned Accounts)

공개 이더리움 주소와 개인키 조합을 의미하는데 쉽게 말해 지갑 주소라고 보면 된다.

이것을 이용하여 다른 계정과 이더리움을 송수신하고 스마트 컨트랙트에 트랜잭션을 보낼 수 있다.

메타마스크, 카이카스에서 만든 계정이 EOA라고 보면 된다.

 

컨트랙트 계정(Contract Accounts)

컨트랙트 계정은 외부 소유 계정과 다르게 개인키가 존재하지 않고, 스마트 컨트랙트를 블록체인에 배포할 때 생성된다.

컨트랙트 계정 대신 컨트랙트로만 표시하기도 한다.

이 컨트랙트 계정은 다른 계정과 이더를 송수신하는 기능을 하며, 이것은 EOA와 동일하다.

또 이 컨트랙트 계정에는 코드를 담고 있는데 흔히 스마트 컨트랙트라고 한다.

EOA나 다른 컨트랙트의 호출을 받아서 트랜잭션을 발생시키며, 스스로 동작하지는 않는다.

스마트 컨트랙트에 접근하기 위한 주소가 곧 컨트랙트 계정을 의미한다.

 

반응형

+ Recent posts