디자인 1도 모르는 개발자, UX디자인 시작하기

DAY1, SESSION3 디자인 1도 모르는 개발자, UX디자인 시작하기


  • 앱스토어에 등록되어 있는 앱 수
    • 앱스토어 : 320만
    • 플레이 스토어 : 290만
  • 잘나가는 앱을 만들려면?
    • 버그가 없어야하나?
    • 기발한 아이디어가 필요한가?
    • 새로운게 필요한가?
    • UX 디자인을 해야한다
  • 사용자에게 중요한건
    • 기술력 X
    • 새로움 X
    • 기발한 X
    • 나에게 어떤 가치를 주는가 O
  • UX 디자인은 디자이너가 하는것이 아닌가?
    • UX 디자인은 하나의 Framework
  • 의자 하나를 바라보는 관점
    • 생산자
      • 이윤이 날을까
      • 어떻게 팔까
      • 어떤 소재를 쓸까
      • 완제품, 조립품
      • 어떻게 만들까
    • 사용자
      • 누가 이 의자를 쓸까
      • 왜 이 의자를 쓸까
      • 이 의자의 장점이 뭘까
  • 모든 인간은 디자이너 일까?
    • 절반의 대답은 디자이너는 직업
    • 절반은 디자인 이라는 행위를 하는 사람은 모두 디자이너
      • '지금의 디자인은 보다 근본적인 삶의 문제를 다루고 있다고 생각한다'
      • '디자인적 사고는 문제를 발견해 해결 방법을 제시하는 것이다. 이러한 면에서 모든 인간은 디자인적 사고가 가능하며 디자이너라고 할 수 있다.'
    • 우리는 모두가 디자인적 사고를 하고 디자이너가 되어야 한다.
  • 하나의 팀에서 각자의 역할
    • 리더, 디자이너, 개발자 모두 UX 디자인이라는 하나의 목적지를 목표로 해야한다.

  • Lean UX Cycle

    • Think -> Make -> Check -> Think -> ...
    • 낭비를 줄이는 것이 최우선 목적
    • 효율을 높이기 위해서는 협업이 가장 중요.
    • 삼성 패밀리 ?
      • 초기 UX 디자인 분석 단계부터 개발팀과 함께 진행
      • 기능 목적과 목표를 이해, 구현 가능한 스펙 정의
      • 완성도 높아짐
      • 개발자랑 친해짐
    • AIR
      • UX 디자인 워크샵
      • 서비스 목표와 전략 수립
      • 핵심 기능 도출
      • 플랫폼 전체를 바라보는 시각 형성
    • 기타 프로젝트 설명...
  • UX 디자인 함께 하면 좋은점

    • 공동의 목표를 세워, 자발적이고 주체적인 의사결정이 가능하다.
    • 시간과 비용 중심이 아닌 사용자 가치 중심의 스펙 정의가 가능하다.
    • 밀접한 협업이 가능하다.
    • 신속하게 결과를 도출하고 검증할 수 있다.
    • 낭비를 줄이고 위험요소를 미리 감지할 수 있다.
    • 서비스의 질이 좋아진다.
  • UX 디자인 팩트 체크

    • (O) UI 와 UX 디자인 다르다
      • UI : 기술적인 부분, 사용성, 일관성, 심미성
      • UX : 감정적인 부분, 어떻게 느끼는가, 사용자의 가치, 사용 환경, 지속 사용 여부
      • 사용자 경험?
        • Organic Experience : 자연적인 경험 (비, 바람, 냄새, 자연 환경)
        • Designed Experience : 설계된 경험 (테마파크, 방탈출)
      • 사용자 경험을 설계하는 일이 UX 디자인
      • 경험 순서
        • 경험(자극) - 관심(사용자 가치) - 긍정적 감정(사용자 만족) - 지속 사용
    • (X) 사용성만이 전부이다
      • 매슬로의 욕구 단계 이론
      • UX 욕구 단계 이론 (하위 -> 상위)
        • 유용성 - 신뢰성 - 사용성 - 편의성 - 즐거움 - 의미부여
      • 카노의 만족 모델
        • 매력적인 기능 (Delighter) : 기대하지 않았던 기능 - 있어도 없어도 그만
        • 일차원적 기능 (Performance) : 성능, 가격 - 있으면 좋음 - 비례하여 올라감
        • 당위적 기능 (Must-be) : 사용성, 편의성 - 반드시 있어야 함 - 한계가 있음
      • 사용성이 부족하더라도 매력적인 기능으로 만족도를 올릴 수 있다.
      • 사용성보다 사용자 가치가 높으면 사람들은 잘 사용한다.
    • (X) 시간이 오래 걸리고 비싸다
      • 효율적인 UX 디자인 프로세스 = Lean UX + Agile UX
      • 시간과 비용을 효율적으로 쓸 수 있다. (애자일)
    • (X) UX 디자인은 창의성에 의존한다
      • UX 는 Data 를 매우 좋아한다.
  • UX 디자인 프로세스

    • UX 의 질을 높이는 과정
    • 사용자의 만족을 궁극적인 목표로 삼는다
    • 어떻게 만들 것인가 -> 무엇을 만들 것인가
    • Collaboration 을 넘어서 Co-Create
  • 공동의 비전과 목표

    • 5Q : 서비싕 존재 이유를 정의한다.
      • 프로젝트의 목표는?
      • 내가 이 프로젝트를 통해 얻고자 하는 것은?
      • 우리의 주요 고객은 누구인가?
      • 프로젝트 진행에 걸림돌이 되는 것은? 위험 요소는?
      • 서비스의 성공적인 완성은 무엇으로 판단할 것인가?
  • 사용자를 이해하고 니즈를 구체화

    • 사용자 환경을 이해하고 필요한 것과 원하는 것을 찾는다.
    • Pain & Gain : 사용자의 힘든점
  • 사용자 경험 전략과 가치를 정의

    • 제품 고유한 특징과 사용자 가치를 정의한다.
    • Elevator Pitch
      • 제품 고유의 특징을 바탕으로 제품이 완성되면 가장 이상적
      • 사용자 들이 앱을 사용한 후 (이득인 부분)을 이야기 하면 좋겟다
      • 이것이 가능하기 위해서 (핵심 기능)이 필요하다
  • 기능 도출 : 카노 모델

  • 핵심 기능 실현 가능성 평가

    • NUF Test
      • 프로젝트 초기에 기능을 평가할 때 사용
      • 새로움(New) : 예전에 시도된 적이 있는가?
      • 유용함(Useful) : 문제를 해결할 수 있는가?
      • 실현 가능성(Feasible) : 실행이 가능한가? 리소스와 비용이 적게 들어가는가
  • 사용자 유효성 평가

    • Userbility Test
      • Userbility Test != Focus Groups Interview
        • Userbility Test : 사용자를 직접 대면하며 서비스 이용 상황을 직접 관찰
        • Focus Groups Interview : 사용자를 모아놓고 서비스에 대해 어떻게 대화하는지
      • 사용자에게 일정한 과제를 중 후 앱을 사용하는 것을 관찰
      • 시급한 문제를 구별하고, 다음 업무를 할당하는 것이 주 목적
      • 모든 문제를 찾을 필요 없다. 가장 심각한 문제에 집중
      • 당신이 옳다고 생각하는 때보다 더 일찍 시작하라
      • 프로젝트 진행 중 반복적으로 계속, 자주 하는 것이 중요
  • UX 디자인을 시작하려는 개발자에게

    • 우리는 팀입니다.
    • 우리는 사용자가 아닙니다. 될 수도 없고 되어서도 안됨 (개인의 취향일 뿐)
    • UX 디자인에 참여하는 것에 주저하지 마세요.

'공부 > 기본' 카테고리의 다른 글

'Android Kotlin 을 통한 개발' 영상 시청  (0) 2019.05.14
'머티리얼 디자인' 영상 시청  (0) 2019.04.23

계층별 주요 기능 요약

  • 물리 계층 (Physical Layer, L1)

    • 기계적, 전기적인 통신망 접면의 정의

    • 데이터를 전기적인 신호로 변환해서 주고받는 기능만 할 뿐

    • 대표 장비 : 통신 케이블, 리피터, 허브 등

  • 데이터링크 계층 (DataLink Layer 2, L2)

    • 데이타 링크의 제어 (프레임화, 데이터 투명성, 오류 제어 등)

    • 맥 주소를 가지고 통신한다.

    • 대표 장비 :브리지, 스위치 등

  • 네트워크 계층 (Network Layer 3, L3)

    • 경로 배정, 주소, 호 설정 및 해지 등

    • 데이터를 목적지까지 가장 안전하고 빠르게 전달하는 기능(라우팅)

    • 주소부여(IP), 경로설정(Route)

  • 전송 계층 (Transport Layer 4, L4)

    • 종단 간의 신뢰성 있고 효율적인 메세지 전송(연결 관리,에러제어,데이타 분리,흐름제어 등)

    • 오류검출 및 복구와 흐름제어, 중복검사 등을 수행

    • TCP 프로토콜 / UDP 프로토콜

  • 세션 계층 (Session Layer 5, L5)

    • 응용 개체들간의 대화, 동기화 제어, 연결세션관리 등

    • 데이터가 통신하기 위한 논리적인 연결

    • 세션 설정, 유지, 종료, 전송 중단시 복구 등

    • 동시 송수신 방식(duplex), 반이중 방식(half-duplex), 전이중 방식(Full Duplex)

    • TCP/IP 세션을 만들고 없애는 책임

  • 표현 계층 (Presentation Layer 6, L6)

    • 전송 형식 협상, 데이타의 표현 방식 변환 등

    • MIME 인코딩이나 암호화 등의 동작

    • 데이터 종류 구분(해당 데이터가 TEXT인지, 그림인지, GIF인지 JPG인지의 구분)

  • 응용 계층 (Application Layer 7, L7)

    • 화일 전송, 접근 및 관리 및 문서, 메세지 교환 등

    • 최종 목적지로서 HTTP, FTP, SMTP, POP3, IMAP, Telnet 등과 같은 프로토콜

    • 일반적인 응용 서비스를 수행


참고

Nginx Reverse Proxy Example with Node.js Express

   - reverse proxy 관련 도커 이미지는 jwilder/nginx-proxy 와 JrCs/docker-letsencrypt-nginx-proxy-companion 를 사용했습니다.
   - https://github.com/jwilder/nginx-proxy
   - https://github.com/JrCs/docker-letsencrypt-nginx-proxy-companion

  • https://github.com/jmyoon4488/docker-nginx-reverse-proxy
  • docker-compose 사용
  1. nginx-proxy 컨테이너 실행
  2. Dockerfile 로 Node.js 이미지 파일 빌드
  3. 빌드한 이미지로 Node.js 웹서버 실행
  4. 잘 적용되었는지 확인!

  1. nginx-proxy container 실행해줍니다.

    • /your/path/nginx-proxy - 해당 부분은 자신의 서버에 맞는 경로로 바꿔주세요.
    • proxy/nginx-proxy-letsencrypt.yml

    version: '3' services: nginx-proxy: container_name: nginx-proxy image: jwilder/nginx-proxy ports: - 80:80 - 443:443 restart: always volumes: - /your/path/nginx-proxy/log:/var/log/nginx  - /your/path/nginx-proxy/html:/usr/share/nginx/html - /your/path/nginx-proxy/certs:/etc/nginx/certs         - /your/path/nginx-proxy/vhost.d:/etc/nginx/vhost.d - /your/path/nginx-proxy/config:/etc/nginx/conf.d - /var/run/docker.sock:/tmp/docker.sock:ro labels: - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy etsencrypt-nginx-proxy: container_name: leten-nginx-proxy image: jrcs/letsencrypt-nginx-proxy-companion restart: always depends_on: - nginx-proxy volumes: - /your/path/nginx-proxy/certs:/etc/nginx/certs - /your/path/nginx-proxy/vhost.d:/etc/nginx/vhost.d - /your/path/nginx-proxy/html:/usr/share/nginx/html - /var/run/docker.sock:/var/run/docker.sock:ro networks: default: external: name: nginx-proxy

    $ docker-compose -f nginx-proxy-letsencrypt.yml up -d
    
    • $ docker ps 명령어로 컨테이너가 정상적으로 실행되고 있는지 확인.
  2. Dockerfile 로 Node.js 이미지 빌드

    • node/Dockerfile
    FROM node:carbon
    
    ENV SRCDIR /src
    RUN mkdir -p $SRCDIR/app && chown -R node:node $SRCDIR
    
    WORKDIR $SRCDIR
    COPY ./package.json $SRCDIR
    
    RUN npm install
    
    COPY . $SRCDIR
    
    EXPOSE 3000
    WORKDIR $SRCDIR/app
    
    CMD ["node", "app.js"]
    • package.json
    {
        "name": "node",
        "version": "0.0.0",
        "private": true,
        "scripts": {
            "start": "node ./app/app.js"
        },
        "dependencies": {
            "debug": "~2.6.9",
            "ejs": "~2.5.7",
            "express": "~4.16.0",
            "request": "^2.88.0",
            "uuid": "^2.0.2"
        }
    }
    • build image
    $ docker build --tag nodejs:test .
    
    • $ docker images  로  이미지 확인
    REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
    nodejs                                   test                000000000000        24 minutes ago      902 MB
    
  3. 빌드한 이미지로 Node.js 컨테이너 실행

    • 4개 항목은 꼭 자신에게 맞는 값으로 변경 - VIRTUAL_HOST, VIRTUAL_PORT, LETSENCRYPT_HOST, LETSCRYPT_EMAIL
    • 포트를 변경하려면 Dockerfile 에서 EXPOSE 포트를 변경하고 다시 빌드해 줍니다.
    • node/node-test.yml
    version: '3'
    
    services:
      nodejs-test:
        container_name: node-test
        image: nodejs:test
        volumes:
          - ./app:/src/app
        environment:
          - VIRTUAL_HOST=sub.domain.com
          - VIRTUAL_PORT=3000
          - LETSENCRYPT_HOST=sub.domain.com
          - LETSCRYPT_EMAIL=your@email.com
    
    networks:
      default:
        external:
          name: nginx-proxy
    • 컨테이너 확인
    $ docker ps
    
  4. 프록시 및 letsencrypt 적용 확인

    • 브라우저를 통해 설정에 적용한 서브도메인으로 접속해봅니다.
    • nginx 설정파일을 확인해 봅니다.
    $ docker exec nginx-proxy cat /etc/nginx/conf.d/default.conf
    

    or

    $ sudo cat ./config/default.conf
    
    • default.conf
    ~~~~~~~
    # sub.domain.com
    upstream sub.domain.com {
                    ## Can be connected with "nginx-proxy" network
                # node-test
                server 172.5.0.1:3000;
    }
    server {
        server_name sub.domain.com;
        listen 80 ;
        access_log /var/log/nginx/access.log vhost;
        return 301 https://$host$request_uri;
    }
    server {
        server_name sub.domain.com;
        listen 443 ssl http2 ;
        access_log /var/log/nginx/access.log vhost;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers 'CODE~~~~~~~~~~~~~';
        ssl_prefer_server_ciphers on;
        ~~~ many options 
        include /etc/nginx/vhost.d/default;
        location / {
            proxy_pass http://sub.domain.com;
        }
    }
  5. 만약 다른 웹서버 컨테이너를 추가하고 싶다면...

    • 추가할 웹서버는 도커를 이용해 실행해야 합니다.
    • 컨테이너는 반드시 프록시 컨테이너와 같은 도커 네트워크 상에 위치해야 합니다. (nginx-proxy)
    • 위에서 지정한 4가지 옵션을 꼭 입력해 주세요.


- grep

 : 파일 내용이나 콘솔상의 출력 내용에서 특정 문자열을 찾아서 보여줍니다.


1) 파일에서 word 문자열을 찾아 출력합니다.

$ grep word test.txt


2) 현재 디렉토리상에 있는 모든 파일에서 word 문자열이 포함된 줄을 찾아 출력합니다.

$ grep word *


3) 현재 디렉토리 및 하위에 있는 모든 파일에서 word 문자열이 포함된 줄을 찾아 출력합니다.

$ grep -r word * 


4) 파일에서 word 문자열을 찾아 다음 3줄을 포함해서 출력합니다.

$ grep word test.txt -A 3


5) 파일에서 word 문자열을 찾아 이전 3줄을 포함해서 출력합니다.

$ grep word test.txt -B 3


6) 파일에서 word 문자열을 찾아 줄번호를 포함해서 출력합니다.

$ grep word test.txt -n


7) 파일에서 word 문자열이 포함된 줄을 제외하고 출력합니다.

$ grep -v word test.txt


8) 파일에서 (word1 or word2) 문자열이 포함된 줄을 출력합니다. ( or 연산자 = |  는 특수기호이므로 역슬래시를 붙여줍니다. )

$ grep "word1|word2" test.txt


9) 파일에서 (word1 and word2) 문자열이 포함된 줄을 출력합니다.

$ grep word1 test.txt | grep word2


10) 옵션 혼합 가능

$ grep -rn word /home/test -B 5 -A 3


=> /home/test 폴더 하위 모든 파일에서 word 문자열을 찾아서 해당 문자열 이전 5줄, 이후 3줄에 줄번호를 포함해서 출력합니다.


11) pipe 로 다른 명령어의 표준 출력과 연계가능

$ cat /home/test/test.txt | grep word



- find

 : 파일 및 디렉토리 등 검색할 때 사용합니다


1) /home/test 하위 파일, 디렉토리, 링크, 소켓 등등 모든 것을 출력합니다.

$ find /home/test


2) /home/test 하위 파일만 출력합니다. ( -type d = 디렉토리만 출력 )

$ find /home/test -type f


3) /home/test 하위 파일 중 크기가 5MB 이상인 파일만 출력합니다.

$ find /home/test -type f -size +5M


4) /home/test 하위 파일 중 크기가 5MB 이상이고 권한이 644인 파일만 출력합니다.

$ find /home/test -type f -size +5M -perm 644


5) /home/test 하위 파일 중 크기가 5MB 이상이고 파일이 변경된지 5일이 지난 파일만 출력합니다.

(일자 옵션 - s : 초, m : 분, h : 시, d : 일, w : 주)

$ find /home/test -type f -size +5M -mtime +5d 



- exec

 : 앞선 명령어의 결과를 입력으로 받아 “\;” 라는 표기자를 만날때까지 읽고 실행

 : 즉 exec 커맨드의 끝을 ';'(세미콜론)으로 표기해줘야함

 : '+' 옵션은 인자를 연속으로 입력해서 커맨드 한번으로 실행하게끔 해줌


/home/test 에 아래와 같이 3개의 파일이 있을 경우

/home/test/a.txt

/home/test/b.txt

/home/test/c.txt


1) /home/test 하위 파일 중 크기가 5MB 이상인 파일의 출력을 인자로 하여 ls -l 명령어를 실행합니다.

$ find /home/test -type f -size +5M -exec ls -l {} \;

({} <- 위치에 find 결과값의 인자가 들어갑니다.)


위 명령어를 풀어서 써보자면...

$ find /home/test -type f -size +5M -exec ls -l {} \;

=>  $ ls -l  /home/test/a.txt

    $ ls -l  /home/test/b.txt

    $ ls -l  /home/test/c.txt


1) /home/test 하위 파일 중 크기가 5MB 이상인 파일의 출력을 인자로 하여 chmod 명령어를 실행합니다.

$ find /home/test -type f -size +5M -exec chmod 755 {} +


위 명령어를 풀어서 써보자면...

$ find /home/test -type f -size +5M -exec chmod 755 {} +

=>  $ chmod 755 /home/test/a.txt /home/test/b.txt /home/test/c.txt



- xargs

 : exec 커맨드의 + 옵션과 유사하다.

 : 앞선 명령어의 결과를 입력으로 받아 인자를 연속으로 나열하여 커맨드를 실행함

 : {} 문자열은 다른 문자열로 사용할 수 있다.


1) -I 옵션으로 txt 파일을 backup 폴더로 복사 (권장)

$ find /home/test -type f | xargs -I{} cp {} /home/test/backup


2) -i 옵션으로 txt 파일을 backup 폴더로 복사

$ find /home/test -type f | xargs -i cp {} /home/test/backup


3) {} 대신 다른 문자열 사용

$ find /home/test -type f | xargs -IARGS cp ARGS /home/test/backup


매뉴얼에는 -i 옵션은 옛날 방식이므로 -I 옵션을 사용하도록 권고하고 있다. -i 옵션에서 아무것도 지정하지 않을 경우 기본값으로 "{}" 문자열이 사용되고, -I 옵션에는 기본값이 없으므로 반드시 -I{} 이런 식으로 사용해야 한다.



- awk

 : 패턴 탐색과 처리를 위한 명령어로 간단하게 파일에서 결과를 추려내고 가공하여 원하는 결과물을 만들어내는 명령어이다.

 : F 옵션을 통해 구분자를 지정할 수 있다.

 : 구분된 인자는 $1 부터 차례대로 할당된다.


기본 문법

$ awk 'pattern' filename

$ awk '{action}'  filename

$ awk 'pattern' '{action}' filename

$ awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ...  ]


ex) $ ls -al

total 1111

drwxr-xr-x  6 test  staff      192  2 20 10:10  .

drwxr-xr-x  4 test  staff      128  2 20 10:10  ..

-rwxr-xr-x  1 test  staff       100  2 20 10:10 a.txt

-rwxr-xr-x  1 test  staff       100  2 20 10:10 b.txt

-rw-r--r--   1 test  staff       100  2 20 10:10 c.txt


공백으로 분리하면

$1  : '-rw-r--r--'

$2 : '1'

$3 : 'test'

$4 : 'staff'

$5 : '100'

$6 : '2'

$7 : '20'

$8 : '10:10'

$9 : 'c.txt'


$ ls -al | awk -F " " '{print $9}'

.

..

a.txt

b.txt

c.txt


(추가 사항이 생길 경우 수정할 예정입니다.)

[Nginx-proxy 이미지 사용]

- docker-compose 를 통한 컨테이너 구축


- 서브도메인을 분기 시켜줄 프록시 컨테이너

* nginx-proxy.yaml


version: '2'
services:
nginx-proxy:
container_name: nginx-proxy
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- /home/test/nginx-proxy/log:/var/log/nginx

networks:
default:
external:
name: nginx-proxy



- 기본 웹서버 컨테이너

* nginx-www.yaml


version: '2'
services:
nginx-www:
image: nginx:latest
environment:
- VIRTUAL_HOST=www.domain.com
container_name: nginx-www

networks:
default:
external:
name: nginx-proxy



- 서브도메인을 테스트 할 test 컨테이너 (test 대신 다른 웹서버 이미지를 사용해서 테스트 해야합니다.)

* test.yaml


version: '2'
services:
test-container:
image: test
container_name: test
environment:
- VIRTUAL_HOST=sub.domain.com
- VIRTUAL_PORT=3000

networks:
default:
external:
name: nginx-proxy



- 프록시 컨테이너 내 nginx 설정 파일 확인

/etc/nginx/conf.d/default.conf

~~~
server {
    server_name _; # This is just an invalid value which will never trigger on a real hostname.
    listen 80;
    access_log /var/log/nginx/access.log vhost;
    return 503;
version: '2'
}
# www.domain.com
upstream www.domain.com {
                ## Can be connected with "nginx-proxy" network
            # nginx-www
            server 192.0.0.1:80;
}
server {
    server_name www.domain.com;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://www.domain.com;
    }
}
# test.domain.com
upstream test.domain.com {
            ## Can be connected with "nginx-proxy" network
            # test web server container
            server 192.0.0.2:3000;
}
server {
    server_name test.domain.com;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://test.domain.com;
    }
}



---------------

[Webhook]

- 웹훅은 새 이벤트 (클라이언트 측 응용 프로그램이 관심을 가질 수있는)가 서버에서 발생한 경우 서버 측 응용 프로그램이 클라이언트 측 응용 프로그램에 알릴 수있는 메커니즘을 제공합니다.


- "역방향 API" 라고도 합니다 . 일반적인 API는 클라이언트가 서버를 호출합니다. 반면 웹훅의 경우 웹훅 (클라이언트에서 제공하는 URL)을 호출하는 서버 측에 등록하면 서버에서 특정 이벤트가 발생했을 때 클라이언트를 호출합니다.


* 특정한 Event가 발생하면 ➔ Trigger로 웹훅이 동작하고 -> 지정한 Action이 일어납니다


[Yona - Mattermost 를 통한 웹훅 테스트]

1. Mattermost 의 팀 설정에서 Incomming Hook 생성 (생성된 webhook url 복사)

2. 요나의 프로젝트 -> 설정 -> 웹훅 -> 새 웹훅 생성 항목에 복사한 Mattermost 웹훅 url 추가

3. 해당 프로젝트에서 이슈 생성 및 수정, 삭제 등등 작업

4. Mattermost 채널에서 봇에 의한 이슈 알림 확인

------------------------------------------------------------------------------------------------------------


1)



2)



3)



4)



---

- 리눅스에서 파일을 일반적으로 백그라운드로 실행을 하면

  터미널, 콘솔창 등의 연결 프로그램을 닫으면 세션이 종료되어

  백그라운드에서 실행되던 프로세스도 같이 종료되어 버린다.


- 해당 문제를 해결하기 위해 nohup 명령어를 사용한다.


[사용법]

$ nohup ./script.sh &

$ nohup java main.class &

$ nohup python test.py &


등등...


[출력]

* 기본 출력은 실행파일과 같은 위치에 nohup.out 이라는 파일에 저장된다.


* 출력 파일 변경은 일반적인 redirect 옵션을 사용

$ nohup python test.py > print.log &


* 출력 파일 내용이 실시간으로 생기지 않고 어느정도 내용이 쌓이면 저장되는데,

  파이썬의 경우에는 -u 옵션 사용해서 바로 확인이 가능하다.

$ nohup python -u test.py > print.log &

[Ubuntu locale 한글 변경]


- 현재 locale 확인

$ locale


- 설치

$ sudo apt-get install language-pack-ko


- 한글 추가

$ sudo locale-gen ko_KR.UTF-8


- 한글 적용

1)

$ sudo dpkg-reconfigure locales


2-1) 명령어 방법

$ sudo update-locale LANG=ko_KR.UTF-8 LC_MESSAGES=POSIX


2-2) 직접 파일 수정 방법

$ vi /etc/default/locale

LANG=ko_KR.UTF-8

LC_MESSAGES=POSIX


* 이후 ssh 재접속 및 서버 재부팅 후 확인

* 서버에서 자동화를 위해 expect 쉘스크립트를 작성하면서 겪은 문제입니다.


[스크립트 예시]


#!/bin/bash

expect << EOL
spawn telnet 192.168.0.1

expect -timeout 2 "*ogin:"
send "test\n"

expect -timeout 2 "*assword:"
send "test\n"

#expect -timeout 2 "*@TEST_SERVER"
send "exit\n"

sleep 1
expect eof

echo "hahaha"


[실행 결과]


test@TEST_SERVER> exit 


Connection closed by foreign host.

invalid command name "echo"

    while executing

"echo "hahaha""



[원인]

- 위 방식은 expect 사용방식 중 HEREDOC 사용할 경우 시작과 끝을 잘 표시해줘야 한다.

(vscode 에서는 문서 형식을 shell script 로 하면 이상함을 바로 느낄 수 있다.)


expect << EOL   # 시작

...

EOL                 # 끝


- 위 스크립트는 끝부분을 표시해 주지 않아서 expect 관련 명령어로 인식되어 오류가 발생했다.



[수정]

#!/bin/bash

expect << EOL
spawn telnet 192.168.0.1

expect -timeout 2 "*ogin:"
send "test\n"

expect -timeout 2 "*assword:"
send "test\n"

#expect -timeout 2 "*@TEST_SERVER"
send "exit\n"

sleep 1
expect eof
EOL

echo "hahaha"


test@TEST_SERVER> exit 


Connection closed by foreign host.

hahaha



- 정상적으로 expect 종료 후 echo 명령어가 실행된다.




'Programming > Server' 카테고리의 다른 글

[Linux] nohup 사용  (0) 2019.02.01
[Ubuntu] AWS - Ubuntu locale 한글 변경  (0) 2019.01.14
[CentOS 7] iptables 로그 남기기  (0) 2018.12.14
[FCM] 서버측 UnknownHostException  (0) 2018.10.01
[CentOS 7] systemd 기본 설정  (0) 2018.09.30

[Yona 란]

- 네이버에서 개발한 설치형 이슈트래커

- 팀 업무 및 회사의 업무 생산성이 높아지며 정보의 생성, 축적, 공유가 훨씬 편해짐
- 개발조직 / 비개발조직 간의 진정한 협업을 지향
- 그룹 및 프로젝트 단위로 관리 가능(사내에선 프로젝트를 팀 단위로 사용 예정)
- 각종 문서나 파일을 쉽게 공유할 수 있는 게시판 있음

[설치 방법]

* Docker 사용

* docker-compose file


version: '2'
services:
yona:
image: pokev25/yona:latest
container_name: yona
restart: always
environment:
- BEFORE_SCRIPT=before.sh
- JAVA_OPTS=-Xmx2048m -Xms1024m
volumes:
- /home/yona/data:/yona/data # 데이터를 유지할 위치 설정
ports:
- "9000:9000"

yona_db:
image: mariadb
container_name: yo_db
restart: always
volumes:
- /home/yona/mysql/data:/var/lib/mysql # 데이터를 유지할 위치 설정
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: yona
MYSQL_USER: test
MYSQL_PASSWORD: 1234
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci

# docker-compose -f docker-file.yml up -d


* 컨테이너 시작 후 오류가 발생하고 요나가 정상 실행되지 않을 수 있음. (설정이 제대로 완료되지 않은 상태)

* /home/yona/data/conf/application.conf  - 해당 파일이 생성된 것을 확인하고 수정하기

(db 연결 설정 : db_name 은 docker 를 이용해 mariadb 를 생성할 때 지정한 이름과 동일하게 입력)

~~~~

# MariaDB

db.default.driver=org.mariadb.jdbc.Driver

#db.default.url="jdbc:mariadb://192.168.0.0:3306/db_name?useServerPrepStmts=true"

db.default.url="jdbc:mariadb://192.168.0.0:3306/yona?useServerPrepStmts=true"

db.default.user=test

db.default.password="1234"

~~~~

(현재 서버 설정 확인)

application.scheme="http"

application.hostname="192.168.0.0"

application.port="9000"

~~~~

(메일 알림 기능을 사용하려면 아래 설정 수정 필요)

smtp.host = smtp.gmail.com

smtp.port = 465

smtp.ssl = true

smtp.user = "내이메일@gmail.com"

# Be careful!!! Not to leak password

smtp.password = "password"

smtp.domain = gmail.com

#true to use mock mailer for testing, false for using real mail server

smtp.mock = false

# optional, size of mail archive for tests, default: 5

smtp.archive.size = 5

~~~~

(나머지 설정은 필요 시 확인 후 수정)


* 설정 변경 후 다시 컨테이너 시작하면 정상적으로 실행됩니다.



[옵션 몇가지]

* 설정 파일 : /home/yona/data/conf/application.conf


- 가입시 관리자가 승인해야 하는 기능

# signup.require.admin.confirm = true


- 특정 도메인의 이메일만 수신을 가능하게 제한하는 기능

# application.allowed.sending.mail.domains = ""


- 최초 가입시 메일로 유효 메일 확인을 하는 기능

# application.use.email.verification = true


- 로그인 하지 않으면 어떠한 페이지도 보이지 않게 만드는 기능

application.allowsAnonymousAccess=true


--------------------------

+ Recent posts