SlideShare a Scribd company logo
1 of 19
Download to read offline
---------- 1
GO언어로 해보는 개발
환경변수 잡아보기
(GO를 몰라도 됨)
https://fb.com/me.adunhansa
https://twitter.com/arahansa
http://adunhansa.tistory.com/
사이트 : http://arahansa.com
ABOUT
CONTACT
SOURCE
1
1. 작성자 소개 2
-------------------------------------------------------------------
평소 정리를 즐겨합니다. 한 때 동영상강좌도
만들다보니.. 비실명과 만화캐릭터를 쓰네요
양해 부탁드립니다 ㅎㅎ
왜 이런 걸 만드나? 3
1. 이게 맞는지 점검하려고
2. 지식공유가 좋고 좋은거죠 뭐…
내가 삽질한만큼 다른 사람의 시간을
줄여준다는…아름다운-_-*
source code git :
https://github.com/arahansa/go_profile
Production:
Oracle Db
의도 = 환경변수를 다르게.. 4
• 배운게 도둑질이라고, 머리속의 기준점이 스프링프레임워크로
돌아가고 있습니다.
• 스프링 프레임워크에서는 Profile이라는 기능이 있습니다.
어플리케이션을 개발을 하면서 로컬개발서버, 테스트서버,
스테이징서버 별로 각종 환경변수를 다르게 주기 위한 기능입니다.
Staging:
XX Server
Local:
H2 memory DB
Bad -> Good 5
• 이렇게 데이터 접근영역에서 직접 주소를 적어주는 것은 별로
좋지가 않습니다.
• 스프링에서 했던 것처럼 다음과 같이 개별 환경변수들을
빼주고 작업을 해줘보도록 하겠습니다.
최종 구현할 방향 6
1. 기본 설정은 local설정이되, flag설정으로
profile설정을 다르게 설정을 줄 수 있어야
합니다.
2. yaml문법의 파일을 읽어보도록 하겠습니다.
가독성이 좋고 프로파일링 하기가 좋습니다.
1. flag - 먼저 샘플코드를 만들자! 7
• 구현할 방향이 정해졌으면, 하나하나씩 기능들을 최소한의 단위로 분할해서
테스트를 해보고, 이것을 모아보면 됩니다. 먼저 flag부터 해보겠습니다.
우선 flag를 찾아서 돌려보겠습니다. 다음과 같은 소스에서 -h옵션을 주면
사용법이 -p=dev로 flag지정을 하는 걸 볼 수가 있습니다.
02. yaml 불러와보기 8
• 두번째는 yaml을 읽어보는 연습을 해봅니다. 구글링을 하면 첫번째로
나오는 사이트에 들어가보았습니다. https://github.com/go-
yaml/yaml 대략 이런 식으로 맵으로 변환됨을 알 수가 있습니다.
03. yaml 을 파일로 읽어보기 9
• 그러면 yaml을 파일로 읽어보는 연습을 해봅니다.
다음의 사이트를 참고해봅니다.
http://stackoverflow.com/questions/28682439/golang-parse-yaml-file
• 대략 이런 식으로 동작을 하는 구나..느껴집니다.
04. unmarshal 추가해보기 연습 10
• 한가지 가정사항을 생각해봅시다.
yaml에서 --- 이전의 설정들만 읽어들이니, 그 이후로는 각각의 프로파일링 변수를 집어넣을
것입니다. 그러면, 그 이후로 언마샬링을 한번 더 해야되는데, 덮어쓰기가 될 것인지 추가가 될
것인지 테스트를 해봐야 합니다. 다음의 경우를 해봅시다. 덮어쓰기가 아닌 추가로 잘 되는
것을 볼 수가 있군요…
요구사항 구현.. 11
• 이제 각각의 큰 기능들을 해보았으니, 조합을 해보면 됩니다. 요구사항을
조금 더 세밀하게 재정의해보겠습니다.
01. yaml파일을 읽어들여 문자열 파싱을 하고 환경변수들을 읽어들인 뒤에 ,
02. 프로파일을 구하고, ---로 구분된 환경변수들을 읽어들여서
03. 제공된 profile에 맞는 환경변수를 골라서 읽은 뒤
04. map을 내부에 가지고 있고, 외부에서 꺼내올 때 해당 키에 해당하는
값이 없으면 에러를 내서 초반에 프로그램이 가동되지 않게 해보자.
각각을 조합해서 기능구현..
01. yaml파일 읽어들이기..
12
• 01. 첫번째 기능 구현… flag로 온 프로파일이 있으면
flag를 우선시하여서 설정을 줍니다. (결과)
02. 프로파일을 구하고, 13
• 프로파일을 찾아야 하므로, flag로 받던 기존에
설정된 프로파일이든 찾아서 설정을 하고..
03. 프로파일링 된 내용만 따로 추가 14
• 프로파일링된 내용만 따로 추가하겠습니다. 문자열을
다루는 부분이 조금 나옵니다만, go사이트의 패키지를
보고 찾아 쓰면 됩니다(;;;)
05. 외부로 적용 미리 준비.. 15
• 자 이제 이 map은 config패키지에 들어갈 것이고
repository영역에서 key값만으로 불러오게 될텐데 값이 없는
경우 에러가 나야 합니다. nil처리를 해줘서.. 초반에 설정이
잘못되면 프로그램 이륙(?)이 안되게 해줍시다.
나중엔…? 16
마지막 샘플코드까지 작성을 해봤으므로 이제 직접
main.go에 적용을 해볼 것입니다. config패키지를 나누고,
여기서 불러들일 것입니다. 대략 이런 구조가 되겠죠
applicationContext - PropertySource 17
• 프로퍼티소스는 아마 이런 식으로.. 짜내려갈
것같습니다..흠…다른 할일이 있어서 일단 이만..ㅠ
이미지 라이선스 18
• 키보드 치는 남자 :
http://www.freepik.com/index.php?goto=74&idfoto=765894
• 데이터베이스 : http://www.flaticon.com/free-icon/database-
configuration_1374
19
THANK YOU !
즐거운 개발됩시다.
아라한사 올림
arahansa
------
------
페북 : https://fb.com/me.adunhansa
트위터 : https://twitter.com/arahansa
블로그: http://adunhansa.tistory.com/
사이트 : http://arahansa.com

More Related Content

What's hot

What's hot (20)

Inside PostgreSQL Shared Memory
Inside PostgreSQL Shared MemoryInside PostgreSQL Shared Memory
Inside PostgreSQL Shared Memory
 
Exciting New Alfresco REST APIs
Exciting New Alfresco REST APIsExciting New Alfresco REST APIs
Exciting New Alfresco REST APIs
 
UDA-Componentes RUP. Validación
UDA-Componentes RUP. ValidaciónUDA-Componentes RUP. Validación
UDA-Componentes RUP. Validación
 
UDA-Componentes RUP. Autocomplete
UDA-Componentes RUP. AutocompleteUDA-Componentes RUP. Autocomplete
UDA-Componentes RUP. Autocomplete
 
Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문
 
introduction about REST API
introduction about REST APIintroduction about REST API
introduction about REST API
 
Understanding react hooks
Understanding react hooksUnderstanding react hooks
Understanding react hooks
 
[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화
 
Introduction to Lucidworks Fusion - Alexander Kanarsky, Lucidworks
Introduction to Lucidworks Fusion - Alexander Kanarsky, LucidworksIntroduction to Lucidworks Fusion - Alexander Kanarsky, Lucidworks
Introduction to Lucidworks Fusion - Alexander Kanarsky, Lucidworks
 
Embedding Jaspersoft into your PHP application
Embedding Jaspersoft into your PHP applicationEmbedding Jaspersoft into your PHP application
Embedding Jaspersoft into your PHP application
 
Angular interview questions
Angular interview questionsAngular interview questions
Angular interview questions
 
Java for XPages Development
Java for XPages DevelopmentJava for XPages Development
Java for XPages Development
 
MVC in PHP
MVC in PHPMVC in PHP
MVC in PHP
 
Unit 1 - TypeScript & Introduction to Angular CLI.pptx
Unit 1 - TypeScript & Introduction to Angular CLI.pptxUnit 1 - TypeScript & Introduction to Angular CLI.pptx
Unit 1 - TypeScript & Introduction to Angular CLI.pptx
 
UDA-Componentes RUP. Formulario
UDA-Componentes RUP. FormularioUDA-Componentes RUP. Formulario
UDA-Componentes RUP. Formulario
 
File system node js
File system node jsFile system node js
File system node js
 
Ambari Views - Overview
Ambari Views - OverviewAmbari Views - Overview
Ambari Views - Overview
 
Angular Interview Questions-PDF.pdf
Angular Interview Questions-PDF.pdfAngular Interview Questions-PDF.pdf
Angular Interview Questions-PDF.pdf
 
REST API 설계
REST API 설계REST API 설계
REST API 설계
 
주 52시간 시대의 Agile_ 오픈소스컨설팅 한진규 이사
주 52시간 시대의 Agile_ 오픈소스컨설팅 한진규 이사주 52시간 시대의 Agile_ 오픈소스컨설팅 한진규 이사
주 52시간 시대의 Agile_ 오픈소스컨설팅 한진규 이사
 

Viewers also liked

Growing object oriented software guided by test
Growing object oriented software guided by testGrowing object oriented software guided by test
Growing object oriented software guided by test
라한사 아
 

Viewers also liked (19)

스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기
 
신림프로그래머 스터디 웹팩 발표자료
신림프로그래머 스터디 웹팩 발표자료신림프로그래머 스터디 웹팩 발표자료
신림프로그래머 스터디 웹팩 발표자료
 
아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리
 
스프링 오픈소스 정리
스프링 오픈소스 정리스프링 오픈소스 정리
스프링 오픈소스 정리
 
Growing object oriented software guided by test
Growing object oriented software guided by testGrowing object oriented software guided by test
Growing object oriented software guided by test
 
동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO 동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO
 
스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료
 
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기
스프링 Generic autowired 로 구현하는 제너릭 컨트롤러 이야기
 
jQuery angular, React.js 로 댓글달아보기 공부했던 기록
jQuery angular, React.js 로 댓글달아보기 공부했던 기록jQuery angular, React.js 로 댓글달아보기 공부했던 기록
jQuery angular, React.js 로 댓글달아보기 공부했던 기록
 
자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기
 
스프링 Generic autowired이용해보기
스프링 Generic autowired이용해보기스프링 Generic autowired이용해보기
스프링 Generic autowired이용해보기
 
구글 검색엔진 최적화(Seo) 정리
구글 검색엔진 최적화(Seo) 정리구글 검색엔진 최적화(Seo) 정리
구글 검색엔진 최적화(Seo) 정리
 
Aws ses 이메일 보내기 받기 송신 수신
Aws ses 이메일 보내기 받기 송신 수신Aws ses 이메일 보내기 받기 송신 수신
Aws ses 이메일 보내기 받기 송신 수신
 
Go 페이징게시판만들기
Go 페이징게시판만들기Go 페이징게시판만들기
Go 페이징게시판만들기
 
spring data jpa 간단한 튜토리얼
spring data jpa 간단한 튜토리얼spring data jpa 간단한 튜토리얼
spring data jpa 간단한 튜토리얼
 
구글앱엔진+스프링+스프링datajpa+메이븐
구글앱엔진+스프링+스프링datajpa+메이븐구글앱엔진+스프링+스프링datajpa+메이븐
구글앱엔진+스프링+스프링datajpa+메이븐
 
Gulp 입문
Gulp 입문 Gulp 입문
Gulp 입문
 
스프링 프레임워크로 블로그 개발하기
스프링 프레임워크로 블로그 개발하기 스프링 프레임워크로 블로그 개발하기
스프링 프레임워크로 블로그 개발하기
 
Slipp 발표 - GO
Slipp 발표 - GOSlipp 발표 - GO
Slipp 발표 - GO
 

Similar to Golang 개발 환경(profile) 다르게 잡아주기

안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들
Sewon Ann
 
131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원
NAVER D2
 

Similar to Golang 개발 환경(profile) 다르게 잡아주기 (20)

Share some development
Share some developmentShare some development
Share some development
 
FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기FIFA 온라인 3의 MongoDB 사용기
FIFA 온라인 3의 MongoDB 사용기
 
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
 
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
 
[NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법 [NEXT] Android Profiler 사용법
[NEXT] Android Profiler 사용법
 
16 학술제 마무리 자료
16 학술제 마무리 자료16 학술제 마무리 자료
16 학술제 마무리 자료
 
스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글
 
Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDY
 
MongoDB in use(김인범, mongodb korea)
MongoDB in use(김인범, mongodb korea)MongoDB in use(김인범, mongodb korea)
MongoDB in use(김인범, mongodb korea)
 
안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들안드로이드 개발에 유용한 도구들
안드로이드 개발에 유용한 도구들
 
Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.
 
Django in Production
Django in ProductionDjango in Production
Django in Production
 
[NEXT] Android Profiler
[NEXT] Android Profiler[NEXT] Android Profiler
[NEXT] Android Profiler
 
Oracle History #8
Oracle History #8Oracle History #8
Oracle History #8
 
131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원
 
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
 
왜 레진코믹스는 구글앱엔진을 선택했나
왜 레진코믹스는 구글앱엔진을 선택했나왜 레진코믹스는 구글앱엔진을 선택했나
왜 레진코믹스는 구글앱엔진을 선택했나
 
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
 
Chrome DevTools로 JS 메모리릭 디버깅하기.pptx
Chrome DevTools로 JS 메모리릭 디버깅하기.pptxChrome DevTools로 JS 메모리릭 디버깅하기.pptx
Chrome DevTools로 JS 메모리릭 디버깅하기.pptx
 

More from 라한사 아 (6)

Go revel 구성_루팅_정리
Go revel 구성_루팅_정리Go revel 구성_루팅_정리
Go revel 구성_루팅_정리
 
Go revel 컨셉_정리
Go revel 컨셉_정리Go revel 컨셉_정리
Go revel 컨셉_정리
 
Groovy 시작 입문
Groovy 시작 입문Groovy 시작 입문
Groovy 시작 입문
 
프로그래밍 go투어 정리
프로그래밍 go투어 정리프로그래밍 go투어 정리
프로그래밍 go투어 정리
 
개발자를위한 오픈소스라이선스
개발자를위한 오픈소스라이선스개발자를위한 오픈소스라이선스
개발자를위한 오픈소스라이선스
 
자바채팅 다중
자바채팅 다중자바채팅 다중
자바채팅 다중
 

Golang 개발 환경(profile) 다르게 잡아주기

  • 1. ---------- 1 GO언어로 해보는 개발 환경변수 잡아보기 (GO를 몰라도 됨) https://fb.com/me.adunhansa https://twitter.com/arahansa http://adunhansa.tistory.com/ 사이트 : http://arahansa.com ABOUT CONTACT SOURCE 1
  • 2. 1. 작성자 소개 2 ------------------------------------------------------------------- 평소 정리를 즐겨합니다. 한 때 동영상강좌도 만들다보니.. 비실명과 만화캐릭터를 쓰네요 양해 부탁드립니다 ㅎㅎ
  • 3. 왜 이런 걸 만드나? 3 1. 이게 맞는지 점검하려고 2. 지식공유가 좋고 좋은거죠 뭐… 내가 삽질한만큼 다른 사람의 시간을 줄여준다는…아름다운-_-* source code git : https://github.com/arahansa/go_profile
  • 4. Production: Oracle Db 의도 = 환경변수를 다르게.. 4 • 배운게 도둑질이라고, 머리속의 기준점이 스프링프레임워크로 돌아가고 있습니다. • 스프링 프레임워크에서는 Profile이라는 기능이 있습니다. 어플리케이션을 개발을 하면서 로컬개발서버, 테스트서버, 스테이징서버 별로 각종 환경변수를 다르게 주기 위한 기능입니다. Staging: XX Server Local: H2 memory DB
  • 5. Bad -> Good 5 • 이렇게 데이터 접근영역에서 직접 주소를 적어주는 것은 별로 좋지가 않습니다. • 스프링에서 했던 것처럼 다음과 같이 개별 환경변수들을 빼주고 작업을 해줘보도록 하겠습니다.
  • 6. 최종 구현할 방향 6 1. 기본 설정은 local설정이되, flag설정으로 profile설정을 다르게 설정을 줄 수 있어야 합니다. 2. yaml문법의 파일을 읽어보도록 하겠습니다. 가독성이 좋고 프로파일링 하기가 좋습니다.
  • 7. 1. flag - 먼저 샘플코드를 만들자! 7 • 구현할 방향이 정해졌으면, 하나하나씩 기능들을 최소한의 단위로 분할해서 테스트를 해보고, 이것을 모아보면 됩니다. 먼저 flag부터 해보겠습니다. 우선 flag를 찾아서 돌려보겠습니다. 다음과 같은 소스에서 -h옵션을 주면 사용법이 -p=dev로 flag지정을 하는 걸 볼 수가 있습니다.
  • 8. 02. yaml 불러와보기 8 • 두번째는 yaml을 읽어보는 연습을 해봅니다. 구글링을 하면 첫번째로 나오는 사이트에 들어가보았습니다. https://github.com/go- yaml/yaml 대략 이런 식으로 맵으로 변환됨을 알 수가 있습니다.
  • 9. 03. yaml 을 파일로 읽어보기 9 • 그러면 yaml을 파일로 읽어보는 연습을 해봅니다. 다음의 사이트를 참고해봅니다. http://stackoverflow.com/questions/28682439/golang-parse-yaml-file • 대략 이런 식으로 동작을 하는 구나..느껴집니다.
  • 10. 04. unmarshal 추가해보기 연습 10 • 한가지 가정사항을 생각해봅시다. yaml에서 --- 이전의 설정들만 읽어들이니, 그 이후로는 각각의 프로파일링 변수를 집어넣을 것입니다. 그러면, 그 이후로 언마샬링을 한번 더 해야되는데, 덮어쓰기가 될 것인지 추가가 될 것인지 테스트를 해봐야 합니다. 다음의 경우를 해봅시다. 덮어쓰기가 아닌 추가로 잘 되는 것을 볼 수가 있군요…
  • 11. 요구사항 구현.. 11 • 이제 각각의 큰 기능들을 해보았으니, 조합을 해보면 됩니다. 요구사항을 조금 더 세밀하게 재정의해보겠습니다. 01. yaml파일을 읽어들여 문자열 파싱을 하고 환경변수들을 읽어들인 뒤에 , 02. 프로파일을 구하고, ---로 구분된 환경변수들을 읽어들여서 03. 제공된 profile에 맞는 환경변수를 골라서 읽은 뒤 04. map을 내부에 가지고 있고, 외부에서 꺼내올 때 해당 키에 해당하는 값이 없으면 에러를 내서 초반에 프로그램이 가동되지 않게 해보자.
  • 12. 각각을 조합해서 기능구현.. 01. yaml파일 읽어들이기.. 12 • 01. 첫번째 기능 구현… flag로 온 프로파일이 있으면 flag를 우선시하여서 설정을 줍니다. (결과)
  • 13. 02. 프로파일을 구하고, 13 • 프로파일을 찾아야 하므로, flag로 받던 기존에 설정된 프로파일이든 찾아서 설정을 하고..
  • 14. 03. 프로파일링 된 내용만 따로 추가 14 • 프로파일링된 내용만 따로 추가하겠습니다. 문자열을 다루는 부분이 조금 나옵니다만, go사이트의 패키지를 보고 찾아 쓰면 됩니다(;;;)
  • 15. 05. 외부로 적용 미리 준비.. 15 • 자 이제 이 map은 config패키지에 들어갈 것이고 repository영역에서 key값만으로 불러오게 될텐데 값이 없는 경우 에러가 나야 합니다. nil처리를 해줘서.. 초반에 설정이 잘못되면 프로그램 이륙(?)이 안되게 해줍시다.
  • 16. 나중엔…? 16 마지막 샘플코드까지 작성을 해봤으므로 이제 직접 main.go에 적용을 해볼 것입니다. config패키지를 나누고, 여기서 불러들일 것입니다. 대략 이런 구조가 되겠죠
  • 17. applicationContext - PropertySource 17 • 프로퍼티소스는 아마 이런 식으로.. 짜내려갈 것같습니다..흠…다른 할일이 있어서 일단 이만..ㅠ
  • 18. 이미지 라이선스 18 • 키보드 치는 남자 : http://www.freepik.com/index.php?goto=74&idfoto=765894 • 데이터베이스 : http://www.flaticon.com/free-icon/database- configuration_1374
  • 19. 19 THANK YOU ! 즐거운 개발됩시다. 아라한사 올림 arahansa ------ ------ 페북 : https://fb.com/me.adunhansa 트위터 : https://twitter.com/arahansa 블로그: http://adunhansa.tistory.com/ 사이트 : http://arahansa.com