전체 글 477

유튜브 시작 - 개발블로그와 개발유튜브채널을 같이하게 되었습니다

안녕하세요. 원영's블로그를 운영하는 최원영입니다. 지난 2017년 2월 20일 "[Effective Java]생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라." 라는 글을 처음 작성한 이후로 2년 6개월동안 총 225개의 개발 포스팅을 작성하였습니다. 첫 포스팅 : https://blog.voidmainvoid.net/2 [Effective Java]생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라. 규칙 2 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라. Builder pattern은 객체에서 생성자에 들어갈 파라미터가 많든 적든 차례차례 파라미터를 받아들이고 모든 파라미터를 받은 뒤에 이 변수들을 통.. blog.voidmainvoid.net 내가 배우고 공부하..

일상 2019.08.12
Telegraf에서 system metric 수집하여 elasticsearch에 적재하기

Telegraf는 influxdata(사)에서 opensource로 제공하는 plugin 기반의 metric수집 server agent이다. github url : https://github.com/influxdata/telegraf telegraf의 역할이 이해하기 어렵게 느껴질 수 있는데, 간단히 말하자면 아래와 같이 input, process, output이 가능하다. Telegraf로 할 수 있는 일 System의 ram, cpu수치를 elasticsearch에 적재 Redis의 data를 elasticsearch에 적재 File log를 influxdb에 적재 즉, input plugin으로 뽑아낸 데이터를 output plugin이 지원하는 곳으로 보낼 수 있다. System metric을 e..

DevOps 2019.08.09
Intellij에서 줄바꿈 간격 화면에 맞게 custom 조정하기 꿀팁

Intellij를 사용하여 개발을 하다보면 code가 너무 길어서 가로스크롤(horizontal scroll)을 해야할 때가 있는데 이때 스트레스가 이만저만이 아니다. 이때 줄바꿈 간격을 화면에 맞게 줄인다면 한눈에(혹은 한 스크린에) 코드를 볼 수있고 줄간격도 조절된다. 문제점 아래는 github에 올라가 있는 kafka source 중 ConsumerConfig.java file의 code인데 너무 길어서 가로 스크롤이 생긴 것이 보인다. 해결방법 Intellij → cmd + , → search 'hard wrap' → change value hard wrap 셋팅이 완료되면 cmd + option + l (macOS 기준)을 눌러 자동 줄바꿈을 실행한다.

개발이야기 2019.08.08
Python으로 elasticsearch에 document 넣기 예제 및 결과물

개요 Elasticsearch과 kibana를 통해 document를 저장하고 시각화 할 수 있다. Elasticsearch에 document를 넣기 위해 여러 언어를 사용할 수 있지만 python을 사용하면 한결 간단한 코드로 작성이 가능하다. Elasticsearch Client List는 아래와 같다. - Java REST Client [7.3] - Java API [7.3] - JavaScript API [7.x] - Ruby API [7.x] - Go API .NET API [7.x] - PHP API [7.0] - Perl API - Python API - Community Contributed Clients 출처 > https://www.elastic.co/guide/en/elasticsea..

Kafka burrow http endpoint 정리

이전 포스팅에서 Kafka burrow의 정보와 lag을 평가하는 방법에 대해 알아보았다. Burrow 개요 및 설명 : https://blog.voidmainvoid.net/243 Burrow에서 lag을 정의(평가)하는 방법 : https://blog.voidmainvoid.net/244 이번 포스팅에서는 Burrow에서 제공하는 http endpoint를 알아보고 각 topic별 offset, lag등의 정보를 가져오는 예제를 알아보고자 한다. Burrow Endpoint Burrow의 http server는 kafka, zookeeper의 정보를 효과적으로 가져올 수 있다. 모든 요청은 간단한 HTTP call로 요청되며(대부분 GET request) response는 JSON기반이다. Healt..

빅데이터/Kafka 2019.08.02
Kafka Burrow에서 consumer의 lag을 정의하는(평가하는) 방법 - Consumer Lag Evaluation Rules

이전 포스팅(https://blog.voidmainvoid.net/243)에서 Burrow가 나오게된 배경에 대해 알아보았다. 이 포스팅에서는 burrow가 lag의 상태에 따라 상태를 정의하는 방법에 대해 알아보자. Consumer Lag Evaluation Rules Burrow에 있는 consumer group의 상태는 group이 consume하고 있는 각 partitin에 대한 offset의 규칙에 따라 결정된다. 분리된 threshold를 정하지 않더라도 이 kafka consumer들이 '정상'적으로 작동중인지, '비정상'적으로 작동중인지 판단 할 수 있다. consumer group이 consume하는 모든 파티션에 대해 평가를 함으로서 consumer group이 정상적으로 consume..

빅데이터/Kafka 2019.08.02
Burrow - kafka consumer의 지연(lag)을 모니터링할 수 있는 효과적인 opensource tool

Burrow github : https://github.com/linkedin/Burrow Burrow는 Kafka를 개발한 Linkedin에서 만든 consumer lag monitoring tool이며, opensource로 운영되고 있다. 각 consumer는 특정 topic에 대해 고유의 groupId를 가지고 consuming을 하는데, consume이 잘 되고 있는지 모니터링이 필요하다. Burrow가 나오게된 배경 기존 Kafka client의 consumer의 metrics() method를 사용하여 lag metric(records-lag-max)을 기록할수 있지만, 이는 가장 뒤처진 파티션의 현재 지연을 보여주므로 다른 파티션에서의 정상작동을 잘 감지하기가 어렵다. 또한, consume..

빅데이터/Kafka 2019.08.02
자전거를 구입하지 않고 카카오T바이크를 타는 5가지 이유

19년 3월 9일 카카오T바이크(이하 카카오바이크)를 처음 탄 이후 20번이 넘게 자전거를 이용했고 더 이상 나의 생활과 카카오바이크는 땔수없는 필수적인 요소로 자리잡았다. 올해 초 저렇게 허접한 노랑 검정색의 자전거를 누가 탈까 생각 했던 나였지만, 이제 카카오바이크에 누구보다 빠르게 달려가서 QR코드를 찍고 탑승하는 나의 모습을 보면 사람이 이렇게 바뀔 수 있구나 생각도 든다. 판교, 분당 근처가 주 생활권인 나에게로서는 버스나 택시보다 더 나은선택으로 다가올것이라고는 최초탑승 전에는 알지 못했다. 탑승 횟수가 1번, 10번, 20번이 넘어가면서 왜 카카오모빌리티가 막대한 resource(자전거 유지보수, 구입비용, 서비스 비용 등)를 들여 이 서비스를 했는지 알것만도 같았다. 카카오모빌리티는 이 서..

일상 2019.07.28
NoSQL강의) mongoDB에서 data 모델링하는 방법. 예제포함.

MongoDB 주요 특징 Secondary Index ▪ 다른 NOSQL 보다 secondary index 기능이 발달되어 있음 샤드키 지정 ▪ _id : 키 필드 ▪ Shard Key _id - 대부분의 NOSQL은 Row Key = Shard Key 임 Document 기반 ▪ JSON Style의 Document : BSON(Binary JSON) Modelling 주요 적용 모델링 기법 ▪ 비정규화(Denormalization) ▪ 집합(Aggregation) 기타 mongoDB에 대한 정보 → https://blog.voidmainvoid.net/239 NoSQL강의) mongoDB 개요 및 설명 한페이지에 끝내기(mapReduce, aggregate 예제 포함) Humongous DB ▪ Do..

빅데이터/nosql 2019.07.25
NoSQL강의) 모델링 예제로 알아보는 Cassandra Query Language (CQL)

모델링 example 1 - Log 데이터 저장요구조건 - machine_id , log_time, log_text - machine 100EA, 1초당 로그 1건씩, 로그는 일반 텍스트 Case 1 : 별도의 PK를 부여한다면? CREATE TABLE log1 ( uid int, machine_id varchar, log_time timestamp, log_text varchar, PRIMARY KEY (uid) ); → 특정머신의 로그만 조회하는 것이 불가. 의미없는 모델. ▪ Log성 테이블은 Primary Key를 단일 값으로 설정하는 것이 힘들다. machine_id를 단일 primary key로 설정하면 machine_id가 Row Key가 되는데, 이 경우 시계열 데이터를 저장할 수 없게 된..

NoSQL강의) mongoDB 개요 및 설명 한페이지에 끝내기(mapReduce, aggregate 예제 포함)

Humongous DB ▪ Document DB : BSON(Binary JSON) ▪ Auto Sharding ▪ Replica Set ▪ Index : Geospatial(위치정보 처리 index), Hashed, Unique, Spars, Compound - Embedded Document, Array 필드도 인덱싱 가능 - 구체(Sphere) 모델 적용한 위치 데이터 인덱싱 지원 → 지구는 둥그니까.. - Full Text Search Index(한글 형태소 분석x), elasticsearch 사용을 권장 - Index를 사용한 TTL Collection ▪ Map/Reduce, Aggregation 기능 내장 - 대부분의 NOSQL은 자체 집계 기능을 제공하지 않음 ▪ GridFS : grid ..

빅데이터/nosql 2019.07.23
NoSQL강의) Document Database 개요 및 설명

Document Database란 Document를 저장하는 데이터베이스 ▪ XML, JSON, BSON - 계층적 트리 데이터 ▪ _id : PK, RowID - 사용자가 설정 가능 ▪ Embedded Document - 여러개의 테이블을 하나의 Document 내에 모아둘 수 있음 - 조회시 한번의 조회로 필요한 데이터 획득. Join 기능을 대체 대표 사례 ▪ Mongodb ▪ CoucbDB, CouchBase Hadoop, Spark와의 통합 지원 mongoDB기반 데이터를를 hive에서 집계, spark로 집계와 같은 기능. Document Database의 특징 Array와 Embedded Document을 잘활용하는 것이 핵심 - 컬럼 없음 → Schema 없음 - Document 내에 Fi..

빅데이터/nosql 2019.07.23
NoSQL강의) DynamoDB 개요, 특징 및 설명

Amazon DynamoDB 완전히 관리(Fully managed)되는 AWS 상의 NOSQL 데이터베이스. DynamoDB 장점 ▪ EC2 + DB Engine를 올리는 전통적인 방식이 아님. 사용량만 조절하면 자동으로 늘어나고 줄어든다. 사실상 DBA가 필요없는.. ▪ 대용량, 뛰어난 확장성, 신뢰성 ▪ 10ms 미만의 빠르고 일관된 성능 ▪ Key-Value Store(Hash 기반) ▪ 이벤트 기반의 프로그래밍 지원(with serverless function Lambda trigger) ▪ 용량제한 없는 Storage 테이블 구성 요소 Item하나 최대 크기 400kb Key는 2가지(partition key:필수 , sort key:선택). Data type ▪ Key-Value - Strin..

빅데이터/nosql 2019.07.23
NoSQL강의) HBase 개요, 특징, client 설명 + Apache Phoenix

HBase의 특징 Apache HBase – Apache HBase™ Home Welcome to Apache HBase™ Apache HBase™ is the Hadoop database, a distributed, scalable, big data store. Use Apache HBase™ when you need random, realtime read/write access to your Big Data. This project's goal is the hosting of very large tables -- billions hbase.apache.org HBase 저장 아키텍처 ▪ HMaster : HRegionServer의 모니터링을 담당 ▪ HRegionServer : 데이터를 분산저장하는 ..

빅데이터/nosql 2019.07.23
NoSQL강의) Cassandra 개요 및 설명

특징 Peer to Peer - Multi Master Model(Master-Slave 구조가 아님) - 새로운 노드의 추가를 통해 수평적 확장이 손쉬움 - DHT(Disgtributed Hash Table) 기반의 링 토폴로지 지원 - 데이터의 분산과 장애 극복 기능을 지원하기 위해 Cassandra는 Gossip Protocol을 사용한다. 이를 통해 다른 노드들에 대한 상태정보와 위치 정보를 매초마다 교환한다. - Gossip을 통해서 에러탐지를 수행한다. Gossip을 일정시간 주고 받지 않는 노드는 장애 노드로 판단된다. 장애 노드가 클러스터에 돌아오면 Hinted Hand Off로 복구를 우선 수행하게 된다. - Hinted Hand Off는 쓰기를 수행하고 복제할 때 복제 대상 노드가 장애..

NoSQL강의) Column Family Database 개요 및 설명

Column Family Database는 Row 단위 저장소 - Row Key : Row식별자. Row Key값순으로 자동 정렬됨. 검색시 사용되는 기본 키 - Column : 키-값 쌍. 하나의 Row에 수백만~수억개의 칼럼을 허용한다. 항상 Timestamp 값이 함께 저장됨. - Column의 값이 다시 여러개의 Column의 Map으로 구성되어 있으면 Column Family라고 부름. - Cassandra에서는 Super Column 이라는 용어를 씀. Cassandra HBase RDB keyspace 없음 Database column family table table row key row key PK(Primary Key) column name/key column name column na..

빅데이터/nosql 2019.07.22
NoSQL강의) Redis 개요, 기본사용법, command 설명 및 Jedis 예제

Redis Key/Value database, In memory database. Message Queue, Shared Memory Data store 용도로 사용. 다양한 데이터 타입(String, Set, List 등) 지원하며 셔버 shutdown/restart 될때를 대비하여 디스크 저장기능(RDB, AOF)을 가지고 있다. Scale out을 위한 application side sharding 지원하며 Master/Slave Replication을 지원. Instagram(수만개의 단순 Key-value pair저장), 네이버 라인, Blizzard 등에서 사용 사례가 있음. 데이터별 저장 구조 Redis 기본사용법 redis 서버 구동시 protected mode를 no로 하면 bind ip..

빅데이터/nosql 2019.07.22
NoSQL강의) Key-value Database 개요 및 설명

Key-value Database 개요 Key와 Value의 쌍으로 이루어진 저장소. Key가 이미 존재하는 경우 기존 값을 덮어쓴다. Value는 BLOB(Binary Large Object) 즉, 어떤 형식(type)이든 저장 가능. 특징 - 일관성 : Eventual Consistency - 트랜잭션 : 정족수 기반임. 정족수3이면 강한 consistency를 가짐 - 조회 : 키로만 조회 가능, 대부분 secondary index 지원하지 않음 - 데이터 구조 : BLOB, JSON, XML 무엇이든 저장 가능 - 확장성 : 대부분 샤딩을 이용한 확장. 샤드키 설정 중요. 샤드노드 + RF(Replication Factor) 조정 ☞ 일관성 vs 가용성 조절 사용하기 적합한 경우 ☞ 세션정보 저장..

빅데이터/nosql 2019.07.22
NoSQL강의) NoSQL 데이터 모델 종류 및 설명

NoSQL 데이터 모델 기존 RDBMS와는 다른 관점에서 바라봐야함. NOSQL 대부분은 ACID를 지원하지 않고 원자적 트랜잭션(Atomic Transaction)을 지원한다. 가능하다면 원자성이 필요한 범위를 하나의 집합 내로 한정하는 것이 바람직. 집합 지향적으로 모델링하게 되면 자연스럽게 데이터 중복이 발생한다. 데이터 중복을 허용함으로써, 애플리케이션에서의 쿼리 효율성에 집중하도록 설계해야함. Key-Value 모델 Key를 이용해 value에 접근하는 구조. 어떠한 형태(List, Set 등)의 데이터든 저장이 가능함. 각 DB별로 value의 최고 저장 size가 있으므로 이점을 유의. Key를 기반으로 정렬/비정렬 가능한점이 다름. Document 모델 집합 구조를 문서형태로 확인 가능. ..

빅데이터/nosql 2019.07.22
NoSQL강의) NoSQL 개요 및 기본이론

5가지 NoSQL에 대해 알아보자 - MongoDB - Redis - hBase - Cassandra - DynamoDB 등장배경 1) 대량의 데이터를 Read/Write 할 필요성 증가 2) 지속적으로 증가하는 사용자에 대한 신속한 증가 3) 빠르게 변화하는 비즈니스에 대한 신속한 대응 4) 비정형 데이터의 폭발적 증가 관계형 데이터베이스의 한계가 커짐. 데이터는 커져만 가는데, 관계형 데이터베이스로는 저장/관리 힘듦. scale out하기에 기존 RDB(Relational Data Base)는 많은 비용을 지불해야 함. NoSQL Not Only SQL은 비관계형 데이터 스토리지 시스템, 비정형 데이터베이스들을 통칭한다. 고정된 테이블 스키마와 조인개념을 사용하지 않도록 모델링한다. ACID(원자성,..

빅데이터/nosql 2019.07.22
Java로 AWS s3에 간단히 file write하기(hadoop-aws 라이브러리 사용, NativeS3FileSystem)

S3는 Simple Storage Service의 약자로 AWS의 강력한 object storage이다. 요구사항에 따라 Java code를 사용하여 aws s3에 file을 write해야할 때가 있다. aws-java-sdk를 사용해도 되지만 apache hadoop에서 제공하는 hadoop-aws를 사용하여 간단하게 file write가 가능하다. 단계 1) 디펜던시 추가 org.apache.hadoop hadoop-aws 2.7.3 org.apache.commons commons-io ${commons-io.version} 단계 2) AWS에서 secretawsAccessKeyId, awsSecretAccessKey 발급 단계 3) 코딩 import org.apache.hadoop.conf.Conf..

빅데이터/하둡 2019.07.11
2019 SKT Ideathon 참가 후기

SKT IDEATHON 2019 Data/AI로 새로운 가치를 찾는 여정 2019년 6월 19일(수) SKT 5G 스마트오피스에서 Ideathon(이하 아이디어톤)이 열렸다. SKT의 Data/AI 역량을 기반으로한 신규 사업/BM 아이디어를 발표하는 것이 이번 아이디어톤의 주제였다. SK ICT Family(SKT, SK플래닛, SK브로드밴드 등)의 다양한 직군(개발자, 기획자, 디자이너, 사업 등)의 구성원이 골고루 팀원으로 구성되었다. 제한된 시간(12시간) 내에 어떻게 SKT ICT Family가 가지고 있는 역량조합하여 훌륭한 BM으로 승화시킬지 고민에 고민을 거듭했고, 결과적으로 대회에서 우수상을 수상하는 영광을 안았다. 이번 아이디어톤은 개인적으로 최근 5년동안 참가했던 대회 중에 가장 힘들..

일상/Hackathon 2019.07.07
KSQL - Streaming SQL for Apache Kafka 개요 - readme 설명 번역

이 글은 KSQL github repository readme를 번역하였습니다. ☞ https://github.com/confluentinc/ksql KSQL은 아파치 카프카에서 사용가능한 스트리밍 SQL 엔진입니다. Java나 Python같은 프로그래밍 언어로 코드를 짤 필요 없이 간단하고 완전히 상호작용하는 SQL interface를 카프카를 통해 사용가능합니다. KSQL은 분산형, 확장형, 신뢰성, 실시간성이라는 특징을 가지고 있습니다. KSQL을 통해 강력한 aggregation, join, windowing, seessionization 등의 기능을 사용할 수 있습니다. 튜토리얼과 리소스를 사용하기 위해서는 이 링크(바로가기)를 누르세요. 그리고 아래 유튜브에서 KSQL demo를 확인 할 수 ..

빅데이터/Kafka 2019.07.07
마틴파울러의 마이크로서비스의 정의(Micro Service Architecture by Martin folwer)

2014년 마틴파울러는 마이크로서비스에 대한 정의를 자신의 블로그(바로가기)에 올렸다. 이를 바탕으로 나의 생각과 함께 정리해보았다. 개요 "마이크로 서비스 (Microservices)"- 소프트웨어 아키텍처에 대한 또 다른 새로운 용어다. 지난 몇 년 동안 많은 프로젝트에서이 스타일을 사용 해왔고 지금까지의 결과는 긍정적이었다. 많은 동료가 엔터프라이즈 application 구축의 기본 스타일이되었지만 슬프게도 마이크로 서비스 스타일이 무엇이며 어떻게 수행하는지 설명하는 정보는 많지 않다. 이를 설명하고자 한다. 마이크로서비스(Microservices) 간단히 말해 Micro service Archiectrure(이하 MSA)는 작은 단위의 경량 application의 모음 군으로 개발하는 접근 방식이..

Spring boot Resttemplate 사용시 HttpComponentsClientHttpRequestFactory 옵션 설명(setConnectTimeout, setConnectionRequestTimeout, setReadTimeout)

개요 Spring boot에서 rest call을 위해 Resttemplate를 사용한다. 이때 여러 옵션(connection timout 등)을 사용하기 위해 아래와 같이 Restemplate에 RequestFactory를 주입하여 사용하는 경우가 있다. 이 경우 각 옵션이 어떤 역할을 하는지 알아보자 HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setConnectionRequestTimeout(30000); requestFactory.setConnectTimeout(30000); requestFactory.setReadTimeout(300..

Resttemplate으로 PATCH 사용시 에러나는 경우 해결방법 - Invalid HTTP method: PATCH; nested exception is java.net.ProtocolException: Invalid HTTP method: PATCH

Spring boot 내에서 Resttemplate를 사용하여 타 url을 호출하는 경우가 있다. 사용하던 도중 아래와 같은 오류가 날 때가 있다. RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); URI uri = new URI(Api.patchJob(host)); String active = "{\"active\":true}"; headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity entity = new HttpEntity(active, headers); ResponseEntity response = restTemplate.exchan..

Vue.js에서 환경별(dev, alp, prd)옵션을 통해 분기처리하기(NODE_ENV 사용)

개요 vue js(intellij환경)에서 npm run dev를 통해 항상 테스트를 했다. local환경과 production은 환경이 다르기에, 환경별 분기문이 필요할 때가 있다. 이때는 아래와 같이 수행하면 된다. package.json 파일 수정 script의 dev앞부분에 NODE_ENV로 시작하는 key에 value(development)를 넣는 구문을 추가한다. { "name": "MyApplication", ... "scripts": { "dev": "NODE_ENV=development webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", "start": "npm run dev", "build": "node..

[카카오바이크] 판교에서 고장 난 자전거 타고난 뒤 환불받은 후기

판교역에서 걸어서 23분(1.53km)이 걸리는 회사에 다니는 입장에서 카카오 T바이크는 가뭄에 단비이다. 분당지역을 중심으로 운영중인 T바이크는 카카오모빌리티에서 운영중인 서비스이다. 기본 서비스 이용시 첫 15분 미만은 기본 요금 1,000원이며, 이 후 5분당 500원의 요금이 부과되는데, 처음 듣는 사람들은 모두 이런 반응이다. 왜 그렇게 비싼거야? 환승도 안되자나? 굳이? 하지만, 판교내에 지옥같은 602-1, 602-2 만원버스를 타는 것보다는 1천원을 더 내고 전기자전거와 함께 상쾌하게 금토천을 따라 10분만에 도착하는 것이 더 낫다는 생각이 들어 자주이용하는 편이다. 고장난 카카오 T바이크 그런데 최근 T바이크를 사용하기 위해 자전거를 탔다가 고장난 자전거인지 모르고 1분 이상 이용하다가 ..

일상 2019.06.24
Slack으로 process가 정상적으로 시작되었는지 나타내는 이쁜 메시지 만들기(Incoming webhook과 Attachment message 활용)

Slack은 개발자들이 사랑하는 커뮤니케이션 도구 중 하나이다. Slack의 webhook을 사용하여 back-end서버에 개발한 application process가 정상적으로 실행되고 있는지, 정상적으로 꺼졌는지 여부 등을 알림으로 받을 수 있다. 배포하는 서버가 1, 2대라면 ssh 접속으로 언제든지 확인가능하지만 만약 10대, 100대의 서버에 다 들어가서 process가 정상작동 되는지 여부를 확인하기는 어렵다.(하지만 쿠버네티스의 probe를 사용하면 어떨까) 이때 slack으로 한번에 알림을 받는 자동화 과정을 shell로 만들어 놓으면 몸과 정신이 건강해질 수 있다. 시작하기 전에 이 포스팅에 설명하는 guide는 1개의 process로 돌아가는 application을 기준으로 설명합니다...

DevOps 2019.06.21
결혼식 청첩장 Github blog로 세련되게 만들기. 후기!

2019년 5월 18일. 이날은 여자친구와 4년 그리고 1일 되는날, 그리고 결혼식이 열렸던 날이다. 결혼식을 준비하면서 만든 github.io blog기반 모바일 청첩장을 만들게 된 이유와 만들기까지의 과정에 대해 이야기 하고자 한다. 결혼식을 위해 뼈발자(뼈속까지 개발자)인 나는 어떻게 결혼식을 준비하는데 있어 실력을 발휘할까 고민하던 도중 모바일 청첩장을 직접! 만들어보면 어떨까 아이디어를 생각하였다. 모바일 청첩장을 직접 만들고자 한 이유는 아래와 같았다. 첫째. 바른x, 더카x 등 종이 청첩장을 만들어주는 사이트의 디자인이 마음에 안든다. 둘째. 무료로 청첩장을 만들어 주는 사이트는 시간이 지나면 만료되어 더이상 조회가 불가능하다. 셋째. 선물 예약 기능. 친구들에게 필요한 선물을 알려주고 예약..

개발이야기 2019.06.04