전체 글 477

pyspark 데이터프레임 조건절(when)로 데이터 처리하기

Pyspark를 사용해서 대용량의 데이터를 처리(process)할 때 일부 변환(Transformation)이 필요할 때가 있습니다. 일부 요구사항의 경우 가져온 데이터 프레임의 데이터에 조건절(conditional)을 추가해야할 때가 있습니다. 이때 pyspark에서 제공하는 조건절인 when을 사용하면 아주 유용한데요. 예를 들어 설명하도록 하겠습니다. 만약 아래와 같은 데이터가 있다고 가정합시다. seoul corea 2019 newyork usa 2020 seoul corea 2043 newtork usa 2344 brisbane australia 2033 위 데이터를 보면 corea로 글자가 틀린 것을 확인할 수 있습니다. 첫번째 column이 seoul인 데이터만 두번째 column을 Kore..

빅데이터 2020.06.23
Tab delimiter(\t)이 포함된 파일 grep으로 매칭/검색하기

아래와 같이 tab이 포함된 파일의 경우 grep으로 특정 row만 데이터를 추출하기 위해 grep의 옵션을 사용할 수 있습니다. 예시 데이터(tab delimiter로 구분됨) test-data.log 2019seoulkorea0809 2020newyorkusa3251 2021brisbaneaustralia23222 만약 위 데이터에서 2020\tnewtork을 검색하고 싶다면 아래와 같이 grep명령어를 활용합니다. $ test-data.log | grep -e $'2020\tnewyork' -e 옵션을 통해 확장된 정규 표현식패턴으로 검색이 가능합니다. 추가로 $(달러표시)를 함께 활용하면 bash에서 tab escape를 interprete하여 검색에 활용할 수 있습니다. 위 명령어의 결과물은 아..

개발이야기 2020.06.23
자바 멀티스레드 카프카 컨슈머 애플리케이션 구현 코드

이번 포스트에서는 자바 멀티스레드 카프카 컨슈머 애플리케이션을 구현해보도록 하겠습니다. 준비물 - Intellij 또는 eclipse - gradle project - jdk 1.8 - 약 10분 구현방법 이전 포스트(카프카 컨슈머 멀티쓰레드 애플리케이션 예제코드(for scala) 바로가기)에서 scala로 구현한 바가 있습니다. 이번에는 자바로 구현하고, consumer.wakeup()을 사용해서 consumer를 안전하게 해제시키는 것을 아래 코드에서 구현해보겠습니다. wakeup() 메서드는 java shutdown hook을 통해 호출하여 안전하게 종료되도록 설정해보겠습니다. 기존 구현방식 처럼 newCachedThreadPool 메서드를 사용해서 multiple thread를 생성해보겠습니다...

빅데이터/Kafka 2020.06.09
aws ec2에 openJDK 1.8 설치하기 실습 예제

AWS EC2에서 Amazon Linux 2 AMI를 사용할 경우 java가 설치되어 있지 않아 진행하는데 어려움을 겪으시는 분들이 많습니다. 이번 포스팅에서는 EC2(Amazon Linux 2 AMI) 사용시 1.8 openJDK를 설치하는 실습을 보여드리겠습니다. 1. EC2 발급 가장 기본적인 EC2 발급입니다. 기본 AMI를 사용해서 openJDK 설치하는 방법을 보여드릴것이므로, Amazon Linux 2 AMI를 선택합니다. 2. openjdk yum 설치 설치가 완료되고나면 pem을 통해 ec2로 ssh 접속을 시도합니다. $ ssh -i local-test.pem ec2-user@52.79.140.222 Last login: Mon Jun 1 03:48:09 2020 from 210.211..

개발이야기/AWS 2020.06.01
EC2 SLA(서비스 계약 수준) 에 따른 uptime, downtime 시간 계산

EC2는 amazon에서 제공하는 인스턴스(서버) 단위입니다. AWS를 사용하는 가장 기본적인 단위라고 볼 수 있는데요. EC2는 아래와 같이 SLA(서비스 수준 계약)을 제공하고 있습니다. SLA(서비스 수준 계약) Q: Amazon EC2 서비스 수준 계약에서 보장하는 내용은 무엇입니까? SLA는 리전 내 Amazon EC2 및 Amazon EBS에 대해 최소 99.99%의 월간 가동률을 보장합니다. Q: SLA 서비스 크레딧 자격에 부합하는지 어떻게 알 수 있습니까? 운영 중인 지역의 월간 가동률이 매월 결제 주기 동안 99.95% 미만일 경우 Amazon EC2 또는 Amazon EBS(둘 중 하나가 사용 가능하지 않은 경우 또는 둘 다 사용 가능하지 않은 경우)에 대해 SLA 크레딧이 제공됩니다..

개발이야기/AWS 2020.05.28
sbt 실행시 '/modules/java.base/java/lang/String.class' is broken 이슈 해결 방법

sbt를 실행했을 경우 아래와 같은 에러가 발생하였습니다. 위 에러는 java13을 사용하기 때문에 발생하는 오류인데요. 공식 sbt download 홈페이지에서도 이 에러에 대해 처리하는 방법에 대해 자세히 나와 있습니다. ⚠️ Homebrew maintainers have added a dependency to JDK 13 because they want to use more brew dependencies (brew#50649). This causes sbt to use JDK 13 even when java available on PATH is JDK 8 or 11. To prevent sbt from running on JDK 13, install jEnv or switch to using SD..

elasticbeanstalk + route53 으로 SSL(443) 접속 flask application 생성하는 가장 간단한 방법

elasticbeanstalk와 route53을 통해 443이나 SSL 설정을 하지 않은 Flask application을 route53을 통해 접속할 수 있도록 설정 할 수 있습니다. 준비물 - AWS 계정 - route53으로 등록된 DNS 1개 1. ACM 인증서 등록 ACM(AWS Certificate Manage)을 통해 aws에서 무료 ssl 인증서를 등록할 수 있습니다. 2. elasticbeanstalk 설정 443 ssl 설정을 하지않은 flask에 ssl을 연동하기 위해서는 아래와 같은 형태로 작업할 수 있습니다. 굳이 application에 ssl을 붙이는 힘든 과정이 없더라도 load balancing 앞단에서 443을 받도록 하는 것입니다. 이제 아래와 같이 elasticbeans..

개발이야기/AWS 2020.05.15
pymongo - find결과로 나온 데이터의 ObjectId()를 string으로 변경하기

def getSpecificId(id): result = objectIdDecoder(list(collection.find({"_id": ObjectId(id)}))) return str(result) def objectIdDecoder(list): results=[] for document in list: document['_id'] = str(document['_id']) results.append(document) return results pymongo를 통해 collection을 find한 다음 받은 ObjectId는 유효한 json type이 아니다. 그러므로 json형태로 사용할 경우에는 ObjectId를 String으로 변환하는 작업을 해야합니다. 이때 ObjectIdDecoder가 Lis..

빅데이터/nosql 2020.05.13
에어비엔비 CEO가 Airbnb직원들에게 보낸 메일

오늘 airbnb 전직원의 email함에는 CEO가 보내는 메일이 들어왔습니다. 현재 airbnb가 처해진 부정적인 상황과 이에 따른 조치(25% 직원 해고), 그리고 이에 따른 airbnb의 보상(지원)절차에 대한 내용입니다. Global 유니콘기업이 한순간의 상황으로 인해 1/4의 직원을 해고조치할 수 밖에 없는 상황을 자세히 공유하였습니다. 창업자로서 같이 일했던 소중한 직원을 보내야 할 수 밖에 없는 매우 슬픈 상황을 이 메일에서 확인할 수 있습니다. 아래는 해당 메일의 전문입니다. This is my seventh time talking to you from my house. Each time we’ve talked, I’ve shared good news and bad news, but tod..

일상 2020.05.07
실리콘 벨리와 엔지니어, 유튜브 창업이야기 - [유튜브 이야기] 독후감

유튜브 창업주 중 한명인 스티브 첸의 유튜브 창업이야기를 담은 책, [유튜브 이야기]를 읽었습니다. 최근에 유튜브 개발자 채널(데브원영)을 개설하고 컨텐츠를 만들면서 유튜브라는 플랫폼이 어떻게 만들어졌는지, 유튜브 플랫폼의 미래는 무엇인지 궁금하여 찾아 본 책입니다. 유튜브 이야기 언론에 알려진 유튜브 대박의 비밀은 사실이 아니라는데…?전 재산 200달러 시작한 그가 20개월 만에 2조원을 벌었다?카드로 서버 비용을 대느라 급급했던 그는 왜 100억 원의 인센티브를 거절하고 구글을 박차고 나왔을까?2005년 2월 14일은 유튜브가 도메인 등록을 마친 날이다. 그때만 해도 유튜브가 이렇게 세상에서 가장 강력한... www.yes24.com 이 책에서는 스티브 첸의 일대기를 전반적으로 설명하면서 페이팔 창업..

일상/책 리뷰 2020.05.03
Kafka-client client.dns.lookup 옵션 정리

Kafka-client 2.1.0 이후 버젼에서는 client.dns.lookup옵션을 사용하여 dns관련 설정을 사용할 수 있습니다. 오늘 포스팅에서는 해당 옵션이 어떤 역할을 하고 어떻게 동작하는지 알아보도록 하겠습니다. 먼저, apache kafka document의 설명을 보도록 하겠습니다. client.dns.lookup document client.dns.lookup: Controls how the client uses DNS lookups. If set to use_all_dns_ips then, when the lookup returns multiple IP addresses for a hostname, they will all be attempted to connect to before ..

빅데이터/Kafka 2020.04.13
MX MASTER 2s - 맥북에 알맞는 Logitech Option 옵션 설정

MX MASTER과 MX MASTER 2s를 사용하고 있습니다. 맥북을 사용하는 입장에서 이 많은 버튼을 어떻게 설정해서 사용해야 효과적일지 고민됩니다. 저는 저만의 옵션을 찾았고 아래와 같은 버튼을 기능에 mapping하여 사용중에 있습니다. 맥북을 사용하시는 분들에게 유용한 컨텐츠가 되었으면 좋겠습니다. 먼저, 마우스 기본 설정 중 상단 버튼은 아래와 같이 설정하였습니다. 휠 버튼을 클릭하게 되면 맥북의 데스크탑이 보이도록 설정하였습니다. 그리고 휠 뒤쪽 버튼을 Mission control 버튼으로 지정하였는데요. 가까운 버튼 2개를 통해 데스크탑을 보거나 app간 이동을 수월하게 할때 유용합니다. 엄지의 버튼은 따로 설정하지 않았습니다. 생각보다 누르기도 힘들고 잘못 누를때가 많았기 때문입니다. 그..

일상 2020.04.04
Elasticsearch, Logstash, Kibana 버젼별 하위호환표

엘라스틱서치, 로그스태시, 키바나는 각 버젼별 호환성을 따집니다. 그러므로 각 제품별로 하위호환표를 참고하여 버젼업그레이드를 진해해야만 합니다. 아래는 5.x버젼부터 7.x 버젼까지의 각 제품별 하위호환표 입니다. Elasticsearch Kibana X-Pack Beats^* Logstash^* ES-Hadoop (jar)* APM Server App Search 5.0.x 5.0.x 5.0.x 1.3.x-5.6.x 2.4.x-5.6.x 5.0.x-5.6.x 5.1.x 5.1.x 5.1.x 1.3.x-5.6.x 2.4.x-5.6.x 5.0.x-5.6.x 5.2.x 5.2.x 5.2.x 1.3.x-5.6.x 2.4.x-5.6.x 5.0.x-5.6.x 5.3.x 5.3.x 5.3.x 1.3.x-5.6.x ..

카프카 클러스터 클러스터ip DNS 연동방법. use_all_dns_ips 사용(in AWS, route53)

Kafka-client(consumer, producer)를 사용하기 위해서는 다양한 설정이 필요하지만 카프카 브로커와 통신하기 위해서는 bootstrap.servers 옵션은 반드시 필요한 옵션중 하나입니다. Bootstrap.servers 이 옵션은 카프카 클러스터에 연결하기 위해 클라이언트가 사용하는 브로커들의 host:port 목록을 설정해야 합니다. 특이한점은 모든 브로커의 host와 port를 적지 않아도 된다는 점입니다. 왜냐면 최초로 연결된 하나의 broker의 host:port로 부터 통신을 위한 정보를 가져오기 때문입니다. Route 53에서 kafka cluster DNS 설정하기 route53은 aws에서 제공하는 DNS 웹서비스 입니다. aws route53에 이미 등록되어 있는 ..

빅데이터/Kafka 2020.03.20
로드밸런서란? OSI 계층별 로드밸런서

오늘은 로드밸런서와 로드밸런서 종류에 대해서도 아래와 같이 알아보도록 하겠습니다. 로드밸런싱 로드밸런싱은 컴퓨터 네트워크 기술의 일종으로 둘 혹은 셋이상의 서버로 분산하는것을 뜻합니다. 쉽게 말해 n개의 서버를 특정 기준으로 분산시켜 처리하는 것이라 볼 수 있습니다. 로드밸런싱을 실제로 수행하는 주체가 로드밸런서(Load Balanceer) 입니다. 로드 밸런싱은 다양한 알고리즘으로 수행합니다. 로드밸런싱 알고리즘 - 라운드 로빈 : 분배의 가장 기본적인 방식. 각 서버별로 돌아가면서 할당 - 가중 라운드 로빈 : 각 서버별로 돌아가면서 할당하지만 일부 서버는 큰 트래픽을 몰아받는 방식 - 랜덤 : 랜덤하게 분배되는 방식 - URL 해쉬 : 접속하는 IP 주소와 동일한 서버주소에 매칭 - 기타 등등.. ..

개발이야기 2020.03.19
AWS에 카프카 클러스터 설치하기(ec2, 3 brokers)

보통 테스트할때 맥북 또는 윈도우 컴퓨터의 1대 장비에 설치하곤하는데요. 고 가용성 테스트를 하기 위해서는 반드시 3대 이상의 클러스터를 설치해야 완벽한 카프카클러스터로서 테스트가 가능합니다. 또한 테스트가 아니더라도 운영을 위해 ec2에 설치하는 경우도 있습니다. 이번 포스트에서는 AWS에 카프카 클러스터(3대)를 설치해보겠습니다. 실행 목차 aws에 카프카 클러스터(3대)를 설치하기 위해서는 아래와 같은 단계가 필요합니다. 1) AWS로 EC2 3대 발급 2) 방화벽 설정 및 /etc/hosts 설정 3) Zookeeper 설치 4) Kafka 설치 위와 같은 단계를 통해 클러스터를 구축해보고 local 컴퓨터에서 console producer와 consumer를 통해 클러스터가 정상동작하는지 테스트..

빅데이터/Kafka 2020.03.18
개발자 유튜버, 구독자 1000명 달성까지의 여정. 그리고 수익창출

2020년 3월 11일 이날은 제가 운영하고 있는 개발 유튜브(데브원영 DevWonYoung)의 구독자 1000명🎉을 달성한 날입니다. 개발관련 영상을 본격적으로 올린지 214일만인데요. 오늘 포스팅에서는 개발 유튜브를 하면서 느낀점에 대해서 이야기해보려고 합니다. 사실, 18년 여름에 Grafana를 소개하는 영상을 올린적이 있었지만 그 당시에는 편집도 서툴렀고, 어떻게 사람들에게 내용을 잘 전달할 수 있을지 크게 고민을 하지 않았습니다. 이후에 어떤 방향으로 유튜브영상을 올릴지 고민을 거듭한 끝에 2019년 8월 11일에 hombrew를 소개하는 영상을 시작으로 본격적으로 업로드를 시작하였습니다. 구독자 100명이 되기전까지 초반에는 유튜브 채널의 방향성에 대해서 많은 고민을 하였습니다. 영상이 몇개..

개발이야기 2020.03.12
HDFS cilent 사용시 HA구성된 node 연결하기

HDFS client를 사용하여 hdfs data를 직접 접근하곤 합니다. // HDFS 설정 Configuration conf = new Configuration(); conf.set("fs.default.name", "hdfs://172.1.2.3:8020"); // FileSystem 설정 FileSystem dfs = FileSystem.get(conf); Path filenamePath = new Path("/data/test.txt"); System.out.println("File Exists : " + dfs.exists(filenamePath)); // Write data FSDataOutputStream out = dfs.create(filenamePath); out.write("TEST..

빅데이터/하둡 2020.03.11
Java GC 종류별 도식화

이 포스트는 https://blog.voidmainvoid.net/190에서 이어지는 내용입니다. 자바 가비지 컬렉션 설명 및 종류 Getting Started JVM 기반 언어와 C, C++과 가장 큰 다른점은 free()와 같은 메모리접근을 통한 명시적 메모리 해제 여부이다. 자바는 OS메모리 영역에 직접 접근하지 않고 JVM이라는 Process이자 가상머신을 통해.. blog.voidmainvoid.net Garbage Collection은 Heap memory에 존재하는 unreachable object를 삭제하는 과정입니다. Java에서는 여러 버젼을 업그레이드 해가는 동안 다양한 GC알고리즘을 적용했었습니다. 오늘은 각 GC별 동작을 도식화하여 설명드리도록 하겠습니다. GC 도식화 설명에 앞선..

NAT IP란?

NAT는 Network Address Translation의 줄임말 입니다. NAT는 사설 네트워크에 속한 여러 개의 호스트가하나의 공인 IP 주소를 사용하여 인터넷에 접속하기 위해 사용합니다. 쉽게말해서 외부망과 내부망을 나눠주는 기능을 하게 되는 것입니다. NAT 특징 - 내부에서 외부로 통신 가능 - 외부에서 내부로 통신 불가 NAT 장점 - 여러 사설 네트워크를 사용함으로서 인터넷 공인 IP 주소를 절약 가능. - 사내망 IP주소를 외부로 알리지 않음으로서 외부로 부터의 침입/공격 차단 NAT 단점 - 네트워크 복잡성 증가 - 네트워크 지연 영향 NAT 종류 - Static NAT : 사설IP와 공인 IP를 1:1 매핑 - Dynamic NAT : 다수 공인 IP와 다수 사설 IP 매핑 - PAT..

개발이야기 2020.03.08
system call이란?

OS는 크게 커널모드와 사용자모드로 나뉘어 집니다. - 커널모드 : 모든 시스템 메모리 접근 가능. 모든 CPU명령 실행 가능 - 사용자모드 : 사용자 애플리케이션 실행. 하드웨어 직접 접근 불가. System call 호출시 일시적으로 커널모드로 전환. 커널영역의 기능을 사용자모드가 접근하게 도와주는 기능을 System call이라고 부릅니다.. System call을 사용하는 이유? 가장 큰 이유는 유저 애플리케이션(ex. 우리가 흔히 개발하여 실행하는 자바 애플리케이션)이 운영체제의 치명적인 데이터를 수정/삭제하는 권한을 막기 위해서 입니다. 직접적인 하드웨어 요청이나 기타 시스템요청은 OS가 제공하는 System call을 통해 호출하도록 제공해줍니다. 만약 유저 애플리케이션이 System cal..

개발이야기 2020.03.08
공개 키 암호방식이란?

공개키 암호화 방식은 암호방식중 한종류로 사전에 비밀키를 나눠가지지 않은 사용자들이 안전하게 통신할 수 있도록 설계된 것입니다. 공개키 알고리즘은 비대칭 암호라고 부르기도 합니다. 왜냐면 공개키 암호화 방식은 암/복호화에 다른 암호키를 사용하기 때문입니다. 통신을 위해 필요한 키 종류는 2가지입니다. 1) 공개 키 : 누구나 알 수 있음 2) 비밀(개인) 키 : 소유자만 알 수 있음 공개키 암호 방식은 2가지로 나뉩니다. 1) 공개 키 암호 : 비밀키를 가지고 있는 사람만 내용을 확인 가능 2) 공개 키 서명 : 특정한 비밀키로 만들었다는 것을 누구나 확인 가능 공개 키 암호방식 통신 예제 A사용자에게서 B사용자에게로 데이터를 전달하고 싶을 때, Destination인 B사용자 이외 사람은 해독이 불가능..

개발이야기 2020.03.07
카프카 버로우 = consumer lag 모니터링 오픈소스 애플리케이션

카프카 컨슈머 Lag 모니터링 필수요소 카프카 lag은 토픽의 가장 최신 오프셋과 컨슈머 오프셋간의 차이입니다. Kafka-client 라이브러리를 사용해서 Java 또는 scala와 같은 언어로 카프카 컨슈머를 구현할수 있는데요. 이때 구현한 kafkaConsumer 객체를 통해 현재 lag 정보를 가져올 수 있습니다. 만약 lag을 실시간으로 모니터링하고 싶다면 데이터를 Elasticsearch나 InfluxDB와 같은 저장소에 넣은뒤에 Grafana 대시보드를 통해 확인할 수도 있습니다. Github URL https://github.com/linkedin/Burrow linkedin/Burrow Kafka Consumer Lag Checking. Contribute to linkedin/Burro..

빅데이터/Kafka 2020.03.07
Java PermGen의 역사

오늘은 Java PermGen에 대해서 알아보겠습니다. PermGen은 JDK 1.7 이하 버젼에서 존재하였습니다. 이곳은 클래스 메타 데이터가 들어갈 곳인데, 이 공간의 크기는 예측하기가 어려웠습니다. 자바에서는 클래스의 메타데이터를 읽고 해당 메타데이터를 통해 객체를 생성할 수 있습니다. 클래스 메타데이터란? : 클래스의 이름, 생성정보, 필드정보, 메서드 정보 등 그 때문에 아래와 같은 에러가 종종 일어나곤 했습니다. java.lang.OutOfMemoryError: PermGen space PermGen영역은 OS, JVM버젼마다 각기다른 default값을 가지고 있으며 대부분 매우 작게 할당되어 있었습니다. 그렇기 때문에 클래스 로딩을 많이하다보면 PermGen이 부족할때 위와 같은 에러가 발생..

엘라스틱서치에서 field 와 field.keyword 의 차이(text와 keyword)

엘라스틱서치와 키바나를 사용하여 데이터를 조회하다보면 아래와 같이 index pattern이 색인되어 있는것을 종종 볼 수 있습니다. field명이 그대로 나타나는 경우와 field.keyword로 나타나는 경우 입니다. 분명히 field명 key와 value(string)으로 넣었는데 둘의 차이가 무었일까요? text와 keyword 엘라스틱서치 5버전 이후로는 string type은 text와 keyword타입으로 변경되었습니다. 따로 명시적으로 mapping을 하지 않았다면 아래와 같이 엘라스틱서치에 들어가게 됩니다. Input key/value : { "some_field": "string value" } In elasticsearch: { "some_field": { "type" "text", ..

카프카 컨슈머 멀티쓰레드 애플리케이션 예제코드(for scala)

Kafka-client library를 사용하여 JVM위에 올라가는 consumer/producer를 작성할 수 있습니다. 이번 포스팅에서는 scala로 Kafka consumer를 멀티쓰레드로 실행하는 애플리케이션 예제 코드를 공유, 설명 드리겠습니다. 제약조건 - Kafka consumer - Multi thread(2개 이상) 지원 - Scala 코드 Scala를 실행하는 멀티쓰레드 카프카 컨슈머 애플리케이션의 파일은 크게 4개로 나뉘어져 있습니다. 먼저, Scala application을 실행하는 Main.scala와 실제로 Consumer역할을 하게 되는 Runnable Thread인 ConsumerWorker.scala, Consumer의 상태를 기록할 ConsumerStatus.scala 마..

빅데이터/Kafka 2020.02.24
스레드풀(Thread Pool)이란? 종류, 설명

자바에서 스레드를 생성하고 제거하며, 다수의 스레드를 관리할 수 있도록 자바에는 java.util.concurrent.Executors 를 통해 스레드풀 기능을 제공하고 있습니다. public class Executors { public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()); } ... 스레드풀의 종류 - newFixedThreadPool : 주어진 스레드 개수만큼 생성하고 그 수를 유지. 생성된 스레드 중 일부가 종료되었으면 스레드를 다시 생성. - ne..

[Scala]dependency tree 확인할 수 있는 유용한 Plugin : sbt-dependency-graph

Java에서 디펜던시 관리 도구로 maven 또는 gradle을 주로 사용합니다. 반면 Scala에서는 SBT를 사용하여 디펜던시를 관리하는데요. 디펜던시를 관리하다보면 일부 library가 하위 library를 추가로 import하면서 꼬이는 경우(동일 library에 n개 이상의 version 동시 import)가 있습니다. 이러한 경우 dependency를 찾기 매우 난감한데요. 이때 사용할 수 있는 좋은 plugin이 있어 소개드립니다. sbt-dependecy-graph ※ 이 plugin은 sbt 1.3.x 이하, 0.13.10이상의 sbt에서만 동작합니다. Github url : https://github.com/jrudolph/sbt-dependency-graph jrudolph/sbt-d..

카테고리 없음 2020.02.18