18 1 파이썬패키지Changwon National University이번 강의에서는 파이썬의 패키지를 만들고 활용하는 방법을 알아보겠습니다.
대규모 프로젝트를 수행하기 위해서는 이미 잘 만들어진 코드를 활용하는 것이 중요한데요, 잘 만들어진 코드를 활용하는 방법이 모듈을 사용하는 것입니다.
그러나 모듈의 수가 많아지면 폴더(디렉토리) 아래에 계층적으로 두는 것이 더욱 편리합니다.
한 폴더에 유사한 성격의 여러 모듈을 두고 이 폴더를 가져오는 방식으로 개발을 하는데 이 폴더를 패키지라고 합니다. 본 강의에서는 예제를 통해서 파이썬의 패키지 만드는 방법을 살펴보도록 하겠습니다.
- 강의 키노트 자료는 다음 링크를 통해 다운 받으세요
https://drive.google.com/drive/folders/1UrrO4_ch4xcIErbExstwpUVY6vFvPdkW
- 강의 소스코드는 다음 링크를 통해 다운 받으세요
https://github.com/dongupak/Basic-Python-Programmingwjd
홍순성, 검색기반의 에버노트 분류법@hongss북콘서트 3회 발표자료입니다.
에버노트 강점 중에 하나는 검색 기능(1)입니다. 단순 키워드 검색과 더불어, 이미지, 파일 내 텍스트 검색이 뛰어나며, 특히 관련 노트로 제공하는 것 까지 합치면 에버노트는 3단 검색으로 대부분의 자료를 찾게 됩니다. 검색의 장점으로 따로 분류하지 않고도 찾을 수 있는데, 이런 것을 효과적으로 사용하도록 '검색 기반의 에버노트 분류법'을 제공하려고 합니다.
Elastic Search Performance Optimization - Deview 2014GruterElastic Search Performance Optimization (in Korean)
Presented by Ho-wook Jeong, search specialist at Gruter, at DeView 2014, Sep. 30 in Seoul Korea
[17.02.09] Github introduction (Korean Version)Ildoo KimGit 혹은 소스코드 형상관리를 아예 모르는 사람을 대상으로 작성한 Starter Guide입니다. 팀에 새로운 사람이 Join하는 등의 경우에 세미나 자료로 활용합니다.
형상관리/git 개념과 command line 혹은 source tree를 활용한 기본적인 사용 방법에 대해 소개합니다.
<팀을>이라는 책을 많이 참고하였습니다.
Kotlin 테스트 코드 결함 Intellij 플러그인 개발기.docxridex92개발을 하다 보면 코드의 신뢰성을 검증하거나 내용을 전달하는 목적으로 테스트 코드를 많이 작성하게 되는데요. 링크모은 작성하는 것보다 단위 테스트(unit test) 코드를 작성하는 데에 가장 많은 시간을 투여하게 됩니다. 단위 테스트는 하나의 기능만 테스트하는 것이기 때문에 영향을 받는 부분이 매우 적으며, 비용이 저렴하기 때문입니다.
단위 테스트에서 반복되는 보일러 플레이트 코드
팀 내에서 이러한 테스트 코드를 Kotlin 스타일로 더 쉽게 작성하기 위해 KoTest라는 테스트 프레임워크와 모킹(mocking)을 위한 mockk 라이브러리를 이용하고 있습니다.
테스트 코드 작성에 많이 알려진 Given-When-Then Pattern도 이용하고 있는데요.
대부분 아래와 같은 흐름으로 작성되게 됩니다.
위의 테스트 코드는 제가 이전까지 경험해 온 팀들도 대다수 사용하는 패턴으로 테스트 대상 시스템(system under test)를 이루는 의존성을 모킹(mocking)하여 격리시킨 뒤 온전하게 테스트 대상 시스템만 테스트하는 단위 테스트 방식입니다.
링크모은 코드를 작성하기 위해서는 given 절에서 수행되는 내용이 아래처럼 항상 반복되는 것을 알게 됩니다.
1.테스트 대상 시스템 (SUT)을 제외한 의존성을 모킹(mocking)한다.
2.SUT에 대상 의존성을 주입한다.
즉, 우리는 단위 테스트를 작성할 때 위 패턴을 반복해서 작성하게 됩니다. 따라서 이렇게 반복되는 패턴을 자동화할 필요성이 있다고 느껴 여러 Intellij 플러그인을 찾게 되었습니다.
그 중, TestMe라는 플러그인을 찾았으나 아쉽게도 Kotlin 그리고 Kotest 를 별도로 지원하지는 않았습니다. 그래서 별도로 개발을 진행해야 겠다는 생각을 가지게 되었고, 10월 초에 개발을 진행하게 되었습니다.
플러그인 개발기
Intellij 내부에서 우리가 코드를 작성하거나, 파일을 생성하기 위해 단축키인(Cmd + N)을 누르는 과정 모두 하나의 Action으로 취급됩니다. 기존에 우리가 테스트 파일을 쉽게 생성하기 위해 만드는 단축키인 (Cmd + Shift + T) 조차도 Create Test라는 하나의 행위(Action)으로 취급됩니다.
따라서, 기본적으로 제공하는 Action이 있다면 상속(extend)하여, 약간 수정하면 좀 더 수월하게 개발할 수 있는데요. Intellij에서는 이미 CreateTestAction이라는, 테스트를 생성할 때 발생하는 Action의 기본 동작들을 다루는 클래스를 제공하고 있습니다. 따라서, 저 또한 아래와 같이 CreateTestAction Class를 상속받아 개발을 진행하였습니다.
링크모은 생성하는 단축키인 행위(action)에 제 커스텀 이벤트를 등록시키기 위해서는, Intellij 내장 클래스인 GoToTestOrCodeHandler()에 위에서 생성한 CustomHandler를 이용하여 코드를 실행할 수 있도록 등록해야 합니다.
Kotlin 파일 분석하기
(들어가기에 앞서, 이 부분에서는 간단하게 문맥을 잘 이해할 수 있을 정도의 코드만 설명할 예정입니다.)
이제 Handler는 잘 등록을 했고, 우리가 원하는 테스트 파일을 만들기 위해서는 우리가 현재 마우스를 올리고 있는 파일에 대한 정보를 분석할 수 있어야 합니다. Kotlin 파일은 Intellij 내에서 KtFile 형태 (Type)으로 분류됩니다. KtFile Type에는 클래스 내부 정보를 쉽게 알 수 있도록 몇몇 메서드들을 지원합니다. 그래서, 해당 메서드를 이용하여 좀 더 수정하여 Kotlin 파일을 분석하는 저만의 Parser 클래스를 작성하였습니다.
여기서는 클래스 이름 혹은 메서드와 같은 현재 클래스에 대한 정보를 해석할 수 있는 기능을 제공하게 됩니다. 우리는 여기서 getProperties() 함수를 통해 우리가 원하던 Class 내부 의존성을 파악할 수 있게 됩니다.
테스트 파일 생성
이제 분석한 정보를 앞으로 클래스 메타 데이터(ClassMetaData)라고 표현하겠습니다. 이 클래스 메타 데이터(ClassMetaData)를 기반으로 아까 위에서 작성했던, 테스트 대상 시스템(SUT)에 모킹한 의존성을 넣는 코드를 작성해 봅시다.
테스트 파일을 생성할 때 아무런 규격이 없이 단순 문자열로만 파일을 생성하게 되면, 이후 오픈소스로 기여(Contribution)받게 되면 유지보수가 힘들어지고 규칙성 있게 코드를 작성하기 힘들어질 수 있어 Builder 라이브러리를 찾아보게 되었습니다.
팀에서 추천받은 KotlinPoet이라는 FileBuilder를 이용했는데, 아래 코드와 같이 빌더 방식으로 Kotlin 파일을 생성할 수 있습니다.
위 라이브러리를 이용하여 아래와 같이 테스트 파일을 생성하는 코드를 작성했습니다. 코드를 모두 보여주기에는 너무 길어져서 테스트 코드의 검증부 부분만 보여드리겠습니다.
TestClassTest라는 클래스는 의존성으로 List Type의 ages 변수를 가지고 있는 경우 아래 then 절의 결과와 같이 테스트 파일이 생성됩니다. 지금까지 우리가 위에서 언급했던 단위 테스트(unit test)에서의 반복되는 부분을 쉽게 생성할 수 있도록 코드로 간략하게 확인해 보았습니다. 이제 실질적으로 어떻게 사용하는지 알아봅시다
마켓에 배포하기
플러그인을 마켓에 배포하려면 빌드하여 플러그인을 .jar 또는 .zip 파일로 만들어야 합니다.
Elastic Search Performance Optimization - Deview 2014GruterElastic Search Performance Optimization (in Korean)
Presented by Ho-wook Jeong, search specialist at Gruter, at DeView 2014, Sep. 30 in Seoul Korea
[17.02.09] Github introduction (Korean Version)Ildoo KimGit 혹은 소스코드 형상관리를 아예 모르는 사람을 대상으로 작성한 Starter Guide입니다. 팀에 새로운 사람이 Join하는 등의 경우에 세미나 자료로 활용합니다.
형상관리/git 개념과 command line 혹은 source tree를 활용한 기본적인 사용 방법에 대해 소개합니다.
<팀을>이라는 책을 많이 참고하였습니다.
Kotlin 테스트 코드 결함 Intellij 플러그인 개발기.docxridex92개발을 하다 보면 코드의 신뢰성을 검증하거나 내용을 전달하는 목적으로 테스트 코드를 많이 작성하게 되는데요. 링크모은 작성하는 것보다 단위 테스트(unit test) 코드를 작성하는 데에 가장 많은 시간을 투여하게 됩니다. 단위 테스트는 하나의 기능만 테스트하는 것이기 때문에 영향을 받는 부분이 매우 적으며, 비용이 저렴하기 때문입니다.
단위 테스트에서 반복되는 보일러 플레이트 코드
팀 내에서 이러한 테스트 코드를 Kotlin 스타일로 더 쉽게 작성하기 위해 KoTest라는 테스트 프레임워크와 모킹(mocking)을 위한 mockk 라이브러리를 이용하고 있습니다.
테스트 코드 작성에 많이 알려진 Given-When-Then Pattern도 이용하고 있는데요.
대부분 아래와 같은 흐름으로 작성되게 됩니다.
위의 테스트 코드는 제가 이전까지 경험해 온 팀들도 대다수 사용하는 패턴으로 테스트 대상 시스템(system under test)를 이루는 의존성을 모킹(mocking)하여 격리시킨 뒤 온전하게 테스트 대상 시스템만 테스트하는 단위 테스트 방식입니다.
링크모은 코드를 작성하기 위해서는 given 절에서 수행되는 내용이 아래처럼 항상 반복되는 것을 알게 됩니다.
1.테스트 대상 시스템 (SUT)을 제외한 의존성을 모킹(mocking)한다.
2.SUT에 대상 의존성을 주입한다.
즉, 우리는 단위 테스트를 작성할 때 위 패턴을 반복해서 작성하게 됩니다. 따라서 이렇게 반복되는 패턴을 자동화할 필요성이 있다고 느껴 여러 Intellij 플러그인을 찾게 되었습니다.
그 중, TestMe라는 플러그인을 찾았으나 아쉽게도 Kotlin 그리고 Kotest 를 별도로 지원하지는 않았습니다. 그래서 별도로 개발을 진행해야 겠다는 생각을 가지게 되었고, 10월 초에 개발을 진행하게 되었습니다.
플러그인 개발기
Intellij 내부에서 우리가 코드를 작성하거나, 파일을 생성하기 위해 단축키인(Cmd + N)을 누르는 과정 모두 하나의 Action으로 취급됩니다. 기존에 우리가 테스트 파일을 쉽게 생성하기 위해 만드는 단축키인 (Cmd + Shift + T) 조차도 Create Test라는 하나의 행위(Action)으로 취급됩니다.
따라서, 기본적으로 제공하는 Action이 있다면 상속(extend)하여, 약간 수정하면 좀 더 수월하게 개발할 수 있는데요. Intellij에서는 이미 CreateTestAction이라는, 테스트를 생성할 때 발생하는 Action의 기본 동작들을 다루는 클래스를 제공하고 있습니다. 따라서, 저 또한 아래와 같이 CreateTestAction Class를 상속받아 개발을 진행하였습니다.
링크모은 생성하는 단축키인 행위(action)에 제 커스텀 이벤트를 등록시키기 위해서는, Intellij 내장 클래스인 GoToTestOrCodeHandler()에 위에서 생성한 CustomHandler를 이용하여 코드를 실행할 수 있도록 등록해야 합니다.
Kotlin 파일 분석하기
(들어가기에 앞서, 이 부분에서는 간단하게 문맥을 잘 이해할 수 있을 정도의 코드만 설명할 예정입니다.)
이제 Handler는 잘 등록을 했고, 우리가 원하는 테스트 파일을 만들기 위해서는 우리가 현재 마우스를 올리고 있는 파일에 대한 정보를 분석할 수 있어야 합니다. Kotlin 파일은 Intellij 내에서 KtFile 형태 (Type)으로 분류됩니다. KtFile Type에는 클래스 내부 정보를 쉽게 알 수 있도록 몇몇 메서드들을 지원합니다. 그래서, 해당 메서드를 이용하여 좀 더 수정하여 Kotlin 파일을 분석하는 저만의 Parser 클래스를 작성하였습니다.
여기서는 클래스 이름 혹은 메서드와 같은 현재 클래스에 대한 정보를 해석할 수 있는 기능을 제공하게 됩니다. 우리는 여기서 getProperties() 함수를 통해 우리가 원하던 Class 내부 의존성을 파악할 수 있게 됩니다.
테스트 파일 생성
이제 분석한 정보를 앞으로 클래스 메타 데이터(ClassMetaData)라고 표현하겠습니다. 이 클래스 메타 데이터(ClassMetaData)를 기반으로 아까 위에서 작성했던, 테스트 대상 시스템(SUT)에 모킹한 의존성을 넣는 코드를 작성해 봅시다.
테스트 파일을 생성할 때 아무런 규격이 없이 단순 문자열로만 파일을 생성하게 되면, 이후 오픈소스로 기여(Contribution)받게 되면 유지보수가 힘들어지고 규칙성 있게 코드를 작성하기 힘들어질 수 있어 Builder 라이브러리를 찾아보게 되었습니다.
팀에서 추천받은 KotlinPoet이라는 FileBuilder를 이용했는데, 아래 코드와 같이 빌더 방식으로 Kotlin 파일을 생성할 수 있습니다.
위 라이브러리를 이용하여 아래와 같이 테스트 파일을 생성하는 코드를 작성했습니다. 코드를 모두 보여주기에는 너무 길어져서 테스트 코드의 검증부 부분만 보여드리겠습니다.
TestClassTest라는 클래스는 의존성으로 List Type의 ages 변수를 가지고 있는 경우 아래 then 절의 결과와 같이 테스트 파일이 생성됩니다. 지금까지 우리가 위에서 언급했던 단위 테스트(unit test)에서의 반복되는 부분을 쉽게 생성할 수 있도록 코드로 간략하게 확인해 보았습니다. 이제 실질적으로 어떻게 사용하는지 알아봅시다
마켓에 배포하기
플러그인을 마켓에 배포하려면 빌드하여 플러그인을 .jar 또는 .zip 파일로 만들어야 합니다.
Dropbox와 같은 시스템은 파일을 어떻게 저장할까?nexusz99드랍박스, nDrive 등과 같은 클라우드 스토리지 서비스들은 데이터를 어떻게 저장하는지에 대한 이론적 내용과 실제 구현 내용을 살펴봅니다. 이 발표에서는 OpenStack 의 swift라는 Object Storage 를 이용하여 이론이 어떻게 구현되어있는지 알아봅니다.
서버 개발자가 되기 위한 첫 걸음nexusz99이제 막 SW개발을 시작하는 학생들을 대상으로 서버 개발자가 되기 위한 첫 걸음을 내딛을 수 있는 내용을 담아보았습니다. 웹 서비스가 무엇인지 그리고 그것을 어떻게 개발하는지 알고 싶은 학생들에게 이 슬라이드가 많은 도움이 되기를 희망합니다.
11. 1프로젝트 소개
파일이 아무리 많아도
[파일처리]lab06.doc 운영체제 과제.doc 데이터베이스 중간 발표.ppt 인가탐1.doc 데이터베이스 보고서.doc
+
실습, 2015, 학교
파일처리
+
과제, 2014, 학교
운영체제
+
발표, 2015, 학교
데이터베이스, 중간
+
보고서, 2013, 학교
+
보고서, 2015, 학교
데이터베이스, 중간
12. 1프로젝트 소개
파일이 아무리 많아도
[파일처리]lab06.doc 운영체제 과제.doc 데이터베이스 중간 발표.ppt 인가탐1.doc 데이터베이스 보고서.doc
+
실습, 2015, 학교
파일처리
+
과제, 2014, 학교
운영체제
+
발표, 2015, 학교
데이터베이스, 중간
+
보고서, 2013, 학교
+
보고서, 2015, 학교
데이터베이스, 중간
연관 단어들로만 검색하면 찾을 수 있다.
23. 3
왜 N:M 을 직접 연결하지 않았나?
id name
1 a.txt
2 b.txt
3 c.txt
Storage_file
id File_id name
1 1 학교
2 1 과제
3 2 2015
4 2 학교
5 3 파일처리
tags
파일 및 태그 관련 테이블
24. 3
왜 N:M 을 직접 연결하지 않았나?
id name
1 a.txt
2 b.txt
3 c.txt
Storage_file
id File_id name
1 1 학교
2 1 과제
3 2 2015
4 2 학교
5 3 파일처리
tags
같은 태그명이 중복!
파일 및 태그 관련 테이블
25. 3
참조 테이블을 통한 중복 제거
id name
1 a.txt
2 b.txt
3 c.txt
Storage_file
id name
1 학교
2 과제
3 2015
4 파일처리
tags
File_id Tag_id
1 1
1 2
1 3
2 1
2 4
파일 및 태그 관련 테이블
26. 3
참조 테이블을 통한 중복 제거
id name
1 a.txt
2 b.txt
3 c.txt
Storage_file
id name
1 학교
2 과제
3 2015
4 파일처리
tags
File_id Tag_id
1 1
1 2
1 3
2 1
2 4
파일 및 태그 관련 테이블
27. 3
태그 수정은 삭제/추가 연산으로
id name
1 a.txt
2 b.txt
3 c.txt
Storage_file
id name
1 학교
2 과제
3 2015
4 파일처리
tags
File_id Tag_id
1 1
1 2
1 3
2 1
2 4
a.txt 의 학교 태그를 파일처리로 수정하고 싶다.
파일 및 태그 관련 테이블
28. 3
태그 수정은 삭제/추가 연산으로
id name
1 a.txt
2 b.txt
3 c.txt
Storage_file
id name
1 학교
2 과제
3 2015
4 파일처리
tags
File_id Tag_id
1 1
1 2
1 3
2 1
2 4
1 4
File_id : 1 – Tag_id : 1 인 row를 지우고,
File_id : 1 – Tag_id : 4 row 를 추가
파일 및 태그 관련 테이블
29. 3파일 업로드
파일을 업로드 하는 작업은 2개 작업이 복합되어있다.
과제, 2015, 학교
[파일처리]lab06.doc
30. 3파일 업로드
두 작업 중 하나라도 실패시 전체작업이 실패
과제, 2015, 학교
[파일처리]lab06.doc
42. 3태그를 이용한 검색
사용자가 입력한 태그가 실제 시스템에 없을 수 있다.
tag
2015
DB
발표자료
id name
1 2015
2 과제
3 DB
사용자가 입력한 태그 실제 시스템의 태그 테이블
43. 3태그를 이용한 검색
검색 절차
1. 사용자가 입력한 태그에 해당하는 태그 ID 목록 조회
2. 검색을 요청한 사용자 소유의 파일이면서,
(1)에서 조회한 태그들을 1개 이상 가진 파일 조회
3. 사용자가 입력한 태그 수 대비 (2)의 파일 각각이 가진 태그들의
매칭률 계산
4. 매칭률로 결과를 내림차순 정렬
44. 3태그를 이용한 검색
검색 구현 중점 사항
1. 각 단계 별 결과를 어플리케이션까지 가져오지 않는다.
-> 연결 세션에 한정적인 메모리엔진기반 임시 테이블 생성
2. 최소의 쿼리를 이용하여 검색을 수행하자
3. 결과는 정확해야한다
45. 3태그를 이용한 검색 - SQL
절차 1. 사용자가 입력한 태그에 해당하는 태그 ID 목록 조회
create TEMPORARY table ttags ENGINE=MEMORY
as (select id from eztags where name in (tags))
46. 3태그를 이용한 검색 - SQL
절차 2. 검색을 요청한 사용자 소유의 파일이면서, (1)에서 조회한 태그들을
1개 이상 가진 파일 조회
create TEMPORARY table files ENGINE=MEMORY
as (select distinct storage_file_id from eztags_has_storage_file
where tags_id in (select id from ttags) and user_id= ?)
47. 3태그를 이용한 검색 - SQL
절차 3. 사용자가 입력한 태그 수 대비 (2)의 파일 각각이 가진 태그들의
매칭률 계산
tag
2015
DB
발표자료
name
2015
과제
DB
사용자가 입력한 태그파일이 가진 태그
차집합
name
2015
DB
매칭되는 태그
48. 3태그를 이용한 검색 - SQL
절차 3. 사용자가 입력한 태그 수 대비 (2)의 파일 각각이 가진 태그들의
매칭률 계산
매칭되는 태그 갯수
X 100 = 매칭률
전체 입력 태그 갯수
49. 3태그를 이용한 검색 - SQL
절차 3. 사용자가 입력한 태그 수 대비 (2)의 파일 각각이 가진 태그들의
매칭률 계산
select tmp.storage_file_id, ef.name, ft.value from
(select storage_file_id from ttags left join eztags_has_storage_file f on id =
f.tags_id where f.storage_file_id=?) as tmp join ezstorage_file as ef
on tmp.storage_file_id = ef.id join ezfile_type as ft on ef.type_id = ft.id
50. 3태그를 이용한 검색 - SQL
절차 3. 사용자가 입력한 태그 수 대비 (2)의 파일 각각이 가진 태그들의
매칭률 계산
select tmp.storage_file_id, ef.name, ft.value from
(select storage_file_id from ttags left join eztags_has_storage_file f on id =
f.tags_id where f.storage_file_id=?) as tmp join ezstorage_file as ef
on tmp.storage_file_id = ef.id join ezfile_type as ft on ef.type_id = ft.id
3중 조인....
51. 3카테고리를 이용한 검색
1학년 포트폴리오
2011년 과제 보고서 발표자료
카테고리의 태그가 실제 시스템에 없을 수 있다.
하지만 실제 존재하는 태그에 대해서는 파일이 모두 가지고 있어야한다.
52. 3카테고리를 이용한 검색
검색 절차
1. 카테고리가 가진 태그 중, 실제 존재하는 태그이면서 사용자가
보유한 파일들에 포함되는 태그 ID 목록 조회
2. (1)에서 조회한 태그들을 1개 이상 가진 파일 조회
3. 사용자가 입력한 태그 수 대비 (2)의 파일 각각이 가진 태그들의
매칭률 계산
4. 매칭률이 100%인 파일을 필터링
53. 3카테고리를 이용한 검색
절차 1. 카테고리가 가진 태그 중, 실제 존재하는 태그이면서 사용자가
보유한 파일들에 포함되는 태그 ID 목록 조회
create TEMPORARY table ttags ENGINE=MEMORY
as (select distinct ec.tags_id as id from eztags_has_categories ec join
eztags_has_storage_file ef on (ec.tags_id = ef.tags_id)
where ec.categories_id = ? and ef.user_id = ?)
56. 4한계점
(1)쿼리 성능 평가 미진행
-> 생각보다 join이 많이 발생하였다.
-> (시간상) 대량의 데이터에 대한 성능 평가를 진행하지 못함
(2) 검색의 결과에 대한 Paging 을 고려하지 않음
-> 매칭률을 계산하기 위해서는 전체를 상대로 검색해야한다
-> 전체를 검색하되 Paging 을 어떻게 지원할까?