반응형
  • 삼항연산자
    • 조건 ?  A : B
    • 조건에 만족하면 A를 리턴하고 만족하지 못하면 B를 리턴
  • 이중물음표(??)
    • A ?? B
    • A의 값이 null 이면 B를 리턴하고 null이 아니면 A를 리턴
  •  변수 A == null ? B : A 라는 삼항연산자를 사용하여 null 여부를 체크하는 경우라면   A ?? B 라고 이중 물음표 표현식을 사용하면 간소화 할 수 있음
  • null 체크가 아니라면 삼항 연산자를 사용하면 됨
728x90
반응형
반응형
  • 데이터 베이스에서 조회한 데이터를 opencsv를 사용하여 csv파일로 저장하는 코드
val writer: FileWriter = FileWriter("output.csv")
val strategy: CustomMappingStrategy<ReportDTO> = CustomMappingStrategy<ReportDTO>()
strategy.type = ReportDTO::class.java

val beanToCsv: StatefulBeanToCsv<ReportDTO> =
    StatefulBeanToCsvBuilder<ReportTravelDTO>(writer)
        .withMappingStrategy(strategy)
        .build()

beanToCsv.write(travelDataList)
writer.close()

해당 코드 결과는 이렇게 나온다.

"seq","gender","region2"
"296","1",""

하지만 원하는 형태는 데이터가 있는 경우에는 큰따옴표를 제거하고 null이거나 데이터 내부에 콤마(,)가 들어있는 경우에 한해서만 큰따옴표로 묶는것이기에 다른 방법이 필요했음.

opencsv에서 제공하는건 withApplyQuotesToAll(false) 옵션으로 설정했을때 내용에 콤마가 있는경우는 큰따옴표로 묶어주지만 공백일 경우에는 묶어주지 않는다.

원하는 조건을 만족시키려면 결국 CSVWriter를 상속받아서 stringContainsSpecialCharacters를  overriding 해야 함.

import com.opencsv.CSVWriter
import java.io.Writer

class CustomCsvWriter(writer: Writer?) : CSVWriter(writer) {

    override fun stringContainsSpecialCharacters(line: String): Boolean {
        var result: Boolean = false

        if (line.isEmpty()) result = true
        if (line.contains(',')) result = true
        return result
    }
}

내가 원하는 조건에 true값을 주고 실제 csv를 만드는 코드에서 withApplyQuotesToAll(false)를 설정해야 커스텀 한 결과가 반영된다.

 

val writer: FileWriter = FileWriter("파일.csv", Charset.forName("utf-8"))  
val strategy: CustomMappingStrategy<ReportDTO> = 
	CustomMappingStrategy<ReportDTO>()
    
strategy.type = ReportDTO::class.java

val beanToCsv: StatefulBeanToCsv<ReportDTO> =
    StatefulBeanToCsvBuilder<ReportTravelDTO>(CustomCsvWriter(writer))
        .withMappingStrategy(strategy)
        .withSeparator(CSVWriter.DEFAULT_SEPARATOR)
        .withApplyQuotesToAll(false)
        .build()

beanToCsv.write(DataList)
writer.close()

커스텀한 CsvWriter를 적용한 코드의 결과는

seq,gender,region2
296,1,""

원하는 구조로 바뀐걸 확인 할 수 있다.

 

728x90
반응형
반응형
  • GetX 를 사용하여 페이지 전환
    • Get.toNamed('호출 페이지')를 사용하면 호출 페이지로 화면이 전환되어 짐
    • ex) Get.toNamed('/event')
    • Navigator.of(context).pushNamed('호출 페이지)')를 사용해도 동일한 결과를 얻을 수 있음
  • toNamed사용시 arguments 전달
    • Navigator를 사용하는 경우 다소 복잡한 절차가 필요함
    • 일단 빠르게 만들기 위해 GetX의 기능을 사용하기로 함
    • Get.toNamed('/event', arguments: {'choice': 'codeA'})와 같은 형태로 호출하면 됨
  • /event페이지에서 arguments사용
    • Navigator를 사용할 경우와 다르게 arguments를 받기 위한 생성자나 변수가 필요하지 않음
    • 해당 페이지내에서 arguments를 사용하고자 하는 위치에서 Get.arguments['choice'] 사용하면 'codeA'를 리턴해줌

샘플 소스

//event_main page
eventEnter(int index) async {
    final result = await Get.toNamed('event_enter', arguments: {'choiceCode' : index == 0 ? 'a' : 'b' });
    if (result == true) {
      setState(() {
        .....;
      });
    }
  }
  
  
  // event_enter page
  class EventEnterView extends StatelessWidget {
  	const EventEnterView({Key? key}) : super(key: key);

  	@override
  	Widget build(BuildContext context) {
    	return Container(
        	.
            .
            .
            child: ElevatedButton(
              onPressed: () async {
                Map<String, dynamic> data = {
                  'choice': Get.arguments['choiceCode'],
					.
                    .
                    .
                };
              }
            .
            .
            .
        );
    }

 

 

 

728x90
반응형
반응형

namespace는 서버의 영역으로 client api를 제공하지 않으므로 서버에 직접 환경설정을 해야함

  • 기본 설정방법
    • 터미널에서 /etc/aerospike/aerospike.conf 설정파일을 연다.
    • 파일 내용 하단부에  aerospike 설치시 기본으로 생성되는  namespace 항목을  참고 하여 원하는 이름의 namespace로 작성하면 된다
# Aerospike database configuration file. 
 
# This stanza must come first. 
service { 
        user root 
        group root 
        paxos-single-replica-limit 1 # Number of nodes where the replica count is automatically reduced to 1. 
        pidfile /var/run/aerospike/asd.pid 
#       service-threads 2 # cpu x 5 in 4.7  
#       transaction-queues 2 # obsolete in 4.7  
#       transaction-threads-per-queue 4 # obsolete in 4.7 
        proto-fd-max 15000 
} 
.
.
.
.

namespace test { 
        replication-factor 2 
        memory-size 1G 
        default-ttl 30d # 5 days, use 0 to never expire/evict. 
        nsup-period 120 
        #       storage-engine memory 
 
        # To use file storage backing, comment out the line above and use the 
        # following lines instead. 
 
        storage-engine device { 
                file /opt/aerospike/data/test.dat 
                filesize 4G 
                data-in-memory true # Store data in memory in addition to file. 
        } 
} 

namespace 신규namespace {
      설정값
      .
      .
      .
}
  • Docker container를 사용하는 경우 설정방법
    • https://docs.aerospike.com/operations/configure (aerospike 공식사이트) 에 config example이 있으나 세부 설정에 대한 값은 본인이 커스텀해야함
    • aerospike docker container 실행한 후 내부로 접속하여 기본설정 방법에 나와있는 파일내용을 복사해둠
    • aerospike container 내부로 접속
    • /etc/aerospike/aerospike.conf 파일을 열어 내용 복사
    • container에서 나온 후 기존 aerospike container 정지 후 삭제
    • aerospike container를 실행할 서버 내부에 새로운 config 파일 생성 - /opt/aerospike/etc/aerospike.conf 파일을 만들고 내부에 b.iv에서 복사한 내용을 넣은 후 추가하려는 namespace 설정을 작성한다.
    • 새로운 aerospike conatiner 실행할때 /opt/aerospike/etc/aerospike.conf  파일을 바라보도록 하면 됨
# aerospike docker container 실행
# aerospike:ce는 커뮤니티 버전, ee는 엔터프라이즈 버전
$ docker run -d --name aerospike -p 3000-3002:3000-3002 aerospike:ce-[version]

# aerospike container 내부로 접속
$ docker exec -it aerospike bash

# conf 파일 열어서 복사
$ vi /etc/aerospike/aerospike.conf

# 실행했던 docker container 정지
$ docker stop aerospike

# 정지한 container 삭제
$ docker rm {container id}

# 새로운 conf 작성 - 복사해둔 내용 넣고 namespace추가
$ vi /opt/aerospike/etc/aerospike.conf 

# 외부 conf파일을 바라보는 새로운 aerospike container 실행
$ docker run -d -v /opt/aerospike/etc/:/opt/aerospike/etc/ --name aerospike -p 3000-3002:3000-3002 aerospike/aerospike-server --config-file /opt/aerospike/etc/aerospike.conf
  • docker를 사용하는 경우 외부에 파일을 두지 않으면 컨테이너를 정지하고 재실행시 설정값이 기본설정값으로 복구되는 이슈가 있어 복잡하지만 위에 방법과 같이 처리함.
728x90
반응형
반응형

Docker를 사용하여 필요한 container를 실행할때 종종 특정 문제로 자동 종료되는 문제가 발생한다.

 

어제 설정하던 aerospike에서 발생한 문제로 예를 들어보겠다.

$ sudo docker run -d -v /opt/aerospike/etc/:/opt/aerospike/etc/ --name aerospike -p 3000-3002:3000-3002 aerospike:ce-5.7.0.11 --config-file /opt/aerospike/etc/aerospike.conf
c9f7eb263df0b0d0854df535f6dcb70251b3730696629618a4802b8e047daec9
$ sudo docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED      STATUS      PORTS                                                                                                                                                 NAMES
3efd82760b2c   rabbitmq:management   "docker-entrypoint.s…"   3 days ago   Up 3 days   4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp   rabbitmq

위 내용은 서버 콘솔에 접속하여 aerospike container를 실행하고 실행된 컨테이너를 확인한 것이다.

aerospike가 리스트에 없는것을 확인할 수 있는데 그런경우 -a 옵션을 주면 모든 컨테이너 리스트를 확인 할 수 있다.

$ sudo docker ps -a
CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS                      PORTS                                                                                                                                                 NAMES
c9f7eb263df0   aerospike:ce-5.7.0.11       "/usr/bin/dumb-init …"   13 seconds ago   Exited (1) 12 seconds ago                                                                                                                                                         aerospike
3efd82760b2c   rabbitmq:management         "docker-entrypoint.s…"   3 days ago       Up 3 days                   4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp   rabbitmq
f7f362458893   aerospike/amc               "/opt/amc/amc ' -con…"   7 days ago       Exited (2) 5 days ago                                                                                                                                                             aerospike-console
78a6c3b31e60   aerospike/aerospike-tools   "wrapper aql -h"         7 days ago       Exited (255) 7 days ago                                                                                                                                                           dazzling_wright

결과의 첫번째 항목이 실행하고자 하였던 container로 상태를 보면 Exited (1) 로 되어 있는것을 확인할 수 있다.

Exited (1)코드를 찾아보면 응용프로그램 오류로 인한 실패라고 한다. (다른 의견도 있으나 위의 경우와 가장 근접한 답인듯 함)

코드의 의미는 알았으나 정확한 원인은 알 수가 없다.

이런 경우 docker logs {container id} 명령어를 사용하면 컨테이너를 실행하면 발생한 오류 로그를 볼 수가 있다.

$ sudo docker logs c9f7eb263df0
link eth0 state up
link eth0 state up in 0
Mar 21 2022 09:20:06 GMT: CRITICAL (config): (cfg.c:2093) couldn't open configuration file /opt/aerospike/etc/aerospike.conf: No such file or directory
Mar 21 2022 09:20:06 GMT: WARNING (as): (signal.c:166) SIGINT received, shutting down Aerospike Community Edition build 5.7.0.11 os debian10
Mar 21 2022 09:20:06 GMT: WARNING (as): (signal.c:169) startup was not complete, exiting immediately

configuration 파일에 문제가 있어 실행이 되지 않았음을 알 수 있다.

내용을 수정하고 다시 시작하니 문제 없이 잘 동작 하였다.

 

 

728x90
반응형

+ Recent posts