NHN Entertainment에서 만든 협업도구!

Dooray

프로젝트, 메일, 캘린더, 드라이브를 지원한다. 처음 입사했을 댄 프로젝트 밖에 사용하지 않았는데 지금은… 메뉴도 많이 늘어나고 기능도 많아져서 잘 사용하고 있는 도구

좋긴 한데

PC도 많이 쓰긴 한데 그만큼 모바일도 많이 쓰니까.. 그리고 평소 쓰던 3rd party 앱으로 알람 받고 싶어서 여러 앱을 사용해보고 가장 잘 맞는 앱을 골라봤다. 연동 해본 앱은 iPhone 기본 메일, 캘린더, Fantastical, spark, poly mail(맞나?) 등등 근데 메일은 outlook, 캘린더는 Fantastical 이렇게 사용 중 이다.

이유

메일은 진짜 있는 앱들 다 깔아 봤는데 연동 안되는 경우, 늦게 오는 경우가 많았고 제일 빨리 잘 오는 앱이 outlook 이었음! 캘린더는 아이폰에 계정 등록만 하면 잘 연동 되니까…

연동 방법?

Dooray 메인에 우측 상단에 설정 버튼을 누르면 메일, 캘린더 탭에서 연동 방법을 확인 할 수 있다.

메일 설정

설정 앱 > 계정 및 암호 > 계정 추가 > 기타 > Mail 계정 추가 / CalDav 계정 추가

메일은 다 적고 다음 누르면 상세 설정화면이 나오는데 거기서 위에 나온 imap Port, ssl 사용여부 적으면 된다.

메일 설정

연락처 caldav은 안해봐서 모르고… 캘린더 caldav 설정도 비슷하게 하면 된다. 서버, 사용자이름에는 아이디 적고, 암호 쓰고 다음~ 하면 아이폰에는 계정이 등록된다.

완료 되면 아이폰 기본 메일, 캘린더 앱에서 Dooray 메일, 캘린더에서 볼 수 있는 메일, 일정 들을 확인 할 수 있다~

아웃룩은 메일만 쓰고 있는데 메일 계정 추가 > 이메일 주소 적고 다음 > 암호 쓰면 imap, smtp 서버 설정하는 부분이 노출된다. 안되면 고급사용

그러면 dooray 서버 적어주고, 포트번호 적어주고 로그인 하면 ~ 끝

기본 앱도 필요

사우분들 연락처나 프로필 이런건 기본앱에서 잘 확인할 수 있으니까. 이게 쨀 편하. Dooray 앱 말고 다른 앱에서 로그인하려고 하면 ssl 보안 연결을 할 수 없다고도 가끔 뜨는데 재시도 재시도 하면 잘 된다~! 여러개로 사용하자

Vue js

쌩 Javascript랑 Jquery, 어쩌다가 ajax로 짜던 front end에 질렸다. 이런 프레임 워크가 있다는 건 알고 있었지만 사용할 줄도 몰랐고 디자인 패턴도 익숙하지 않았는데 삽질하듯 파고들다 보니 괜찮아 보였다.

Vue? Front end Framework

vue는 앵귤러나 리액트 같은 프론트엔드에서 사용하는 프레임워크라는데 내가 알고 있는 프론트엔드는 MVC에서 V에 해당하는… html, css, js로 꾸며진 페이지만 알고, 알아 왔고 공부했어서 잘 와 닿지도 않는다 솔찍히 지금도. front end 프레임워크가 뭔지 지금도 억지로 사용은 하고 있는데 best practice인지도 모르겠고…. 그냥 쓰고 있다. 무튼 앞단에서 사용할 수 있는 프레임워크

내가 느낀 다른 점

MVC밖에 모르던 나한테 MVVM이란 단어를 처음 듣게 만들었고, back/front를 나눠서 작업 하는 것이다 라는 걸 조금은 생각하게 만든 Vue이다.

  • mvc에서는 model 가지고 controller에서 또는 controller에서 model을 만들어 view에 던져서 페이지를 만드는 것이라고 생각.
  • mvvm은 model, view, view model 뭐 아직 잘 모르겠는데 controller에서 view로 던져주는게 없다.

controller에서 가공한 데이터들을 어떻게 view로 보여줄 수 있는가에 대해 이해가 잘 되지 않았는데 그냥 받아드리기로 했고 내가 사용하고 있는 웹프레임워크에 억지로 끼워 맞춰서 사용 중이다…….ㅎ

맛보기는 봤다 생각하고 do it으로 좀 더 공부해 보기로.

java GC

Oracle

선택의 길

  1. 응답시간이 빨라야 하는가?
    • 웹, 클라이언트 애플리케이션
  2. 처리량이 많아야 하는가?
    • 주어진 시간에 얼마나 많은 트랜잭션을 완료할건가
    • 얼마나 많은

GC 단계

Marking

자바 객체는 순서대로 쌓인다. 큰거 작은거 모두 순서대로 쭉쭉쭉. 그러고 꽉 차면 GC는 쓰는 객체 안쓰는 객체를 마킹합니다.

Normal Deletion, Deletion with Compacting

안쓰는 놈들, 필요없는 놈들은 지워줍니다. 쓸모 없으니깐 근데 순서대로 쌓이다가 안쓰는 애들을 삭제하면 중간에 빈 곳이 생기니까 컴팩션~~ 한쪽으로 모으는거

처음 객체

처음 객체는 무조건! young영역에 생성된다. 그 중에 Eden으로. 그러다가 Eden이 꽉 찰 때까지 들어가고 마지막엔 GC가 돈다. 아까 봤던 (mark..) 한 Eden이 꽉 차고 GC가 돌면 Eden에 남아있는 객체는 없고 모두 survivor로 옮김

원래 survivor에 있던 애들은 다른 쪽의 survivor로 가고 옮길 때 카운트 값을 올림! 일명 age. 이 age가 Threshold을 넘으면 old

컴팩션 하는 이유

디스크 조각모음과 같은 이유. 데이터가 띡띡 떨어져 있으면 읽기 힘들어서 이걸 모아두면 빠르게 읽을 수 있다. 또, 빈 공간도 떨어져 있으면 큰 공간을 빨리 찾기도 어려우니까 한꺼번에 모아둔다.

물론 컴팩션 하는 오버헤드가 크긴하지만 영 영역은 무조건 하며 얻는 이득이 크다.

Young, old

처음 jvm 뜰 때 Xms, Xmx 설정해 줄 수 있는데 이걸 같게 설정해주는게 좋다. 왜냐하면 다르게 주면 young, old의 비율이 달라진다.

G1 Heap Allocation

바둑판으로 메모리가 한통채로 구성되어 있다. 근데 그 중에도 young, old가 나뉘어져 있다.

Java Option

X : 안바뀌는 것 XX : jdk 벤더마다 달라지는 것

jps

jstat -gcutil – ls

java-tutorial

Interface, Abstract

안에 있는걸 모르고 무슨 기능을 할 것인가만 알고 있는 것 근데 java 8에서 default 라는게 생겼는데 기본적으로 리턴이 돼야한다 이런거. 공통 코드들은 Abstract로 빼고, 아니면 Interface라고 한다.

EJB

모든 것들을 컴포넌트화 한 것. Interface를 하나 만들어 놓고 각각의 들을 만들어 놓고

Static

변수 : 클래스 변수 이냐, 객체 변수이냐

 // 사용하면 위험한 코드
 // jvm이 죽을 때 까지 이 맵은 사라지지 않아
static Map<Long, String> map;

메소드 : 클래스 메소드로 변한다.

static block

static block은 클래스 로딩때 한번만 불린다. 블럭을 여러개 나눠서 써도 성능저하는 없다.

static String rookie;
static {
  rookie = "Rookie";
}
public static void main(String args[]) {
  System.out.println(rookie);
}
static {
  rookie = "Hello Rookie"
}
// Result : Hello Rookie

Static한 메소드에서 this를 쓰면 안된다. 왜냐하면 Static한 메소드는 객체를 생성하지 않아. 또, this()는 기본 생성자입니다.

final

클래스에 final이 붙으면 상속 못하게 막는 것. 변수에 붙으면 반드시 동시에 값을 할당해줘야 함. 그러기 싫으면 생성자에서 할당하면 돼. 근데 모든 생성자에서 다 해줘야 겠지.

Strictfp

소수점을 처리하는 방식이 OS마다 다른데 이걸 명시적으로 지정할 때 쓴다.

Lambda

자바 8에서 나온거 functionalInterface를 씀! 인터페이스 안에 메소드 반드시 1개만 있어야함

Operator op1 = (x,y) -> x+y ;
Operator op2 = (x,y) -> x-y ;

java8

Stream

list.stream().filter(i -> i % 3 == 0).forEach(i-> System.out.println(i));

filter, map, mapToInt, sorted, foreach 등등

언제 쓰지? for loop으로 막 돌리면서 작업할 필요가 없다.

intList.forEach(x -> System.out.println(x));
intList.forEach(System.out::println);

이렇게 x 하나 만 넘겨줄 때는 ::로 쓸 수 있다. 개꿀

parallelStream

원래 Stream은 순차적으로 뽑아서 돌리는데 얘는 멀티스레드로 순서 없이 뽑아서 처리한다. 왠만해선 쓰지말자. 특히 웹에서는 쓰면 골치 아파진다.

자바 성능 튜닝 이야기

#

자바 클래스 정보 보여주는 도구 : javap

java -V HelloWorld

리플렉션 같은 거로 클래스 정보, 필드 정보 출력해준다. 리플렉션도 코드에선 쓰지 말자. 대신 instanceof 사용하자

DOM 데이터를 모두 들고 있어서 메모리 짱 많이 먹어 SAX Read only라 편집 불가

JVM 모니터링 도구

  1. Visual VM

J Visual vm : jdk에 포함돼서 나오는거. JVM 모니터링 도구 - GC, Memory 등등

  1. Java Mission Control

Profiling

개발 서버에서 쓰는데 운영 서버에서 쓰면 성능저하가 너무 심하다. 코드 라인 별로 시간을 얼마나 깎아 먹는지 까지 상세하게 볼 수 있다.

  1. Jprobe
  2. YourKit
  3. DevPartner
  4. JProfiler : 락이 걸리는 코드, 얼마나 걸리는지 확인 가능

APM

운영 서버에서 사용한다.

  1. Jennifer
  2. Phros
  3. Exam
  4. Scouter : LG에서 만든거고 오픈소스. 리얼타임 기반
  5. Pinpoint : Naver에서 만든 오픈소스.

TPS : Transaction per second 성능을 측정 할 수 있는 정도

TPS를 늘리려면 서버를 늘리면 되는데 병목이 발생할 수 있다. 근데 역시 한계는 존재함 성능저하의 병목은 대부분 CPU인데 WAS, API, DB 순서로 간다고 치면 WAS 에서 100%으면 api, db는 텅텅 놀고 있을거야.

BCI? ASM? 메소드 앞 뒤에다가 내가 분석해야 하는 메소드네? 판단하고 무언가를 심어주고 측정한다.

아파치 웹 로그

들어온 요청이 나갈 때 로그를 찍어요 왜냐하면 %D, %T는 걸린 시간인데 들어올 때 찍으면 어떻게 알겠어

WAS DB 100%이면 웹서버로 들어오는 요청을 끊어버려 - L4에서 빼면 돼 그러고 나면 언젠가는 들어온 요청이 끝날테니까 로그에 찍힐 거야

성능을 이야기할 때 average mean 비슷한데 분명 달라 average는 평균값인데 mean는 중간값 90th, 95th, 99th는 신뢰도로 90%… 사용자는 이 응답시간에 들어올거다. 라는 것이고, Standard dev 표준편차인데 값이 들쭉 날쭉 할 수 있다는 것.