Author Archives: archmagece

서버 – Cloud vs IDC

그냥 다 귀찮으니 편하게 쓰고 싶다면 Cloud를 쓰는게 맞다. 서버 조그만거 껐다 켰다 하는 경우에는 Cloud가 가격도 싸고..
그런데 뭔가 조금만 무겁게 돌리려고 하면 Cloud의 GCP기준 2cpu 월3만원 4gb 서버는 좀 버거워 하는게 느껴진다.
Kubernetes가 자동으로 설치되고, Storage(s3, goosto..) 처럼 설치해서 관리하기 매우 난감한 솔루션도 종량제로이용 가능. minio, hdfs등을 설치해서 관리하려면 머리가 아프고 소규모로 쓰는데 이걸 설치하려면 골이 아프다.

서버2개정도로 빡빡하게 돌리려면 IDC
통큰아이 서버 중에 5만원~10만원 정도 하는거 두개쯤 쓰면 된다. 단기계약도 가능.

스케일업다운해가면서 테스트 할거면 Cloud

고정적으로 돌릴거면 IDC 코로케이션
http://www.koreaidc.com/03_colo/colo_type.html
액면가(협의가능) 쿼터렉(20Mbps) 25만, 하프렉(50Mbps) 60만, 풀렉(100Mbps) 110만
LG IDC
http://www.uplus.co.kr/biz/bzid/clct/RetrieveBzIdCoIt.hpi
부가포함 – 쿼터 44만, 하프 75.5만 풀 121만
네트워크나 기타 서비스 가격 차이가 있을 수 있다.
평촌IDC를 쓰면 AWS 다이렉트 연결도 가능.

하이브리드 사용을 하려면 AWS Direct 네트워크 연결이 되는 IDC를 선택하면 된다.

결론은

없지만… 개인적으로는 그냥 로컬서버(집에다가) 두개정도 돌려놓고 개발 하다가 클라우드에 한두개정도 올리고… 클라우드 비용이 100만원을 넘는 시점에 하이브리드 환경을 고려 해 보는게 좋지 않을까

요즘시대에 완전 온프레미스 환경을 구축하는건 좀 비효율적이라고 생각한다. s3와 같은 환경을 직접 구축하는건 … 필요해지는 순간이 오긴할까

Error: Win10 Openjdk10 Gradle 빌드 오류

openjdk10 환경에서 gradle 일정이하 버전은 안 돌아간다.
시스템 gradle은 4.9인데 프로젝트 gradle wrapper버전이 낮아서 openjdk10에서 구동이 안되는 상황

실행해주면 해결

Gradle 플러그인 선언 스타일

요즘방법

플러그인 검색 페이지 : https://plugins.gradle.org/
옛날건 properties 파일에 플러그인 버전을 다 설정 해 놨는데 새로운 설정방법으로 하면 값을 가져오지 못한다. 자주 하는건 아니니가 그냥 노가다 표기법 사용.

옛날방법

옛날방법은 낭만이 있었는데 요즘건 너무 삭막해

서비스 베이스 프로젝트

뭔가 개발하려면 꼭 필요한 녀석들이 있다.
그리고 한번 개발 해 놓으면 계속 쓸 수도 있고
(나만그런가 싶기도 하지만)

Infra : DB, MQ, MemoryStorage, FileStorage

App : 파일저장, SSO

클라우드로 하면 되는데.. 왠지 클라우드를 쓰기 싫을 때도 있고

그럴 때 필요한 것들

FileStorage

하듭 파일시스템을 써야되나 고민했는데 아마존 S3처럼 쓸 수 있는게 있다고 한다.
minio https://www.minio.io/
https://github.com/minio/minio
fakes3 https://supso.org/projects/fake-s3
https://github.com/jubos/fake-s3

s3 기능을 많이 흉내내서 만들었다고 하는데 안정성은 잘 모르겠지만 남는피씨서버하드에 돌리기 좋아보인다.

Ubuntu18.04 Bionic Beaver HDD Mount 하드 추가

파티션 잡기

parted 이용
(참고) 

포맷

자동 마운트

tmpdir을 원하는 경로로 변경 

Vagrant box 추천

vagrant 박스 – 공식 박스가 배포되는 경우

debian/stretch64
ubuntu/bionic64
centos/7

공식은 아니지만 여기도 종종 사용하고
bento/ubuntu-18.04이렇게 공식박스를 제공하는 곳도 있지만…

문제는.. 
openbsd, fedora 등 오픈소스진영은 배포자가 관리 주체가 불확실한 경우가 많다
대부분 virtualbox 버전만 제공된다.

parallels, hyperv는 개인이 만든걸 쓰거나 직접 만들어야된다.

그래서 윈도우에 virtualbox를 깔고 쓰게 되는데…

그러다가 발견한 이 계정.

1) hyperv
2) libvirt
3) parallels
4) virtualbox
5) vmware_desktop

다있음.

Error: remote 서버 ssh 접속시 unicode 분해되서 표시

https://askubuntu.com/questions/144235/locale-variables-have-no-effect-in-remote-shell-perl-warning-setting-locale-f/144448#144448

이렇게 표시되는 경우..

이 부분을 주석처리 해준다.

클라이언트 접속시에 로컬의 언어설정을 가져가는건데
간혹 문제가 생길수도 있다.
그런데 요즘은 대부분 관리하는 서버 설정이 unicode일테니까

Iaas, Provisioning tool – Chef, Ansible, Puppet, Rex, Provy, Fabric

서버 프로비저닝 툴

최근 컨테이너(도커)와 Serverless 사용으로 서버 프로비저닝은 중요도가 좀 떨어지긴 했는데
PC, 로컬서버, 개별인스턴스 초기구성할 때 아쉬운 경우가 종종있다.

예전엔 chef가 대세였는데…
그냥 관련 기술 자체에 대한 관심이 죽은건지 이 회사가 폐쇄적인 정책으로 변해서 그런건지 커뮤니티에서 언급이 상당히 줄었다.

## Chef
유료. 인데다가 꽤나 비쌈.
로컬 서버를 쓰거나 클라이언트 모드로 사용하면 무료
최근에 변경이 많았는지 옛날책들 보고 하면 되는게 없다.
https://github.com/chef/chef

## Puppet
유료. chef랑 비슷한 것 같다.
잘 몰라서..

## Ansible
open stack에 사용되고 있다.
chef과 경쟁관계 안써봄.
https://github.com/ansible/ansible

## Fabrid
http://www.fabfile.org/
툴이라기보다는 python ssh 라이브러리.
이걸 베이스로 개발된 툴들이 좀 있는 것 같다.

## Rex
https://github.com/RexOps/Rex
오픈소스.
perl 기반 툴
perl까지 해야되나…

## Provy
http://heynemann.github.io/provy/
오픈소스.
파이썬 기반

Tiamet

Python기반 클라우드 프로비저닝 툴
https://github.com/HardBoiledSmith/tiamat
https://github.com/HardBoiledSmith/johanna

# ~
뭘 쓸지 아직 결론을 내진 못했는데..
DSL형태는 Ansible/Chef
코드는 조금이라도 익숙한 파이선 기반의 provy를 쓰게되지 않을까??? 싶다.

인프라쪽은 본업도 아닌데 너무 많이 시간을 잡아먹는다.

Kotlin DSL – BeanDefinitionDSL.kt

코틀린 DSL Bean 선언.

이거 공부 좀 하면 커스텀 빈도 만들 수 있지 않나

샘플코드
https://github.com/sdeleuze/spring-kotlin-functional
가이드 페이지
https://spring.io/blog/2017/08/01/spring-framework-5-kotlin-apis-the-functional-way

한글 번역이나 어설프게 소스코드 붙여놓고 설명하면 더 헷갈릴 것 같다.

이해할 것도 없고 간단하니 그냥 소스 리포지터리 보는게 더 쉬움.

Kotlin에서 slf4j 로거 선언


SLF4J loggers in 3 ways from Kotlin


자바에서 lombok을 쓰면서 고민도 하지 않았던 부분인데… 여기서는 왠지 신경쓰이는 부분.


class SimpleClass {
private val log = LoggerFactory.getLogger(SimpleClass::class.java)
}

이렇게 해야되는데.. 이렇게 매번쓰기 귀찮으니

CoreUtil.kotlin

inline fun logger(): Logger {
return LoggerFactory.getLogger(T::class.java)
}
inline fun logger2(): Logger {
return LoggerFactory.getLogger(MethodHandles.lookup().lookupClass())
}

이걸 선언 해 두고 가져다 쓴다.
오브젝트에 선언하면 스태틱처럼 선언도 가능하지만 클래스 밖에 선언해두면 전역전역펑션으로 선언된다
인라인이 아니었다면… 클래스를 파라미터로 전달했겠지만 이렇게 해서 좀 더 간단해진다.

refied는 여기 참고.
https://medium.com/@joongwon/kotlin-kotlin-%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%B0%8F-%EC%97%B0%EC%82%B0%EC%9E%90-%ED%95%B4%EB%B6%80-part-3-59ff3ed736be

logger2는 댓글에 써 있는 방법.. 좀 더 간단해 보이는데 검증은 필요.

h2. 처리방법 1

companion object 길어서 좀 꼴뵈기 싫다

class MemberService {
companion object {
private val log = logger()
}
}

h2. 처리방법 2

위에다 선언… intellij에서 클래스 표시가 꺼진다. 왠지 기분나쁨

private val log = logger()
class MemberService {
}

h3. 처리방법 3

인터페이스, 앱스트랙트 사용

선언이 좀 성가셔 보이는데 코드가 제일 깔끔해보인다.

매번 호출하는건 아니겠지?


interface Logger {
fun logger() = LoggerFactory.getLogger(this.javaClass)
}

class SimpleClass {
companion object : Logger
fun testfun(){
logger().info("aaa")
}
}


abstract class Logger {
val logger: Logger = LoggerFactory.getLogger(this.javaClass)
}

class SimpleClass {
companion object : Logger()
fun testfun(){
logger.info("aaa")
}
}