[d2대학생세미나]산넘어 산,...

89
산 넘어 산, 음원 서비스 <세이렌> 개발기 D2 대학생 세미나 2014. 08. 26 고 상 우

Upload: naver-d2

Post on 15-Jan-2015

5.447 views

Category:

Technology


0 download

DESCRIPTION

[D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

TRANSCRIPT

Page 1: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

산 넘어 산, 음원 서비스 <세이렌> 개발기

D2 대학생 세미나

2014. 08. 26 고 상 우

Page 2: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

고상우

서울대학교 08

NAVER SW 멤버십 5기

NAVER LABS 인턴

[email protected]

Page 3: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

군집형 음원 서비스 <SEIREN> 2014 NAVER SW 멤버십 최우수프로젝트 고상우 김성철 김시온

Page 4: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

어떻게 만들었는지, 그 때 알았더라면 좋았을 것들

Page 5: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

1. <세이렌> 소개

Page 6: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기
Page 7: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

가장 기본적인 “재생 버튼”

Page 8: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

재생 버튼 보다 더 많이 누르는 “다음 곡 버튼”

Page 9: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

항상 켜놓는 “셔플 버튼”

Page 10: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

“내가 뭘 듣고 싶은진 모르겠지만 일단 아무거나 한번 틀어줘 봐”

‘셔플’을 사용하는데 ‘다음곡’을 계속 연타한다는 것은

“근데 지금 나오는 이 곡은 좀 별로... 다른 건 없냐?”

“셔플” 기능을 “다음 곡 추천”으로 바라보자

Page 11: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

시연!

Page 12: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기
Page 13: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기
Page 14: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

유사한 음원끼리 그룹화해서 사용자가 현재 곡에 만족하면 유사한 곡을,

사용자가 다른 곡을 원하면 다른 그룹에서 다음 곡을 제공

Page 15: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

2. <세이렌> 을 만들기까지

Page 16: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

문과인 나는 왜 개발을 시작했나

Page 18: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

Tools for data analysis

Medium for design

제 경우에는

Explain things to computer + Data

Visualization

Page 19: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

Data Visualization Raw data를 수집해 의미를 찾아내고 시각적으로 표현하는 것

첫 개발 - 위인들이 몇세 쯤에 어떤 일을 했는지 패턴화해서 보여주는 프로그램

Page 20: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

반복문만 가지고 만든 첫 프로그램 꽤 복잡한 알고리즘이 적용된 <SEIREN>

관심사의 발전 : 데이터를 시각화

2년

Page 21: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

Project 반복문만 알던 내가

웹 서비스 개발까지 할 수 있었던 것은

Page 22: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

Project 맨 땅에 헤딩,

그것도 여러 번

Page 23: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

Problem

Problem

Problem

Problem

Problem

Problem

Problem Problem

생각보다 훨씬 많은 문제상황이 발생

Problem

Page 24: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

언어, 알고리즘, 자료구조…

프레임워크, 라이브러리…

Problem Solution 이 과정이 반복되면서 큰 자산이 되었습니다.

어떻게 해결하지?

편하게 못하나?

Page 25: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

Solution 1 Solution 2 Solution 3

최대한 많은 대안을 찾고 왜 이걸 써야 하는지, 꼭 이걸 써야 하는지 다시 생각하기

Page 26: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

그래도! <세이렌> 개발은

특히 더 힘들었습니다.

매일 매일 쩔어있던 나

Page 27: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

Client Web 문서 Web Server DB

Browser Device

HTML JavaScript CSS

Java SQL

Front-end Back-end

Page 28: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

‘내가’ 웹 서비스를 개발할 때 학생 개발자

Page 29: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

개발

막막하거나 막히거나.

문제 상황 폭발

기획 디자인

Page 30: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

회의, 회의 또 회의

Page 31: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

그리고 채찍질

Page 32: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

어떻게 해결하지?

편하게 못하나?

Solution

꾸역 꾸역 다 찾았습니다

Page 33: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

문제를 해결해주었던 알고리즘들

Page 34: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

서로 유사하다는 걸

어떻게 측정하지?

비슷한 음악을 골라주자 ?

Page 35: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

Fourier Transform

Audio Similarity

Music Similarity

Audio Comparison

Page 36: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

http://upload.wikimedia.org/wikipedia/commons/7/72/Fourier_transform_time_and_frequency_domains_%28small%29.gif

복잡한 함수에서 주파수 영역별 수치를 반환

Page 37: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

정확히 어떤 의미인지 알 수 없었습니다

순식간에 까막눈이 되어버린 나

http://ko.wikipedia.org/wiki/%ED%91%B8%EB%A6%AC%EC%97%90_%EB%B3%80%ED%99%98

Page 38: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

우리 프로젝트에서 직접 구현 해야할까?

혹시 알고리즘을 오해해서 잘못 가져다 쓰는 건 아닐까

Page 39: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

의미를 확실히 아는 형태로 재가공하자

FT 수치는 다른 프로그램에서 추출해내고, 우리 프로젝트에서는 이 수치를 가공하는 부분을 구현하기로

Page 40: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

C G D A E B Gb …

0.26 0.99 0.48 0.56 0.43 0.40 0.23 …

C G D A E B Gb …

0.33 0.58 0.53 0.32 0.37 0.21 0.40 …

노래 A

노래 B

상관 계수

Page 41: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

Tell Me - 원더걸스

상관 계수 실측값 (상위 10위)

Vogue Madonna 0.783

Goodies Ciera 0.727

Gee 소녀시대 0.667

빙글빙글 나미 0.666

Lose Yourself Eminem 0.649

Poison 엄정화 0.647

소원을 말해봐 소녀시대 0.644

Toxic Britney Spears 0.637

달의 몰락 김현철 0.637

Livin' La VIda Loca Ricky Martin 0.630

Page 42: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

음악을 시각적으로

어떻게 표현하지?

기왕이면 보는 재미도 있게

만들자 ?

Page 43: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

원을 음악으로, 선을 음원간 상관계수로. 그런데 좌표는 어떻게? 그룹은 어떻게?

http://bl.ocks.org/mbostock/4600693

Page 44: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

http://www.repeatingbeats.com/about/thesis/

Music Visualization으로 찾은 자료

Multi Dimensional

Scaling

Page 45: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

운이 좋게도 구현 방법이 수록된 책이! 게다가 그룹화에 관한 설명도!

Page 46: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

다차원 비례 척도법

고차원의 변수를 가진 데이터들을 2차원으로 표현하는 방법

Page 47: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

다차원 비례 척도법(Multidimensional Scaling) 고차원의 변수를 가진 데이터들을 2차원으로 으로 표현하는 방법

1. 각 음원 데이터를 무작위 좌표에 배치

Page 48: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

다차원 비례 척도법(Multidimensional Scaling) 고차원의 변수를 가진 데이터들을 2차원으로 으로 표현하는 방법

2. Target 음원이 나머지 음원과 얼마나 비슷한지에 따라 좌표를 조정

많이 비슷

꽤 다름

Page 49: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

다차원 비례 척도법(Multidimensional Scaling) 고차원의 변수를 가진 데이터들을 2차원으로 으로 표현하는 방법

2. Target 음원이 나머지 음원과 얼마나 비슷한지에 따라 좌표를 조정

조금 비슷 꽤 다름

Page 50: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

다차원 비례 척도법(Multidimensional Scaling) 고차원의 변수를 가진 데이터들을 2차원으로 으로 표현하는 방법

3. 나머지 음원들도 같은 과정을 반복

Page 51: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

다차원 비례 척도법(Multidimensional Scaling) 고차원의 변수를 가진 데이터들을 2차원으로 으로 표현하는 방법

4. 개선의 여지가 없을 때까지 반복

Page 52: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

K-means Clustering(K 평균 군집)

주어진 데이터를 K개의 Cluster로 묶어주는 알고리즘

Page 53: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

K-means Clustering(K 평균 군집) 주어진 데이터를 K개의 Cluster로 묶어주는 알고리즘

1. Cluster의 개수, 위치를 결정

Page 54: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

K-means Clustering(K 평균 군집) 주어진 데이터를 K개의 Cluster로 묶어주는 알고리즘

1. Cluster의 개수, 위치를 결정

Page 55: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

K-means Clustering(K 평균 군집) 주어진 데이터를 K개의 Cluster로 묶어주는 알고리즘

2. 각 데이터 표본이 어떤 centroid에 가장 가까운지 판단

Page 56: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

K-means Clustering(K 평균 군집) 주어진 데이터를 K개의 Cluster로 묶어주는 알고리즘

2. 각 데이터 표본이 어떤 centroid에 가장 가까운지 판단

Page 57: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

K-means Clustering(K 평균 군집) 주어진 데이터를 K개의 Cluster로 묶어주는 알고리즘

3. Centroid의 위치를 형성된 군집을 기준으로 조정

Page 58: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

K-means Clustering(K 평균 군집) 주어진 데이터를 K개의 Cluster로 묶어주는 알고리즘

4. 같은 과정을 개선의 여지가 없을 때까지 반복

Page 59: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

(I Just) Died In Your Arms Cutting Crew

Anything For You Gloria Estefan

Beautiful Sunday Daniel Boone

All By Myself Celine Dion

Baker Street Gerry Rafferty

Beauty And The Beast Celine Dion

Because You Loved Me Celine Dion

Always On My Mind Pet Shop Boys

Befor The Next Teardro… Freddy Fender

Believe Cher

Bridge Over Troubled Water Simon & Garfunkel

Bohemian RhapSody Queen

Can You Feel The … Elton John

Call Me Blondie

Cant Fight This Feeling REO Spee…

And I Love You So Perry Como

Always On My Mind Willie Nelson

Angel Sarah McLachlan

같은 가수의 노래는 한 군집으로, 리메이크되며 장르가 바뀐 곡은 다른 군집으로

K-means Clustering(K 평균 군집) 주어진 데이터를 K개의 Cluster로 묶어주는 알고리즘

Page 60: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

나를 좀더 편하게 해준 것들

Page 61: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

Spring framework

MVC, AOP, DI 등을 제공

Page 62: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

Servlet과 .properties 파일을 이용한 Controller

public class test extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String request = request.getParameter("action" ); String commandAction = action_mapping.get(request); String forward = forward_mapping.get(requestAction); if(!commandAction.equals("")){ try { Class action = Class.forName(commandAction); Object actionInstance = action.newInstance(); Method m = action.getDeclaredMethod("execute", HttpServletRequest. class, HttpServletResponse.class ); m.invoke(actionInstance, request, response); } catch (Exception e) { e.printStackTrace(); } } request.getRequestDispatcher(forward).forward(request, response); }

Request – Logic – View 맵핑을 관리

Page 63: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

@RequestMapping(value = "/myList.do", method = RequestMethod.GET) public String myList(@ModelAttribute("userId") String owner, Model model) { //do something return "myList"; }

Spring MVC를 활용할 때

annotation을 이용해 request, parameter가 자동으로 관리됨

메소드의 반환 스트링을 통해 result page까지 한번에 mapping

복잡한 Controller를 사용하지 않아도 됨

Page 64: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

MyBatis

Java에서 DB통신을 보다 편하게

Property관리 , SQL 매핑, 동적 쿼리 등

Page 65: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

<!-- 해당 댓글 반환 --> <select id="selectComment" parameterType="commentVO" resultMap="commentMapping"> SELECT * FROM comment WHERE comment.collection_num=#{collectionNum} AND contents=#{contents} AND write_time = #{writeTime} </select>

.xml파일에 저장된 쿼리문

Parameter mapping과 result mapping을 편하게

Page 66: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

jQuery

JavaScript 라이브러리

DOM, BOM 조작을 보다 편하게

Page 67: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

opacity, width, height가 0이 되는 애니메이션

Page 68: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

var elLinearList = document.getElementById("linearList"); elLinearList.style.transition = "width 1s ease-out," + "height 1s ease-out," + "opacity 1s ease-out"; elLinearList.style.width = 0; elLinearList.style.height = 0; elLinearList.style.opaicity = 0; setTimeout(function(){ alert("animation end"); }, 1000);

$("#linearList").hide(1000, function(){ alert("animation end"); });

JavaScript

jQuery

Page 69: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

UI framework

Style 설정을 보다 편하게

Bootstrap

Page 70: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

기본 태그와 지정된 클래스에 따라 UI가 자동으로 적용

이벤트에 따른 UI 변화까지 적용되어 있음

Page 71: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

D3.js

JavaScript 라이브러리

Page 72: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

Data set을 SVG로 쉽게 표현

Page 73: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

WebGL 라이브러리

Three.js

Page 74: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

3D 공간 형성에 사용

Page 75: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

3. <세이렌> 진행과정에서 얻은 노하우

Page 76: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

지금 할 수 있는 것 보다는 하고 싶은 것을 목표로

실현가능성은 중요한 문제이지만, 기획에선 잠시 잊는 걸로

지금 아는 것보다 더 많은 걸 할 수 있다는 점

Page 77: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

기록 잘 남기기

회의록, 일정, 기획, 요구사항 명세, UI 명세, 기능 분석 등 간략한 형태로라도 기록을 남겨야 길을 잃지 않고, 같은 논의를 반복하지 않습니다.

Page 78: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

Project Scope

이번 프로젝트에서 직접 다뤄야 할 부분은 어디서 어디까지인지 명확히 선 긋기

프로젝트 주제와 목적이 명확해야 Scope도 명확해집니다.

FT도 우리 프로젝트 Scope인지 고민하던 흔적

Page 79: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

제대로 하지 못해 아쉬웠던 부분

확장성, 재사용성, 변동 가능성을 고려

디자인 패턴을 잘 알았더라면 보다 수월했을 것 같음

서로 다른 메소드 안에서 반복되는 같은 로직들

HashMap이 아니라 ArrayList를 쓰기로 계획이 바뀌는 일이 생긴다면?

이런 공통된 로직들만 따로 캡슐화 했더라면 변동 사항 걱정도 없고 가독성도 늘었을 것.

Method A

Method B

Page 80: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

프로젝트나 소스코드를 이렇게 관리할 순 없는 노릇

형상관리 tool 변동사항을 체계적으로 관리

Page 81: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

목적에 맞는 것을 선택해서 사용하세요.

SVN / GIT

쓰는 것이 정신 건강에 이롭습니다.

Page 82: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

Commit 단위로 파일을 서버에 저장

Page 83: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

발표 당일 블루스크린과 함께 workspace setting이 다 날아가버리기도…

Page 84: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

소스코드에서 변동사항 추적

코드 리뷰 기능

Page 85: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

가독성을 고려한 코드

코딩 컨벤션 (변수명, 들여쓰기, 줄 바꿈, 띄어쓰기, 주석) 정하기

http://nuli.navercorp.com/sharing/fe/coding https://code.google.com/p/google-styleguide/ NHN 마크업 코딩 컨벤션(HTML / CSS) 구글 코딩 컨벤션(C, C++, JAVA, Python…)

Page 86: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

피드백 받기

피드백은 문제상황이 없더라도 받는 게 좋습니다.

“UI가 좀 더 동적이었으면 좋겠다” “별자리 같이 생겼다”

“우주 공간처럼 만들자”

Three.js 사용

Page 87: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

새로운 프로젝트에 대한 단초

프로젝트 Wrap-up

배워야 할 기술에 대한 접점

Page 88: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

고생은 정말 많이 했지만 남은 것이 더 많았던 프로젝트

Page 89: [D2대학생세미나]산넘어 산, 음원서비스 세이렌 개발기

감사합니다.