Web Server




왜 43%의 프론트엔드 개발자들은 Vue.js를 배우고 싶어하나?

왜 43%의 프론트엔드 개발자들은 Vue.js를 배우고 싶어하나?

Web Server
Click the link to read the original article: 왜 43%의 프론트엔드 개발자들은 Vue.js를 배우고 싶어하나? ======...
Read More
Vue.js 사용하는 이유 :: 마이구미

Vue.js 사용하는 이유 :: 마이구미

Web Server
Click the link to read the original article: Vue.js 사용하는 이유 :: 마이구미 ===== 이 글은...
Read More
Redis 설치 및 셋팅 [EC2] :: 마이구미

Redis 설치 및 셋팅 [EC2] :: 마이구미

Web Server
Click the link to read the original article: Redis 설치 및 셋팅 [EC2] :: 마이구미 ==========...
Read More
Aws Ec2 인스턴스에 Redis 설치하기

Aws Ec2 인스턴스에 Redis 설치하기

Web Server
Click the link to read the original article: 읽으러 가기 =============== 저는 Read cache를 위해...
Read More
Redis, 레디스를 사용한 데이터베이스 캐싱서버 운영하기

Redis, 레디스를 사용한 데이터베이스 캐싱서버 운영하기

Web Server
Click the link to read the original article: 읽으러 가기 =========== Redis 서버의 구축 및...
Read More
[Spring]스프링 프레임워크 설치하기-eclipse(1)

[Spring]스프링 프레임워크 설치하기-eclipse(1)

Web Server
[Spring]스프링 프레임워크 설치하기-eclipse(1) [Spring]스프링 프로젝트 만들기-eclipse(2)   Click the link to read the original article:...
Read More
Install Apache Tomcat 8.0 and connect Eclipse

Install Apache Tomcat 8.0 and connect Eclipse

Web Server
Install Apache Tomcat 8.0 and connect Eclipse Click the link to read the original article:...
Read More
Windows에서 JDK와 Eclipse 설치, Java 프로젝트 만들기

Windows에서 JDK와 Eclipse 설치, Java 프로젝트 만들기

Web Server
Windows에서 JDK와 Eclipse 설치, Java 프로젝트 만들기 Click the link to read the article: ======...
Read More
A/B Testing?

A/B Testing?

Web Server
A/B Testing? Click the link to go to the original site. ===== A/B testing이란? A/B...
Read More
1 2 3 7
왜 43%의 프론트엔드 개발자들은 Vue.js를 배우고 싶어하나?
Web Server

왜 43%의 프론트엔드 개발자들은 Vue.js를 배우고 싶어하나?

Click the link to read the original article: 왜 43%의 프론트엔드 개발자들은 Vue.js를 배우고 싶어하나?

======

들어가며

최근 Code School의 창업자이자 명강사인 Gregg이 Vue.js 공식 소개 영상을 촬영하였습니다. 쉬운 설명과 짜임새 있는 강의 구성을 잘해서 개인적으로 많이 좋아하는 강사인데요. 이렇게 유명한 교육자가 Vue.js 진영으로 넘어왔다는 건 정말 기쁜 소식인 것 같습니다.

아래의 글은 얼마 전에 Gregg이 Vue.js의 공식 소개 영상을 글로 풀어놓은 미디엄 기사를 번역한 글입니다. 왜 전 세계 43%의 프런트엔드 개발자들이 뷰를 배우고 싶어 하는지 체감할 수 있는 글입니다. 가볍고 유연한 Vue.js 프레임워크의 특징과 배우기 쉬운 점을 가벼운 설명으로 잘 녹여내었죠.

프런트엔드 개발을 시작하시는 분들에게 좋은 정보가 되었으면 좋겠습니다.

서문

전 세계 웹 개발자를 대상으로 한 2017년 자바스크립트의 현황조사에 따르면 Vue.js(이하 뷰 약칭)는 프런트엔드 개발자들이 가장 배우고 싶어 하는 프런트엔드 프레임워크입니다.

왜 이렇게 뷰가 선풍적인 인기를 끌고 있는지 제 생각을 나눠보려고 합니다. 아래에서 뷰로 간단한 앱을 만들어볼 거예요.

저는 최근에 에반 유(Vue.js 창시자), 크리스, 사라, 아담과 함께 뷰 소개 비디오를 만들었습니다. 소개 비디오는 여기서 찾으실 수 있구요. 아래의 글은 이 영상을 글로 풀어낸 것입니다.

위대한 자바스크립트의 진화

아마 다들 아시겠지만 자바스크립트는 지난 10년간 굉장히 많이 성장해왔어요. 서버 쪽에서 처리되던 코드들이 거의 다 브라우저로 넘어왔죠. 브라우저에서 처리해야 할 코드들이 많아지면서 프레임워크가 점점 더 그 코드들을 체계적으로 관리하게 되었습니다.

angular, react, vue.js

위에 보시는 프레임워크 앵귤러, 리액트, 뷰 중에 어떤 게 더 낫다 라고 얘기하지 않을 겁니다. 하지만, Vue.js 공식 문서를 보시면 세 개의 프레임워크가 잘 비교되어 있으니 참고해보세요.

뷰는 진입 장벽이 낮고, 유연하고, 성능이 우수하고, 유지 보수와 테스팅이 편리한 자바스크립트 프레임워크입니다. 뷰는 또한 점진적인 프레임워크를 지향합니다. 이는 웹 애플리케이션 전체를 프레임워크로 구조화하지 않아도 웹 애플리케이션의 작은 부분에만 적용하여 특정 화면에 더 나은 사용자 경험을 제공할 수 있는 걸 의미해요.

아니면 웹 애플리케이션 전체를 처음부터 뷰로 구현할 수 있죠. 뷰는 거대한 규모의 애플리케이션을 개발할 수 있게 핵심 라이브러리와 주변 생태계를 제공합니다. 점진적인 프레임워크로서의 vue.js

다른 프런트엔드 프레임워크처럼 뷰는 재사용이 가능한 컴포넌트로 웹 페이지를 구성할 수 있습니다. 각각의 컴포넌트는 각 페이지 영역을 표시하기 위해 필요한 HTML, CSS, 자바스크립트를 갖고 있죠. vue.js 컴포넌트로 구성한 웹 페이지 구조

첫 번째 프로젝트 시작하기

뷰를 아직 사용 안 해보신 분들을 위해 뷰로 코딩하는 느낌이 어떤 건지 보여드리려고 합니다. 그리고 문법도 간단히 한번 살펴볼께요. 정말 자세한 내용은 다루지 않을 겁니다. 다만, 뷰의 주요 컨셉이 어떤 건지 알아볼게요.

대부분의 자바스크립트처럼 우리도 페이지에 데이터를 표시하는 것으로 시작해보겠습니다. 데이터 집어넣기

위 그림처럼 뷰로 ‘Boots’라는 데이터를 ‘X’에 넣고 싶으면 아래와 같이 구현합니다. vue.js 인스턴스로 표현하기

위에서 보시는 것처럼 뷰 라이브러리를 불러와서 뷰 인스턴스를 생성하고, ‘app’이라는 화면 요소에 연결하였습니다. 여기서 el은 인스턴스가 뿌려질 화면 요소를 의미합니다. 그리고 data 안에 표시하고 싶은 값을 정의하여 화면에 }}로 연결했죠.

위 코드를 동작시키면 아래와 같이 나옵니다. vue.js 인스턴스 결과화면

여기서 특별한 건 없어요. 다만 데이터가 변할 때 뷰의 마법이 시작됩니다. 제가 이제 개발자 도구의 콘솔 창으로 가서 product의 값을 변경해볼게요. 어떤 일이 일어나는지 보세요. 콘솔에서 데이터 변경

뷰는 리액티브(Reactive)합니다. 이 말은 웹 페이지 상에 표시된 데이터가 변할 때 뷰에서 다 알아서 그 변경을 처리하는 것을 의미합니다. 이 동작은 문자열뿐만 아니라 모든 유형의 데이터에 모두 적용됩니다. 어디 한번 문자열 대신에 배열을 넣어볼까요? 그리고 HTML은 아이템 목록을 나타낼 수 있게 ul 태그로 바꿨습니다. product의 개수만큼 li 태그를 생성하려면 v-for라는 특별한 속성을 사용합니다. 이렇게 하면 데이터의 개수만큼 li 태그가 찍혀져 나오죠. v-for 디렉티브

이제 브라우저로 가서 코드를 실행하면 아래와 같습니다. v-for 디렉티브 결과

아직 코드가 살짝 부자연스럽네요. 어디 빈 배열로 시작해서 데이터를 불러와 담아볼까요? 불러올 데이터는 데이터베이스에서 가져온다고 가정합시다. API로 가져온 데이터 목록 표시하기

위 코드가 실행된 결과는 아래와 같습니다. vue.js 결과 화면

보시는 것처럼 현재 목록의 각 아이템은 데이터를 받아온 객체를 표시합니다. 좀 더 사용자가 보기 편하게 데이터 표현 방식을 아래와 같이 바꿔봅니다. vue.js의 데이터 표현방식

그럼 결과는.. vue.js 결과화면

각 아이템 중에 혹시 개수(quantity)가 0인게 있으면 사용자가 인지할 수 있도록 조금 다르게 표시해볼까요? span 태그로 item.quantity === 0 일 때만 OUT OF STOCK 텍스트가 나타나게 하겠습니다. 여기서 이 조건을 위해 v-if 디렉티브를 사용합니다. v-if 디렉티브 사용

아이템 중에 jacket의 재고가 다 떨어졌었네요. 아래와 같이 말이죠. v-if 디렉티브 vue.js 결과화면

만약 모든 상품(product)의 총 재고량을 목록 아래에 표시하려면 어떻게 해야 할까요? totalProducts라는 computed 속성을 활용하면 됩니다. 만약 자바스크립트 reduce() API가 익숙하지 않으시다면 여기서는 그냥 각 상품의 재고의 총합을 구하는 동작이라고 생각하세요. vue.js의 computed 속성

아래에서 볼 수 있듯이 이제 모든 상품의 총 재고량이 표시됩니다. vue.js의 computed 속성 결과 화면

자 이제 뷰 개발자 도구(Vue.js Chrome Extension)을 알아보기 좋은 시간이네요. 개발자 도구의 장점 중 하나는 페이지 상에 표시된 데이터를 살펴볼 수 있다는 점입니다. vue.js 개발자 도구

뷰의 반응성(Reactivity: 데이터가 변함에 따라 뷰에서 반사적으로 화면을 변화시키는 특성)을 다시 살펴볼까요. 아이템 2개를 제거해보겠습니다. 아래 보시는 것처럼 상품 목록뿐만 아니라 남은 상품의 총 재고량도 바뀌네요.

vue.js 반응성 reactivity

다음으로, 버튼을 이용해서 페이지에 이벤트를 추가해보겠습니다. 각 상품 아이템에 Add라는 버튼을 추가합니다. 그리고 버튼을 클릭했을 때 각 상품의 재고량을 1개씩 늘리겠습니다. vue.js 버튼 클릭 이벤트 v-on

아래를 보시면 각 상품의 Add 버튼을 클릭했을 때 각 상품의 재고와 총 재고량 숫자가 올라갑니다. 그리고 Jacket 상품의 Add 버튼을 클릭하면 OUT OF STOCK이라는 글씨도 사라지네요. vue.js v-on 디렉티브 결과 화면

허나 여기서 만약 각 상품의 재고량을 그냥 수기로 입력하고 싶으면 어떻게 해야 할까요? 인풋 박스를 하나 만들고 v-model 디렉티브를 연결해봅니다. 그리고 입력되는 값은 항상 숫자라고 지정할게요. vue.js v-model 디렉티브

이제 모든 아이템의 재고 숫자를 직접 입력하여 변경할 수 있습니다. 만약 0을 입력하면 자연스럽게 OUT OF STOCK이 함께 표시되네요. 그리고 아까 추가했던 Add 버튼도 정상적으로 동작합니다. vue.js v-model 디렉티브 결과 화면

여기까지 살펴본 코드는 JSFIDDLE에서 살펴볼 수 있습니다.

몇 개 더 살펴보는 뷰의 특징

만약 큰 애플리케이션을 만든다라고 하면 여러 개의 컴포넌트로 조합해야 합니다. vue.js single file components

뷰는 CLI(Command Line Interface) 명령어 도구로 쉽게 프로젝트를 생성할 수 있습니다. 아래 명령어로 프로젝트를 시작하시면 돼요.(뷰 CLI 도구는 미리 설치되어 있어야 합니다)

vue.js CLI 도구

그리고 컴포넌트별로 .vue 파일을 생성해 관리할 수 있어요. .vue 파일에는 HTML, 자바스크립트, 컴포넌트별 CSS & SCSS가 들어갑니다. vue.js 컴포넌트 체계

자 지금까지 뷰가 할 수 있는 기능 중 정말 빙산의 일각만 보셨습니다. 뷰에는 프런트엔드 화면을 개발하고, 구성하고, 빌드 하기 위한 더 많은 기능들이 있죠. 만약 뷰를 배우고 싶어 하신다면 아래의 2가지 자료를 추천드립니다.

  1. VueMastery의 뷰 가이드 & CheatSheet
  2. Vue.js의 공식 문서

마무리

위에서 살펴본 그렉의 설명 말고도 가볍게 Vue.js의 특징을 살펴볼 수 있는 글이 있습니다.

그리고 위 블로그 글이 마음에 드셨다면 저의 Vue.js 책으로 Vue.js를 시작해보시는 건 어떨까요? 🙂

Vue.js 온라인 강좌

책을 볼 시간이 없으시다면 아래 온라인 강좌로 빠르게 배워보시는 것도 좋을 것 같습니다 🙂

인프런 온라인 강좌 : Vue.js 초급, Vue.js 중급, Webpack (좌측 부터)
Vue.js 사용하는 이유 :: 마이구미
Web Server

Vue.js 사용하는 이유 :: 마이구미

Click the link to read the original article: Vue.js 사용하는 이유 :: 마이구미

=====

이 글은 Vue, Angular, React 를 비교하는 글이 아닌 단순히 Vue.js의 장점을 다룬다.

Vue 이외에는 눈으로만 보았기에, Vue에 편중되어 보여질 수도 있다는 점을 미리 언급한다.

세가지 비교는 참고 링크를 읽어보길 바란다.

읽기 전 참고할 링크 – Virtual DOM && Top 7 reasons Vue.js && Vue, Angluar, React 비교

Vue는 요즘 핫한 자바스크립트 프레임워크로 사용되고 있다.

React와 Angular가 항상 비교 대상이였지만, Vue의 등장으로 크게 3가지로 비교되고 있다.

Vue의 등장은 신선했다.

왜냐하면 Vue.js는 혈통 없이 React와 Angular의 성공과 실패로부터 만들어졌다.

크게 React(Virtual DOM)와 Angular(양방향 바인딩)의 장점을 가져왔기에, 반은 먹고 들어간다.

Vue.js의 장점들은 다음과 같다.

1. 학습 곡선이 낮다.

Vue를 접해보았다면, 굉장히 쉽다는 것을 느꼈을 거라 생각한다.

사실 사람마다 틀릴 수 있으나, 알려진 학습 곡선은 Angular > React > Vue 순이 된다.

본인의 경우에도 Angular와 Vue를 비교했을 때, Angular는 굉장히 어려웠고, Vue는 굉장히 쉬웠다.

Vue의 공식 문서도 이해하기 쉽게 설명했다고 생각한다.

한글 번역까지 많은 분들이 기여해주셔서, 두려워할 필요가 없다.

2. 컴포넌트

대규모 프로젝트에 있어, 유지보수와 재사용성을 높이기 위해 작은 단위로 쪼개어 관리한다.

현재 개발 구조로 이미 컴포넌트 방식이 대세이고, 당연하게 그렇게 진행되고 있는 추세이다.

이 부분은 Vue, Angular, React 모두 동일한 부분이다.

다른 점은 본인이 Vue에서 가장 극찬하는 부분이 있다.

바로 “단일 파일 컴포넌트” 이 부분이다.

App.vue

<template lang=”html”> <div> {{ msg }} </div> </template> <script> export default { data () { return { msg: “Hello World” } } } </script> <style scoped> </style>

위와 같이 .vue 파일 하나에 html, css, js를 작성할 수 있다.

결과적으로 단일 파일 컴포넌트는 캡슐화를 제공하게 된다.

이로써, 보다 깨끗하고 풍부한 컴포넌트를 표현할 수 있다.

마치 생소한 용어일 수도 있으나 Shadow DOM 같은 느낌이 든다.

React에도 필요한 경우 Shadow DOM 관련 모듈을 사용하는 것을 볼 수 있다.

그와 달리 Vue는 단일 파일 컴포넌트를 사용하면 다른 작업 필요없이 관련 효과를 낼 수 있다.

* Shadow DOM – DOM 및 CSS 캡슐화 목적. (관련 문서 – Shadow DOM)

하지만 React의 jsx 문법과 같은 것을 선호한다면, 이 부분에 대한 생각이 다를 수 있다.

* 단일 파일 컴포넌트는 권장하지만, 의무적인 것은 아니다.

3. 성능

Vue.js는 가볍고 빠르다.

Virtual DOM에 있어서도, React와 비교해서 보다 효과적인 성능을 낸다고 알려져있다.

그렇기에, 적은 오버헤드와 빠른 성능을 낼 수 있다.

4. View 최적화

Vue의 디자인은 MVVM 패턴에 영감을 받아서, View에 최적화되어있다.

DOM 조작에 있어, 기존 jQuery를 통한 DOM 조작은 더이상 필요하지 않다.

관련 내용은 링크를 참고하길 바란다. “jQuery 더이상 쓰지 않아야하는가?”

View에 최적화되어 있기 때문에, View의 동적 변화에 대한 처리가 매끄럽고 용이하다.

또한 페이지 전환 및 이벤트에 따른 애니메이션 작업에 있어, 개발하기에 좋다.

그에 관련된 transition과 transition-group 태그가 따로 분리되어 있어, View에 중점된 모습을 볼 수 있다.

관련 문서 – https://kr.vuejs.org/v2/guide/transitions.html

5. 많은 모듈

중앙 집중식 상태 관리 저장소를 위한 vuex

SPA를 위한 vue-router

유효성 검증을 위한 vue-vaildator

HTTP, Ajax를 위한 vue-resource

Vue에 최적화된 개발자 모드를 위한 vue-devtools 등등…….

효율적이고, 필요한 모듈이 웬만하면 존재하고, 이것 또한 학습곡선이 높지 않다.

6. 가능성

그래도 현재 React가 점유율에서 막강하다.

하지만 입문에 관한 통계를 보면, Vue가 훨씬 가파른 곡선이 보여지고 있다.

통계 자료나 세미나 및 컨퍼런스의 주제를 봐도 현재 많이 도입되고 있는 상황이라고 본다.

긍정적으로 바라보고 있기에, 앞으로도 기대해볼만하다.

출처: http://mygumi.tistory.com/206?category=697395 [마이구미의 HelloWorld]

Redis 설치 및 셋팅 [EC2] :: 마이구미
Web Server

Redis 설치 및 셋팅 [EC2] :: 마이구미

Click the link to read the original article: Redis 설치 및 셋팅 [EC2] :: 마이구미

==========

이번 글은 Redis 설치 및 셋팅에 대해 다뤄본다.

본인은 Amazon EC2 인스턴스를 사용한다.

12개월간 무료인 서비스가 있으니 몰랐다면 좋은 경험이 될 것이다. (Amazon EC2 Free Tier)

OS는 Amazon Linux AMI 기준으로 글을 작성한다.

Redis 설치와 셋팅을 알아보자.

여기서 셋팅은 조금 더 효율적으로 Redis를 설치하여 사용하는 법을 말한다.

예를 들어 일반적으로 설치를 하면 Redis Server를 실행하더라도 Server가 죽으면 Redis Server 또한 죽는다.

개발 시에는 문제가 없지만, 실제 서비스라면 문제가 된다.

우선, Server를 업데이트하고, Toolchain을 설치해야한다.

*Toolchain – System의 Compile 환경이라고 생각하면 된다.

sudo yum -y update

sudo yum -y install gcc make

그 후, Redis를 다운로드하자.

다운로드 URL은 자신이 원하는 버젼이 있다면 확인하여 다운로드해야한다. (Download)

sudo wget http://download.redis.io/redis-stable.tar.gz

sudo tar xvzf redis-stable.tar.gz

cd redis-stable

make

사실상 Redis 설치가 끝났다.

Redis 작동 여부는 명령어를 통해 확인할 수 있다.

redis-stable/src 디렉토리 기준

redis-server

redis-cli ping

=> PONG

결과적으로 Redis 작동에 문제가 없지만 FULL PATH 를 통해 명령어를 실행하는 불편함이 존재한다.

경로없이 실행하게 셋팅해보자.

redis-stable 디렉토리 기준

sudo cp src/redis-server /usr/local/bin/

sudo cp src/redis-cli /usr/local/bin/

OR

sudo make install

어느 경로에서도 redis-server 명령어가 실행되는 것을 볼 수 있다.

AMI는 /usr/local/src 환경 변수 경로이다. OS마다 다르므로 다른 OS일 경우 확인하길 바란다.

위 절차를 통해 설치 후 사용해도 무관하다.

하지만 위에서 언급했듯이 매번 서버를 시작해야하는 문제가 발생한다.

해결하기 위한 효율적인 방법을 통해 이어나가보자.

먼저 디렉토리 생성과 파일들을 복사해야한다.

redis-stable 디렉토리 기준

sudo mkdir -p /etc/redis /var/lib/redis /var/redis/6379

sudo cp redis.conf /etc/redis/6379.conf

그 후, config 파일을 열어보자.

sudo vi /etc/redis/6379.conf

파일 안의 옵션들을 아래와 같이 수정하자.

bind 127.0.0.1

daemonize yes // default => no

logfile /var/log/redis_6379.log

dir /var/redis/6379

수정을 했다면, init script를 설치하자.

sudo wget https://raw.githubusercontent.com/saxenap/install-redis-amazon-linux-centos/master/redis-server

sudo mv redis-server /etc/init.d

sudo chmod 755 /etc/init.d/redis-server

redis-server 를 열어보자.

sudo vi /etc/init.d/redis-server

그 후, config 파일 참조 경로를 변경해주면 된다.

REDIS_CONF_FILE=”/etc/redis/6379.conf”

이제 Redis Server의 자동 실행을 위해 chkconfig 명령어를 사용한다.

sudo chkconfig –add redis-server

sudo chkconfig –level 345 redis-server on

sudo service reids-server start

결과적으로, 서버를 재시작하여도 Redis Server 또한 재시작 되는 것을 볼 수 있다.

마지막으로 Redis는 비밀번호(암호)를 설정할 수 있다.

관련 config 파일의 옵션을 수정해주면 된다.

sudo vi /etc/redis/6379.conf

requirepass는 주석 처리(#)가 되어있을 것이다.

requirepass 1234

수정 후 Redis Server를 재시작해주면 비밀번호가 설정이 된다.

혹시나 문제점이 있다면 댓글을 통해 알려주면 감사하겠다.

참고  URL

https://redis.io/topics/quickstart

https://medium.com/@andrewcbass/install-redis-v3-2-on-aws-ec2-instance-93259d40a3ce#.iu8eo6rno

출처: http://mygumi.tistory.com/133 [마이구미의 HelloWorld]

Aws Ec2 인스턴스에 Redis 설치하기
Web Server

Aws Ec2 인스턴스에 Redis 설치하기

Click the link to read the original article: 읽으러 가기

===============

저는 Read cache를 위해 별도 EC2 인스턴스를 띄우고 redis를 사용하였습니다.

EC2 create

  • aws amazone linux AMI를 선택합니다.
  • security group 에 16379, 6379 포트를 추가합니다.
  • 인스턴스 생성완료

Linux updates

ssh로 접근해서 업데이트를 실행합니다.

$ sudo yum -y update
$ sudo yum -y install gcc make

Download Redis

참고: http://redis.io/download

$ cd /tmp
$ wget http://download.redis.io/releases/redis-4.0.0.tar.gz
$ tar xzf redis-4.0.0.tar.gz
$ cd redis-4.0.0
$ make

Create Directories and Copy Redis Files

$ sudo mkdir /etc/redis 
$ sudo mkdir /var/lib/redis
$ sudo cp src/redis-server src/redis-cli /usr/local/bin/
$ sudo cp redis.conf /etc/redis/

Configure Redis.Conf

conf 설정 파일을 수정합니다.

$ sudo vim /etc/redis/redis.conf

아래 내용 외 나머지 부분은 기본값을 유지합니다.

[..]
daemonize yes
[..]
  
[..]
bind 0.0.0.0
[..]
  
[..]
dir /var/lib/redis
[..]
  
logfile /var/log/redis_6379.log

Setting Redis-Server init script

참고: https://github.com/saxenap/install-redis-amazon-linux-centos

  • 자동 실행을 위한 스크립트를 다운 받습니다.
  • Redis-Server 파일 이동 후 권한을 설정합니다.
      $ sudo mv redis-server /etc/init.d
      $ sudo chmod 755 /etc/init.d/redis-server
      $ sudo vim /etc/init.d/redis-server
    	
      ->  redis="/usr/local/bin/redis-server" 확인
    
  • Redis-Server Auto-Enable 설정
      $ sudo chkconfig --add redis-server
      $ sudo chkconfig --level 345 redis-server on
    

Start Redis Server

드디어 서버를 실행합니다.

$ sudo service redis-server start
$ redis-cli ping -> PONG

강제 종료시
$sudo service redis-server stop
Redis, 레디스를 사용한 데이터베이스 캐싱서버 운영하기
Web Server

Redis, 레디스를 사용한 데이터베이스 캐싱서버 운영하기

Click the link to read the original article: 읽으러 가기

===========

Redis 서버의 구축 및 운영 등 여러가지 방안에 대하여 생각한 바를 정리한 내용이다. 먼저 Redis 서버가 필요한 이유는 무엇일까…

# Why Redis?

Redis를 왜 구축하는가를 아려면 Redis가 무엇인지부터 알아야한다.

! Redis란?Redis는 데이터베이스의 여러 솔루션 중 하나로 메모리를 사용하는 키, 밸류 형식의 데이터베이스이다. Redis의 최고 장점은 메모리를 사용하기 때문에 매우 빠른 속도를 자랑한다. 일반적인 하드 디스크에 비하여 상대적으로 엄청나게 빠를수도 있다. 다만 메모리라는 제약으로 공간이 크지 않고 키, 밸류(Key, Value) 형식의 입출력 방식이기에 복잡한 데이터베이스에 적합하지 않다.

위 내용만으로도 장점과 단점이 너무 극명하다. 빠르나 효과적인 주 데이터베이스로 사용하기에 다소 어려워보이는 점이다. 또한 공간이 많아질수록 비용이 급격히 올라가므로 이를 고려한다면 Redis는 빛좋은 개살구일 수 있다… 하지만! 대부분 Redis를 보조 데이터베이스 역할로 그 가치를 최대한 끌어내어 활용하고 있다. 그 중 Redis에 가장 적합한 것이 바로 데이터베이스 캐싱(Caching)이다.

! Caching Database Server캐싱(Caching)은 말 그대로 미리 읽어두었다가 요청이 올 경우 빠르게 응답하기 위한 목적으로 사용할 수 있다. 이 경우 전체 데이터가 필요없고 데이터 역시 계속 유지될 필요가 없기에 Redis처럼 적은 공간의 데이터베이스에 최적이다. 게다가 빠른 속도의 메모리를 사용하므로 잘 이용한다면 Redis 캐싱은 선택이 아닌 필수가 아닐까? 어찌보면 Redis는 캐싱을 위해 존재하는지도…

! 데이터베이스 캐싱… 꼭 필요한가?사실 이런 의문이 들 수도 있지만 모든 컴퓨터의 입출력 기술에는 알게 모르게 많은 부분이 캐싱되어 사용되고 있다. 메모리에 올려져 눈에만 안 보일 뿐 대부분이 이미 캐싱되어있지 않을까? 그렇다면 이번에는 웹서비스의 환경을 생각해보자. 아카마이나 CloudFront 등이 서버에서… 데이터베이스 역시 Redis Oracle의 TenTimes등에서 캐싱이 이뤄지고… 로컬 역시 다양한 방식으로 캐싱되며 localStoragesessionStorage를 사용해서도 클라이언트측 캐싱 서비스가 구축된다.

특히 대용량데이터나 컨넥션이 빈번하게 네트워크가 사용된다면 이에 따른 성능차이는 말로 표현하기 어렵다. 아키텍쳐에서 빠질 수 없는 부분이 바로 캐싱이며 어떻게 구축하고 운영하는가가 매우 중요하다.

# Redis 서버의 운영

여기까지 Redis의 장점과 필요성을 알아봤다면 이제 실제 운영을 위해 고민해보자. 일단 앞에 언급했듯이 Redis를 단독으로 주 데이터베이스로 사용하는 것은 무리가 있다. 텍스트 위주의 데이터라면 가능할 수 있으나 차라리 Expire 시점을 짧게 설정하는 편이 더 나을 것이다. 이는 뒤에 또 다루겠다.

어쨌든 Redis는 별도 서버로 구축되어 주서버와 지속적인 서비스를 주고 받는 방법이 효과적이다. 요즘은 하나에 모든 것을 관리 운영하기 보다 각각의 기능, 필요에 따른 마이크로 서비스(Micro Service) 형태로 많이 운영되어진다.

# CRUD에 따른 Redis 데이터 처리

Redis서버는 Client에서 Read 요청이 들어올때 주서버로부터 값을 가져와 저장한다. 이때 주서버와 싱크된 데이터 이 외에 추가로 데이터 만료시점을 처리하기 위해서 현재시간이나 만효시간을 함께 저장해야한다.

다음은 클라이언트의 Read 요청에 따른 처리과정으로 아래를 따르게 된다.

! Read 요청시– 방문자, 사용자의 새로운 데이터 서버에 요청
– Redis 서버에서 요청 데이터가 있는지 확인
– 데이터가 존재하는 경우 만료여부 확인 후 이 정보를 반환
– 정보를 반환한 경우 시간을 현재로 업데이트 후 종료
– 데이터가 만료되었거나 없는 경우 삭제 후 주 서버에 요청
– 주 서버에서 받은 데이터를 캐싱, 데이터베이스에 저장
– 이 값을 방문자에게 반환 후 종료

! CUD Create, Update, Delete 요청시이 경우 앞의 과정과는 조금 다르다. 그 이유는 데이터에 변화가 생겼으므로 해당하는 값의 데이터는 캐싱 값이 아닌 현재 실시간 정보를 보내주는 것이 효과적이기 때문이다. 캐싱 만료시간이 아무리 짧게 설정되어도 없는 데이터를 사용자가 보게되는 일으도록 해야할 것이다. 그러기 위해 필요한 조치는 비교적 간단하다. CUD 요청시 아래와 같이 처리한다.

– 방문자가 CUD를 서버에 요청
– CUD 요청을 주서버에 반영하여 업데이트
– 변경된 데이터 값을 캐싱데이터인 Redis에서 찾아 삭제 후 종료

여기서 가장 중요한 점은 캐싱을 제공하는 경우 단순하게 정보를 제공하는 주분만 고려하는 것이 아니라 다양한 상황에 대처해야한다는 점이다. 이 중 한 가지가 위와같이 CUD처럼 데이터에 중요한 변경사항이 있는 경우 기존의 캐싱 데이터를 삭제처리하는 과정이다.

! 마치면서여기까지 Redis 서버에 대하여 간략하게 알아보았다. 서비스를 구축할때 나도 이런 서비스를 제공한다라는 점보다 어떻게 제공하느냐가 매우 중요하다. 캐싱의 방법 역시 다양한 관점에서 고민하고 제공되어야 할 것이다.

! 추가내용위와같이 클라이언트 사용자의 요청에 따라 데이터를 만료하는 경우 요청이 없는 데이터가 불필요하게 오래 남을 수 있다. 이런 이유로 정기적인 시점… 특히 방문자가 적은 새벽 시점에 만료된 데이터를 clear하는 처리가 요구된다. 이런 작업은 Cron이나 AWS의 람다를 이용하는 것도 좋은 방법이다.

[Spring]스프링 프레임워크 설치하기-eclipse(1)
Web Server

[Spring]스프링 프레임워크 설치하기-eclipse(1)

[Spring]스프링 프레임워크 설치하기-eclipse(1)

[Spring]스프링 프로젝트 만들기-eclipse(2)

 

Click the link to read the original article:

=========================

자바를 하는 사람이 결국 한번은 거치게 되는 것이 spring프레임워크이다.

우리나라에서는 spring프레임워크는 자발 개발 표준 프레임워크이다.

필자는 빅데이터 수업을 들었는데 그 빅데이터 수업에서 강사님이 원래는 표준이 스프링이 아니였고

표준이 없어서 삼성은 삼성대로, LG는 LG대로 프레임워크를 썼다고 했다.

그러나 요즘은 스프링으로 통일되어 가는 분위기이다.

필자는 파이썬이(flask)나 nodejs(express)등의 프레임워크들을 접해봤다.

자바를 먼저배운것치고 자바 프레임워크를 오히려 늦게 배운편인데 spring은 조금 어렵다.

진입장벽이 있다는 말이다. spring의 명세는 저 프레임워크들보다 더 빡빡하고 더 체계적이다.

아마 오래되서 그런것일까? 아니면 필자가 잘 몰라서 그런것일까? 그건 잘 모르겠다.

어쨋던 spring을 제대로 알기위해서는 디자인패턴에대한 심도깊은 이해가 필요하다.

디자인패턴들을 그냥 아무렇지 않게 사용하는 경향이 있다.

예를 들어 spring의 근간을 이루는 mvc패턴은 말할것도 없으며

singleton, factory, dto, dao등의 패턴을 “이미 안다는 전제하”에서 시작한다.

따라서 spring을 쓰기위해서는 이 디자인패턴을 미리 알고 접근하는것이 매우매우매우 중요하다.

또한 spring은 jsp와 servlet을 근간으로 하기에 이 문법역시 알고 있어야하며

jdbc나 junit등의 표준에 가까운 라이브러리들도 알고 있어야하고

빌드 시스템인 maven(사실 메이븐이 강제는 아닌데 보통은 메이븐을 쓴다.)에 대해서도 이해해야한다.

그리고 깨알같이 알고 있어야하는 xml도 덤이다. 즉 spring프레임워크는 자바를 제대로 이해한 사람이

제대로된 프로젝트를 만들기위해서 사용하는 궁극의 비기(라고 말하면 개 중2병 같지만)같은 것이다.

결론부터 말하면 위에 것들을 모르면 그냥 배우지 말라는 것이다.

이들을 모두 알고 spring을 배우고 싶다면 필자의 Programming-Java-Spring의 강의를 보면된다.

여기서는 스프링 프레임워크를 사용하고 싶은 사람들은 어떻게 사용하면 되는지에 대해서 알려주는 강의이다.

스프링 프레임워크는 사실 설치라는 개념은 아니다. 그냥 jar파일을 추가하고 나면 자기 입맛대로 할 수도 있다.

근데 그렇게 하기엔 생산성도 너무 떨어지기에 그겋게 하는것을 추천하지는 않는다.

이클립스에서는 생산성을 위해서 sts라는 플러그인을 설치할 것이다.

Help->Eclipse Marketplace… 를 클릭해준다.

검색에서 sts를 타이핑해서 검색을하면 Spring Tool Suite를 다운받아준다.

다운을 하게되면 해당 라이브러리에 대한 설치가 진행된다.

이제 라이선스를 확인해준다.

이제 설치가 되는데 재시작을 해주면된다.

이제 다시 시작하면 스프링 프레임워크 대시보드가 추가된게 보인다. 이제 스프링 프레임워크를 사용할 준비가 되었다.

Install Apache Tomcat 8.0 and connect Eclipse
Web Server

Install Apache Tomcat 8.0 and connect Eclipse

Install Apache Tomcat 8.0 and connect Eclipse

Click the link to read the original article:

==============================

 » 프로그래밍+DB » Apache Tomcat 8.0 설치 + Eclipse 연결

Apache Tomcat 8.0 설치 + Eclipse 연결

이번에는 JSP, Servlet 사용을 위한 Tomcat 8.0 + Eclipse 연계 방법을 알아봄.

clip_image001

http://tomcat.apache.org/download-80.cgi 에서 Windows Service Installer 다운로드(8.0.x)

clip_image002

next

clip_image003

I Agree

clip_image004

Next

clip_image005

포트 확인 후 Next

clip_image006

Next

clip_image007

Install

clip_image008

Run Apache Tomcat… 조금 기다립니다.

clip_image009

알림 영역의 Apache Tomcat 9.0 아이콘을 더블클릭.

clip_image010

서비스를 중지합니다.

clip_image011

Eclipse에서 Window -> Open Perspective -> Other…

clip_image012

Java EE를 선택, OK

clip_image013

Window -> Preferences

clip_image014

Runtime Environments

clip_image015

Apache Tomcat v8.0 선택 후 Next

clip_image016

C:\Program Files\Apache Software Foundation\Tomcat 8.0

위 경로를 선택한 후, Finish

clip_image017

OK

clip_image018

Servers 탭에서 new server 생성

clip_image019

Tomcat v8.0 Server 선택 후, Next

clip_image020

Finish

clip_image021

Project Explorer의 Servers에 Tomcat v8.0 Server at localhost-config 가 추가되면 OK!

clip_image022

Dynamic Web Project 생성

clip_image023

test

clip_image024

새로 생성된 프로젝트의 WebContent에 HTML 파일 추가

clip_image025

index 입력, Finish

clip_image026

Hello World! 내용 추가

clip_image027

index.html -> Run As -> Run on Server

clip_image028

서버 선택 후 Next

clip_image029

우측에 test(프로젝트 이름)이 추가된 것을 확인 후, Finish

clip_image030

성공입니다. ^^

Windows에서 JDK와 Eclipse 설치, Java 프로젝트 만들기
Web Server

Windows에서 JDK와 Eclipse 설치, Java 프로젝트 만들기

Windows에서 JDK와 Eclipse 설치, Java 프로젝트 만들기

Click the link to read the article:

======

윈도에서 자바 프로그래밍을 하기 위해 JDK(Java Development Kit)를 설치하고 이클립스를 설치해 자바 프로젝트를 만드는 과정을 설명합니다.

JDK는 자바 프로그래밍 언어를 사용해 애플리케이션을 개발할 수 있게 해주는 개발 환경입니다.

개발할 일이 없는 일반 사용자는 JRE(Java Runtime Environment)만 있으면 자바 프로그램을 실행할 수 있습니다.

JDK에는 JRE + 개발에 필요한 것들(자바 컴파일러 javac.exe 등)이 있습니다.

이클립스는 애플리케이션 개발을 도와주는 무료 소프트웨어입니다.

 

목차

  1. 윈도에서 JDK 설치
  2. 이클립스 설치
  3. 자바 프로젝트 만들기

 

윈도에서 JDK 설치

jdk download를 검색해 가장 위에 나오는 오라클 사이트에 들어갑니다.

Java Download 버튼을 누릅니다.

라이선스 동의에 체크 후 현재 OS에 맞는 설치파일을 받습니다.

설치파일을 실행합니다.

설치 경로는 Program Files 아래 Java 폴더입니다.

 

이클립스 설치

eclipse를 검색하고 가장 위에 나오는 이클립스 사이트에 들어갑니다.

download 버튼이 잘 보입니다.

설치파일을 누르면 여러 종류의 IDE(통합 개발 환경)가 나오는데 그 전에 오른쪽 위의 !를 눌러 업데이트를 합니다.

라이선스에 동의해야 합니다.

저는 Java EE 용 IDE를 설치합니다.

처음 인스톨할 땐 오류가 났지만, 다시 시도하니 설치되었습니다. 실행해봅시다.

프로젝트를 만들면 아래 경로 아래에 만들어집니다.

계속 같은 경로를 사용할 테니 묻지 말라는 체크 표시를 하고 넘어갑니다.

처음에 나오는 창은 다시 안 뜨도록 체크하고 닫았습니다.

 

자바 프로젝트 만들기

File – New – Other…를 눌러 Java – Java Project를 만듭니다.

프로젝트 이름은 마음대로 적습니다. Finish를 누릅니다.

Java Perspective를 사용하면 자바로 개발할 때 있으면 좋은 창들이 배치된 화면이 구성됩니다.

창들은 개별 설정할 수 있으니 일단은 추천해주는 대로 사용합시다.

src 폴더에 자바 클래스 파일을 만들어봅시다.

오른쪽 클릭 – New – Class를 누릅니다.

아직 클래스들을 구별할 필요가 없으니 패키지 이름이 없다는 경고는 무시하고 클래스 이름만 넣습니다.

main() 메소드를 자동으로 만들도록 public static void main()에 체크합니다.

만든 클래스 파일에 간단한 println() 코드를 넣었습니다.

실행(Ctrl + F11) 또는 디버그(F11)하면 그 전에 저장하라는 알림창이 뜹니다.

항상 묻지 않고 저장 되도록 체크하고 OK 합니다.

Console 창에 성공적으로 출력이 되었습니다.

A/B Testing?
Web Server

A/B Testing?

A/B Testing?

Click the link to go to the original site.

=====

A/B testing이란?

A/B testing은 웹이나 앱에서 A버전과 B버전을 무작위로 유저들에게 보여주고 어떤 것이 나은지 실험하는 방법이다. 각 버전을 본 유저의 행동 데이터를 통계적으로 분석하여  특정한 변화를 주었을 때 목표를 더 높게 달성하는지 알아낼 수 있다.

사실 A/B testing은 오래전부터 과학에서 쓰여왔던 대조 실험(Controlled experiment)과 본질적으로 같다. 가설을 입증하기 위해 대조군(Controlled group)과 실험군(Experimental group)을 설정하고 결과를 검증하는 것은 과학적 방법론의 기본이다. A/B testing은 이 과학적 방법론을 인터넷 환경에 맞게 실행하는 것으로 볼 수 있다.

A/B testing은 웹/앱 기반 비즈니스라면 누구나 사용하고 있는 필수 도구다. 아마존, 구글, 넷플릭스 등 많은 기업들이 새로운 기능을 테스트하고 디자인을 최적화하기 위해 A/B testing을 활용하고 있다.

구글은 오래전부터 A/B testing을 적극적으로 활용해온 것으로 유명한데, 지금도 꾸준히 한 번에 50개 이상의 A/B test를 진행한다고 한다. 그러니 우리는 인터페이스가 약간 바뀌어도 알아채지 못하거나 신경 쓰지 않지만, 사실 A/B testing의 실험 대상이 되고 있을 수도 있다.

A/B testing이 중요한 이유는 가설을 직관이 아니라 데이터로 증명할 수 있기 때문이다. 사실 디자인에 대해서는 누구나 가설을 세울 수 있지만 증명하기는 어렵다. 만드는 사람 입장에서는 너무나 중요해보이지만 실제로는 아무런 행동을 이끌어내지 못한다거나, 전혀 예상치 못했는데 전환율이 크게 증가한다거나 하는 사례는 비일비재하다.

웹에서는 사용자들의 행동을 트래킹할 수 있기 때문에, 유저들이 실제로 어떻게 반응하는지 정량적으로 측정 가능하다. 실제 유저들의 심리와 행동을 파악하는 귀중한 자료가 되고, 이 피드백을 통해 서비스를 최적화해나갈 수 있다.

A/B testing으로 큰 효과를 낸 사례들을 몇 가지 보자. (Smashing Magazine을 참고했다.)

1. “I’m on twitter”보다 “You should follow Me on Twitter here”가 실제 팔로우 확률이 173% 높았다.

2. 회원가입 버튼 옆에 ‘It’s free!’를 넣으면 버튼을 누를 확률이 28% 증가한다.

3. 문장 스타일 정보 입력 폼을 사용하자 완료할 확률이 25-40%로 증가했다.

A/B testing은 만능이 아니다.

A/B testing은 아주 유용한 툴이지만, 모든 의사결정을 A/B testing으로 해결할 수는 없다. Diane Tang은 A/B testing course에서 이에 대해 “A/B testing은 산을 잘 올라가고 있는지는 말해주지만 어느 산에 올라가야 하는지는 말해주지 않는다.”라고 표현했다. 즉, A/B testing은 최적화 도구일 뿐 큰 그림을 보여주지는 못한다.

자..잠깐, 이 산 맞나?

그래서 A/B testing은 완전히 새로운 기능을 추가하거나, 훨씬 높은 단계의 의사결정에 관해서는 효과적이지 않다. 예를 들어 ‘유료로 이용할 수 있는 프리미엄 기능’을 추가한다거나, ‘현제 시작 페이지에 어떤 문제가 있는가?’ 같은 질문에는 대답하기 어렵다. 따라서 A/B testing을 실행할 때는 아주 구체적이고 명확한 기능, 디자인을 대상으로 하는 것이 좋다.

A/B testing은 웹 로그 분석, 사용성 테스트, 유저 인터뷰 등 보완적인 방법들을 함께 사용해야 한다. A/B testing은 정답을 유추해내는 하나의 단서일 뿐 그 자체가 정답은 아니다.

A/B tesing을 할 때 알아야 할 실험 윤리

Udacity의 A/B testing course(링크)에서는 한 챕터를 ‘Policy and Ethics of in A/B testing’에 할애하고 있다. 미처 생각해보지 못했던 부분이었다. 비록 불특정 다수를 대상으로 하지만 A/B testing도 실험의 일종이기 때문에 실험 과정에서 참가자를 보호할 의무가 있다. 다음 4가지 질문을 기억하자.

첫 번째, 참가자에게 어떤 위험이 따르는가?

‘참가자가 일반적인 일상생활에서 겪는 위험’을 최소 위험이라고 한다. 이를 기준으로 더 큰 위험이 따르는 경우 반드시 참가자의 동의를 얻어야 한다.

두 번째, 참가자들이 어떤 개인 정보가 수집되는지 알고 있는가?

실험 과정에서 민감한 정보를 수집하는 경우도 있다. 민감한 정보란 일반적으로 건강, 의료 데이터나 금융 데이터 등이 해당된다. 이런 정보가 수집되는 경우에는 정보 수집, 처리 과정에 대해 알리고 참가자의 동의를 받아야 한다.

세 번째, 개인 정보가 식별 가능한가?

프라이버시에 관해서 데이터는 다음과 같이 나뉜다.

식별 가능 데이터 (Identified data) : 특정 개인임을 알아낼 수 있는 정보. 이름, 아이디, 주민등록번호, 운전면허 번호, 휴대폰 번호 등이 해당된다.

익명 데이터(Anonymous data) : 식별 가능 정보가 없는 데이터

익명화된 데이터(Anonymous data): 재식 별 위험이 없도록 수정된 데이터

가명화 데이터 (Psuedonymous data) : 무작위로 생성한 쿠키 등을 통해 동일 데이터를 파악할 수는 있지만 개인 식별은 불가능한 데이터

각 데이터의 종류에 따라 프라이버시 보호의 정도가 달라진다. 법적 조항은 각 나라마다 다르다고 한다. 우리나라의 개인정보보호 가이드라인은 개인정보보호 종합포털을 참고.

네 번째, 데이터가 어떤 과정을 거쳐서 처리되는가?

처리 과정에서 어떤 사람들이 접근 권한을 가지고 있으며, 원래 목적으로만 사용되도록 보호하는 조치는 어떤 것이 있는가? 위반 시 어떤 조치를 하는가? 이런 질문에 대해서 미리 답변할 수 있어야 한다.


A/B testing 프로세스

1. 기존에 존재하는 데이터를 모으고 들여다본다.

웹 로그 분석이나 사용자 인터뷰 등 이미 가지고 있는 데이터들에 대해 충분히 이해해야 한다. 곧 설명하겠지만, A/B testing을 하기 위해서는 실험에 필요한 지표, 신뢰 수준, 표본 숫자 등등 많은 것들을 결정해야 한다.

이를 결정할 인사이트를 얻기 위해서는 기존 데이터에서 문제점은 무엇이 있는지, 어떻게 개선할 수 있을지, 지표들의 흐름은 어떠한지, 지표가 변동하는 범위는 어느 정도인지 등을 사전에 파악해야 한다. 유난히 이탈률이 높은 페이지를 찾아보거나, 트래픽이 유난히 높을 때는 언제인지 등등을 눈여겨보자.

2. 목표(Goal)를 구체화한다.

먼저 A/B testing을 통해 궁극적으로 이루고자 하는 목표가 명확해야 한다. 어떤 비즈니스를 하느냐에 따라 목표는 다 다를 수 있다. 예를 들어 취업 포털 사이트라면 ‘더 많은 사람들의 취직을 돕는 것’이 목표일 수 있고 가격 비교 사이트라면 ‘소비자들이 가장 싼 가격에 좋은 물건을 사게 하는 것’이 목표가 될 수 있겠다.

어느 정도 레벨을 목표로 잡느냐에 따라서도 다르다. 높은 수준의 목표라면 ‘더 많은 사람들의 취직을 돕는 것’ ‘유저가 싼 물건을 짧은 시간에 찾을 수 있게 하는 것’ 등이 될 수도 있고, 좀 더 구체적으로는 ‘채용 기업 회원 숫자’나 ‘회원 만족도’를 목표로 할 수도 있다.

목표를 세울 때 중요한 점은 ‘우선순위’의 관점에서 생각해야 한다는 것이다. 당연히 회원 수가 늘면 좋고, 매출이 늘어도 좋고, 만족도가 늘어도 좋다. 하지만 의미 있는 서비스를 만들기 위해서는 그중에서 팀이 가장 중요하게 생각하는 것이 반드시 합의되어야 한다.

다른 말로 하면 이 목표를 위해서는 다른 목표를 희생할 수도 있다는 점을 모두가 동의해야 한다. A/B testing에 있어서 ‘명확한 목표’는 실험을 효과적, 효율적으로 진행하기 위한 기본이다.

3. 지표(Metric)를 선정한다.

목표를 정했다면 그에 맞는 지표(Metric)를 선정해야 한다. A/B testing에서 좋은 지표를 선정하는 것은 아주아주 중요하므로 지표를 선정할 때는 신중하자.

3.1. 목표에 맞는 지표

지표를 선정할 때는 주로 퍼널 분석(Funnel Analysis)을 하게 된다. 퍼널 분석이란 특정 목표를 이루기 위해 필요한 이벤트를 단계적으로 나누어 분석하는 것을 말한다.  다음 단계로 넘어갈수록 깔때기처럼 좁아지기 때문에 퍼널(Funnel, 깔때기) 분석이라고 한다. 이 방법은 전환율(Conversion rate)을 계산함으로써 유저 행동을 단계별로 분석할 수 있기 때문에 유용하다.

서비스에서 유저들이 통과하는 퍼널을 단계적으로 분류해보고 이 과정에서 A/B testing로 개선이 필요한 지표를 선택한다. 1단계에서 기존 데이터를 살펴보았다면, 특별히 유저들이 많이 이탈하는 단계를 먼저 선정할 수 있다.

아니면 미리 설정한 ‘목표’에 가장 큰 영향을 주는 단계의 전환을 지표로 삼는 것도 좋다. 버튼을 클릭하는 것이나 이메일을 열어보는 것 등 측정할 수 있는 거라면 뭐든 지표가 될 수 있다.

3.2. 지표의 종류

지표의 종류는 크게 네 가지 카테고리가 있다.

첫 번째는 ‘웹사이트에 들어온 전체 유저의 숫자’와 같은 합계 지표(Sum)이다.

두 번째는 평균(mean)이나 중앙값(median)이다. 예를 들어 구매까지 걸리는 평균 시간(mean), 첫 구매가 발생할 때까지 방문한 페이지의 중윗값(median) 등이 있다.

세 번째는 확률(probability)이다. 어떤 이벤트가 발생한 경우 1, 아닌 경우 0을 부여해서  전체 확률을 볼 수 있다. 확률 지표는 항상 0과 1 사이에 위치한다.

마지막으로는 비율(Ratio)이 있다. 한 지표를 다른 지표로 나눈다. “결제하기를 누른 횟수 중 구매 완료한 횟수 / 결제하기를 누른 횟수” 같은 식이다.

3.3. 민감도와 강건성

지표를 결정할 때는 민감도(Sensitivity)와 강건성(Robustness) 두 가지를 반드시 고려해야 한다. 우리가 원하는 변화가 발생했을 때 그 변화에 비례해서 움직이는 지표를 민감(Sensitive)하다고 한다. 반대로 목표와 상관없는 변화가 일어났을 때 지표가 움직이지 않으면 강건(Robust)하다고 한다.

예를 들어서 이 ‘시간당 회원가입을 클릭한 횟수’가 지표라고 해보자.

먼저 강건성 체크를 위해 아무것도 바꾸지 않은 상태에서 회원가입을 클릭하는 횟수가 어떻게 변동하는지 본다. 그런데 지표를 보니 아무런 변화를 주지 않았는데도 ‘회원 가입 클릭 횟수’가 큰 폭으로 오르락내리락했다. 실험과 관련된 변화가 없는데도 들쑥날쑥하면 실험 결과가 왜곡될 수 있기 때문에 좋은 지표라고 할 수 없다.

반대로 우리의 목표인 ‘활동 유저 수(Active user)’가 늘어도 ‘시간당 회원가입을 클릭한 횟수’는 별로 변화가 없을 수도 있다. 이 경우에는 충분한 민감하지 못한 지표이기 때문에 역시 적합하지 않다.

기존 데이터나 아니면 작은 실험을 통해서 지표가 이 두 가지 조건을 만족하는지 테스트해보자.

3.4 지표의 정의

한 가지 더 주의해야 할 점은 testing을 하기 전에 지표를 엄밀하게 정의해야 한다는 점이다. 단순히 ‘클릭한 확률(Click-through-rate)’이 지표라고 하더라도 impression을 기준으로 할지, 페이지뷰를 기준으로 할지에 따라 완전히 다르다. ‘클릭한 순간을 트래킹할지 클릭하고 다음 페이지로 이동했을 때 트래킹할지’ 같이 사소해 보이는 문제도 실제 웹상에서는 구현할 때는 완전히 다를 수 있다. 지표를 수식으로 나타내 보고 각 요소를 하나하나 따져보자. 테스팅을 구현하는 개발자와 원활한 소통을 위해서는 지표를 최대한 엄밀하게 정의하는 것이 좋다.

4. 가설을 수립한다.

목표와 지표가 있다면 이제 어떤 변화를 주어야 이 지표가 향상될 수 있을지, 그리고 왜 그럴지에 대해 가설을 세운다.

예시) “결제 페이지를 세 단계에서 두 단계로 바꾸면 결제하기를 클릭한 사람 중 완료한 사람의 비율이 높아질 것이다. 결제 단계가 간단하면 중간에 포기하고 나가는 고객이 줄어들 것이기 때문이다.”

유저 행동에 영향을 미치는 요소라면 무엇이든지 A/B testing 대상이 될 수 있다. 헤드라인, 텍스트, 사용후기, CTA(Call to Action) 버튼, 링크, 이미지, 접기 버튼, 기사 스크랩, 페이지 레이아웃 등등.

여러 가지 가설이 리스트에 있다면 예상되는 효과의 크기와 실행 난이도에 따라서 우선순위를 매기면 된다. 효과가 크고, 실행하기 쉬운 가설부터 실험한다.

5. 실험을 설계한다.

5.1. 분기 단위(Unit of diversion)

먼저 분기 단위(Unit of diversion)를 정해야 한다. 분기 단위(Unit of diversion)는 A그룹(대조군)과 B그룹(실험군)을 나누는 기준을 말한다. 주로 사용되는 3가지는 ID, cookie, event다.

ID의 경우, 로그인이 된 회원의 ID를 기준으로 대조군, 실험군을 나눈다. ID를 사용하면 동일 유저가 시간차를 두고 나중에 다시 접속하거나, 디바이스를 웹에서 모바일로 바꾸더라도 환경이 바뀌지 않아 일관적이다. 하지만 로그인을 하기 전에는 분기를 할 수 없고, 개인 식별이 가능하기 때문에 데이터 수집 시 주의해야 한다.

Cookie란 사용자가 사이트를 방문할 때 생성되는 기록 파일이다. 로그인을 하지 않아도 사용자의 행동을 트래킹 할 수 있다는 장점이 있다. 그래서 웹사이트에 들어가면 “쿠키 정보를 수집합니다”라고 알림이 뜨는 이유다. 다만 브라우저나 디바이스가 바뀌거나 쿠키가 삭제되면 트래킹이 불가능하다는 단점이 있다.

Event을 사용하면 유저가 어떤 행동(event)을 했을 때 무작위로 A 혹은 B의 결과가 나타나게 된다. 즉 ‘회원가입 클릭’이라는 이벤트를 기준으로 한다면, 매번 회원가입을 클릭할 때마다 A 화면이 뜰 수도 있고 B 화면이 뜰 수도 있다. 이 경우 동시에 서비스의 일관성을 많이 해칠 수 있다. 대신 가장 임의화된 (Randomized) 샘플을 뽑을 수 있어서 통계적으로 효과적이라는 장점이 있다.

따라서 Event 분기는 유저가 눈치채기 어려운 A/B testing일 때만 쓰인다. 예를 들어 ‘동영상 로딩 속도’를 높였을 때 ‘동영상을 끝까지 보는 사람의 비율이 늘어나는지 확인’하고 싶다고 하자. 동영상을 클릭했을 때 랜덤으로 ‘로딩 시간 0.5초’ 혹은 ‘로딩 시간 2초’가 나타나는 것이다. 이런 변화의 경우 유저가 알아채기 거의 힘들다. 즉, 유저가 “아니 어떨 때는 0.5초가 걸리고 어떨 때는 2초가 걸리는 거야?”라고 불만을 가지지 않는다는 말이다. 그래서 이럴 때는 Event 분기를 사용해서 A/B testing을 할 수 있다.

한 가지 더 고려해야 할 점은 분석 단위(Unit of analysis)이다. 분석 단위란 간단히 말해 지표의 분모다. 지표가 ‘회원당 구매액’이라고 해보자. 수식은 다음과 같을 것이다.

총 구매액 합계 / 회원 수

이 지표에서 분석 단위는 분모인 ‘회원’이 된다. 즉, A/B testing으로 영향을 주려고 하는 최소 단위다.

분기 단위를 정할 때는 분석 단위와 일치시키는 것이 바람직하다. ‘회원당 구매액’의 경우 분석 단위가 ‘회원 한 명’이므로 ID를 기준으로 분기한다. 분기 단위와 분석 단위를 일치시키는 이유는 실험 데이터를 ’독립 사건’으로 만들기 위해서다. 예를 들어 우리가 분석하고 싶은 단위는 ‘회원’인데 실험 데이터에서는 ‘페이지뷰’로 분기되어있다면, 한 명은 회원이 여러 개의 페이지뷰를 만들어낼 수 있다. 그러나 각 페이지뷰는 한 명의 회원이 만들어낸 것이므로 서로 확률이 연관되어있고, 사건 간의 독립성이 없다. 따라서 어떤 회원은 페이지뷰를 100번 했고, 어떤 회원은 페이지뷰를 1번 했을 때 실험 데이터가 왜곡될 가능성이 커진다. ‘통계적으로 유의미’ 한 결과가 나오기 힘들어진다. ‘통계적 유의성’에 관해서는 5단계에서 알아보겠다.

5.2. 목표 집단 (Target Population)

일반적으로 실험을 할 때는 샘플 숫자가 많을수록 좋다. 결과의 신뢰도가 올라가기 때문이다.

그럼에도 불구하고 무작정 모든 유저를 모집단(Population)으로 잡고 샘플링하면 오히려 신뢰도를 떨어뜨릴 수 있다. 어떤 상황에서는 측정하려고 하는 변화가 특정 집단에게만 의미 있는 것일 수 있기 때문이다.

예를 들어 홈페이지에 한국어 폰트를 변경하는 테스트를 했을 경우, 이 변화의 영향을 받는 유저는 한국 유저다. 그런데 이를 고려하지 않고 외국 유저까지 포함된 전체 유저를 대상으로 샘플링을 할 경우, 한국어 폰트 변경이 효과가 있었음에도 불구하고 영향을 받지 않는 그룹(외국 유저) 때문에 데이터를 분석했을 때  ‘효과 없음’으로 결론날 수가 있다. 한국 유저들의 행동 변화를 외국 유저들이 상쇄시키기 때문이다.  따라서 실험의 대상이 되는 모집단을 정확히 정의하자.

코호트(Cohort)를 기준으로 A/B testing을 할 수도 있다. 코호트란 ‘특정 기간 특정 경험을 공유한 사람들의 집합’을 말한다. 예를 들면 ‘앱 설치’가 기준이라면 4월에 앱을 설치한 그룹, 5월에 앱을 설치한 그룹 이런 식으로 나누는 방법이다. 코호트 분석은 유저 행동을 분석할 때 널리 쓰이는 방법이다. 웹/앱 서비스를 사용한 시간에 따라서 사용자의 패턴이 달라지기 때문이다. 서비스를 사용한 지 1개월 된 유저와 3년 된 유저는 특성이 매우 다를 수밖에 없다.

A/B testing에 코호트를 적용하는 이유는 여러 가지가 있다. 그중 하나는 ‘학습 효과’를 없애기 위해서다. 서비스에 변화가 생기면 유저들이 처음에는 익숙하지 않다가 차차 변화에 적응하는 것을 학습 효과라고 부르는데, 학습 효과가 진행되는 기간에는 데이터가 튀거나 왜곡될 수 있다. 실제로는 긍정적인 변화라도 기존 방식에 익숙해져 있던 유저들에게는 단기적으로 안 좋은 지표 변화가 나타날 수 있기 때문이다. 코호트를 사용해 새로 서비스를 사용하기 시작한 유저들을 대상으로만 A/B testing을 사용하는 식으로 ‘학습 효과’를 데이터에서 배제할 수 있다.

이 외에도 유저 리텐션(Retention) 향상이 목표이거나, 가입 시점에 따라서 실험 결과가 영향을 받을 수 있는 A/B testing의 경우는 목표 집단을 특정 코호트로 제한하는 방법이 효과적이다.

5.3. 표본 크기(Sample Size)

의미 있는 결과를 내기 위해 필요한 표본 숫자(n)가 얼마인지 알아야 한다. 필요한 표본 숫자는 신뢰도 수준을 더 보수적으로 잡거나, 오차 범위 구간을 작게 잡거나, 현실적으로 유의미한 변화(6.3.에서 설명)를 낮게 설정할수록 늘어난다.

각 수치들은 트레이드오프 관계이기 때문에 우선순위를 정하기 나름이다. 신뢰도가 높은 결과를 얻고 싶다면 표본 숫자를 늘려야 하고, 표본 숫자를 많이 구하기가 힘들다면 그만큼 신뢰 수준이 낮거나 오차 범위가 커진다.

우선순위를 고려해서 수치를 결정했다면 표본 숫자 계산은 어렵지는 않다. A/B testing 프레임워크를 쓴다면 대부분 자동으로 탑재되어있으며, 아니면 구글에서 ‘A/B testing sample size calculator’라고만 검색해도 쉽게 찾을 수 있다.

5.4. 실험 기간(Duration)

실험 기간도 결정해야 한다. 시간은 금이기 때문에 일단 기간은 최대한 짧은 게 좋겠지만, 기간이 짧은 경우 정확성을 놓칠 수가 있다. 전문가들은 A/B testing기간은 최소 수 일 이상은 되어야 한다고 조언한다. 결과에 영향을 미칠 수 있는 외부 변수들이 많이 있기 때문이다. 트래픽은 특정한 날짜나 요일에 따라서 영향을 받는다. 특히 E-commerce 사이트의 경우 명절, 연휴 기간에는 평소와 전혀 다른 패턴이 나타날 수 있다. 이런 경우가 실험에 영향을 주지 않도록 고려해서 기간을 정해야 한다. 또는 구매 주기가 긴 상품(가구, 자동차 등)의 경우에는 효과가 나타날 때까지 시간이 걸린다. 현실적으로 가능한 선에서 충분한 기간을 갖고 실험하자.

6. 결과를 분석한다.

이제 실험에서 도출된 데이터를 보고 결론을 도출해야 한다. 지표가 긍정적으로 변했다고 해서 흥분하지 말자. A/B testing을 할 때 가장 흔하게 나타나는 실수다. 실험 과정에서 무언가 잘못되었을 수도 있고, 우연의 일치가 일어났을 수도 있다. 그러므로 실제로 이 결과가 정말로 의미 있는지 알려면 3단계 확인을 해야 한다.

6.1. 불변 지표(Invariant Metric)

먼저 실험 과정에서 문제점이 없었는지 재점검을 해보기 위해서 불변 지표(Invariant metric)가 변하지 않았는지 체크한다. 불변 지표란 실험 과정에서 변하면 안 되는 변수다.

예를 들어 표본 숫자는 실험군과 대조군 사이에 큰 차이가 나서는 안된다. 기본적으로 A/B testing에서는 50대 50 확률로 실험/대조군을 분류하게 된다. 전체 트래픽을 2분의 1로 딱 나누는 것이 아니기 때문에 실험/대조군의 표본 숫자에 차이가 나는 것이 정상이다. 하지만 오차 범위를 계산해봤을 때 그 이상으로 차이가 난다면 실험 과정에서 뭔가 잘못되었을 가능성이 있다.

그 외에도 가설과 관련 없는 지표가 변화(회원가입 버튼을 바꾸었는데 결제 페이지 지표가 크게 바뀌었다던지) 하지 않았는지 확인하자. 시스템 상에서 오류가 일어나는 경우는 흔하고, 아니면 다른 외부 변수가 작용했을 수 있다.

A/A testing은 실험이 제대로 진행되었는지 확인할 때 유용하다. A/A 테스트란 아무런 변화도 주지 않고, 두 집단의 차이를 측정하는 실험이다. 즉, A/A 테스트를 했을 때는 양쪽 집단에서 결과가 똑같이 나와야 정상이다. 그렇지 않다면 뭔가 문제가 있는 것이다. 체중계로 치면 영점 조정이라고 할 수 있겠다. 올라가기 전에 정확하게 0에 맞춰져 있어야 측정 결과를 신뢰할 수 있는 것과 같은 원리다. Diane에 따르면 구글에서는 A/B 테스팅 전후에 A/A 테스트를 반드시 하도록 내부적으로 정해져 있다고 한다.

6.2. 통계적 유의성 (Statistical significance)

어떤 실험 결과를 두고 ‘통계적으로 유의미하다’고 하는 것은 단순히 우연이라고 보기 어렵다는 뜻이다. 실험에서는 언제나 우연의 가능성이 있기 때문에, 통계적으로 유의미한 결과인지 확인하는 것은 아주아주 중요하다.

통계적으로 유의미하다는 말은 동시에 이 실험을 다시 한번 해도 똑같은 결과가 나온다는 말이기도 하다. 우리는 A/B testing을 통해서 가설을 입증하고 이를 서비스 전체에 적용하고 싶은 것이기 때문에, 이 결과를 반복해서 나타날 수 있는지 여부를 반드시 점검해야 한다.

이 과정을 통계학에서는 가설 검정(hypothesis test)이라고 한다. 가설 검정을 모두 설명하게 되면 관련된 통계학 이론에 대해서 설명해야 하기 때문에 나중에 이 부분에 관해서 따로 정리해보겠다.

결론만 말하자면, Hypothesis testing을 통해서 변화가 ‘우연히 일어났을 확률’을 구할 수 있는데, 일반적으로 이 확률이 5% 이하이면 통계적으로 유의미한 것으로 본다.

6.3. 현실적 유의성 (Practical significance)

통계적으로 유의미한 결과가 나왔다고 하더라도 바로 그 가설을 적용해서는 안된다. 이 실험 결과를 전체적으로 적용하기 위해서는 시간과 돈이 들기 때문이다. 따라서 현실적으로 유의미하다는 말은 비용과 시간을 고려했을 때도 충분히 실행할 가치가 있는 가설이라는 뜻이다. 따라서 이는 상황을 고려해서 직접 결정해야 한다. 어떤 비즈니스냐에 따라 범위가 다를 수 있다.

극단적인 예로 신약 개발의 경우, 신약의 성능이 15% 이상은 되어야 현실적으로 유의미한 숫자라고 한다. 제품화에 그만큼 많은 시간과 비용이 들기 때문이다. 하지만 웹/앱 서비스 경우에는 그렇지 않기 때문에 1-2% 정도만 되어도 굉장히 의미 있는 차이로 본다.

‘왜’를 놓치지 말자

실험 결과가 이 3가지 점검을 모두 통과했다면 가설을 전체 서비스에 적용할 수 있다. 하지만 한 가지 더 마지막으로 유의해야 할 점이 있다. 단순히 가설을 입증했다고 해서 끝은 아니다.

왜 그런 결과가 나왔는지에 대한 이유를 더 파고 들어가야 한다. A/B testing은 유저 행동이 변화한 이유까지는 알려주지 않기 때문이다. 입증된 가설을 가지고 유저 인터뷰 등 정성적인 분석 방법을 통해서 유저에 대해 깊게 이해해나가야 지속적으로 사랑받는 서비스를 만들어갈 수 있다.


이 글은 Udacity의 A/B testing 강의 내용을 재구성했습니다.