개요
- 개발할때 필요한 이름이 들어간 데이터를 빈번히 수동으로 입력하는 불편함을 해소 하기위한 방법을 고민하던중 첫번째로 이름을 무작위로 생성하는 시뮬레이터를 만들어보기로 했다.
- 전자가족관계등록시스템에서 제공하는 통계데이터를 활용하였다.
- 이름의 경우 서울특별시를 기준으로 2008년,2012년,2022년 , 3년도의 데이터를 다운로드받아 사용하였다.
github 링크
1. 개발환경 세팅
- Editor : vscode + python extention
1. 디렉토리 만들기
먼저 디렉토리 및 파일들을 만들어 주겠습니다.
simulator 라는 최상위 디렉토리를 만들어 주고 data가 있는 upload 디렉토리안에 xlsx,json 디렉토리를 차례대로 만들어 줍니다.
디렉토리를 만드는 것은 여러가지 방법이 있지만, cmd에 명령어로 생성 해주고, 해당 디렉토리로 이동합니다.
mkdir simulator; simulator\upload;simulator\upload\xlsx;simulator\upload\json cd .\simulator
2. 파이썬 가상환경
이동한 디렉토리에서 파이썬 가상환경을 만들어 줍니다.
이름은 simulator로 하겠습니다.
python -m venv simulator
3.VScode 설정
code ./
vscode를 열어 줍니다.
vscode에 python extention이 설치가 되어있으면, F1 또는 명령 팔레트를 통해 python select 검색후 디버깅시 사용할 python을 선택해 줍니다.
4. 파일 이동
- 전자가족관계등록시스템에서 받은 이름 + 성씨 파일을 upload→ xlsx 폴더로 옮겨줍니다.
2. 파일 정제
이름 생성기는 성씨 파일에서 가져온 성씨 + 이름 파일에서 가져온 이름을 랜덤하게 조합해 생성합니다.
하지만 현재 다운로드 받은 파일들은 불필요한 데이터가 있기때문에 이러한 데이터들을 제거하고, 3년도로 나뉘어진 파일들을 모두 불러와 성씨 + 이름 데이터가 있는 1개의 json 파일로 만들어 주겠습니다.
1. package 설치
먼저 터미널을 열어 엑셀 파일을 다루기 위해 pandas 와 xlrd 패키지를 설치해 줍니다.
python -m pip install pandas xlrd
2. merge_files 함수 생성
name.py 함수에 merge_files함수를 생성해 주겠습니다.
merge_files 함수는 모든 이름 + 성씨 파일을 불러와 정제후 하나로 합치고, json 파일로 저장하는 기능을 합니다.
먼저 pandas 를 import 한후 merge_files 함수를 정의합니다.
import pandas as pd def merge_files(): pass
이제 pass 부분에 필요한 코드들을 작성합니다.
먼저 pandas의 read_excel 함수를 사용해 모든 파일들을 불러와 변수에 대입합니다.
import pandas as pd def merge_files(): family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls') name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls') name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls') name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls')
이쯤 각각의 변수를 출력해 보면서 디버깅을 해보겠습니다.
하기전에 다음의 코드를 추가해 줍니다.
import pandas as pd def merge_files(): family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls') name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls') name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls') name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls') print(family_names) print(name_2022) print(name_2012) print(name_2008) if __name__=="__main__": merge_files()
F5를 눌러 실행시켜줍니다.
각각 의 파일들의 헤더가 1 행씩 밀려서 나오기 때문에 read_excel 함수에 header 매개변수를 1 로 넣어 줍니다.
import pandas as pd def merge_files(): family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1) name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1) name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1) name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1) print(family_names) print(name_2022) print(name_2012) print(name_2008) if __name__=="__main__": merge_files()
각각의 데이터를 살펴 보면
성씨의 경우
성씨라는 컬럼의 데이터가 필요하고 여기에 입력 된 데이터를 번호. 성씨로 되어있습니다.
이 번호를 지원주는 코드를 추가하면 됩니다. 그리고 성별이 남녀로 2개씩 중복되기때문에 unique함수를 써주면 좋을것 같습니다.
이름의 경우
이름 컬럼의 데이터만 가져오면 될것같습니다. 그리고 3개를 1개로 합쳐 주면 됩니다.
이제 위에서 생각해본 대로 해당 코드를 이어서 작성해 줍니다.
import pandas as pd def merge_files(): family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)['성씨'].iloc[:-1].apply(lambda x: x[4]).unique().tolist() name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)['이름'].iloc[:-1] name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)['이름'].iloc[:-1] name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)['이름'].iloc[:-1] names = pd.concat([name_2022,name_2012,name_2008]).tolist() print(family_names) print(names) if __name__=="__main__": merge_files()
출력된 결과를 보면 기타 라는 데이터가 들어가 있고, 중복된것도 있는거 같습니다. 이를 처리해 주는 코드를 작성해 주고, 각각의 리스트들을 key에 담아 딕셔너리로 만들어 json파일로 저장하는 과정을 코드로 작성합니다.
먼저 filter 함수로 기타를 삭제하고, set으로 names의 중복을 제거후 다시 list함수로 리스트로 만들어 줍니다.
import pandas as pd def merge_files(): family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)['성씨'].iloc[:-1].apply(lambda x: x[4]).unique().tolist() name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)['이름'].iloc[:-1] name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)['이름'].iloc[:-1] name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)['이름'].iloc[:-1] names = pd.concat([name_2022,name_2012,name_2008]).tolist() names.remove('기타') names = list(set(names)) print(family_names) print(names) if __name__=="__main__": merge_files()
이제 json 모듈을 import 한 후 각각의 리스트를 담은 딕셔너리를 만들어 json으로 저장합니다.
json은 upload → json 에 names.json이라는 파일로 저장하겠습니다.
import pandas as pd import json def merge_files(): family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)['성씨'].iloc[:-1].apply(lambda x: x[4]).unique().tolist() name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)['이름'].iloc[:-1] name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)['이름'].iloc[:-1] name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)['이름'].iloc[:-1] names = pd.concat([name_2022,name_2012,name_2008]).tolist() names.remove('기타') names = list(set(names)) names_dic = {'f':family_names,'n':names} with open('.\\upload\\json\\names.json','w',encoding='utf-8') as f: json.dump(names_dic,f) print(family_names) print(names) if __name__=="__main__": merge_files()
file이 생성 잘 생성되었습니다.
이제 이 파일을 불러와 데이터가 정상적으로 들어가있는지 확인해 봅니다.
import pandas as pd import json def merge_files(): family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)['성씨'].iloc[:-1].apply(lambda x: x[4]).unique().tolist() name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)['이름'].iloc[:-1] name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)['이름'].iloc[:-1] name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)['이름'].iloc[:-1] names = pd.concat([name_2022,name_2012,name_2008]).tolist() names.remove('기타') names = list(set(names)) names_dic = {'f':family_names,'n':names} with open('.\\upload\\json\\names.json','w',encoding='utf-8') as f: json.dump(names_dic,f) print(family_names) print(names) if __name__=="__main__": merge_files() with open('.\\upload\\json\\names.json','r',encoding='utf-8') as f: names_dic = json.load(f) print(names_dic)
정상적으로 잘 들어있네요.!
3.class Name
파일을 정제해 하나의 json 파일로 만들었습니다. 이제 이 파일에 들어있는 데이터를 통해 이름을 생성하는 기능들을 담고 있는 class를 만들어 주겠습니다.
merge_files 함수 밑으로 class Name을 선언합니다.
print 와 if __name__... 밑으로 작성된 코드들은 삭제 처리 해주겠습니다.
그리고 if __name__..밑으로는 Name 클래스를 불러와 줍니다.
import pandas as pd import json def merge_files(): family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)['성씨'].iloc[:-1].apply(lambda x: x[4]).unique().tolist() name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)['이름'].iloc[:-1] name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)['이름'].iloc[:-1] name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)['이름'].iloc[:-1] names = pd.concat([name_2022,name_2012,name_2008]).tolist() names.remove('기타') names = list(set(names)) names_dic = {'f':family_names,'n':names} with open('.\\upload\\json\\names.json','w',encoding='utf-8') as f: json.dump(names_dic,f) class Name: pass if __name__=="__main__": n = Name()
1. 생성자
class Name 에 필요한 생성자를 만들어 봅니다.
class Name: def __init__(self): pass
필요한 것은 위에서 만든 json 파일안의 데이터가 들어와있어야 합니다.
이 json파일을 불러오는 기능을 하는 read_json() 함수를 만들어 주고, self.names_dic 변수에 이 함수의 반환값을 넣어 주겠습니다.
class Name: def __init__(self): self.names_dic = self.read_json() def read_json(self): with open('.\\upload\\json\\names.json') as f: data = json.load(f) return data
이때 파일 경로는 상대적 경로로 지정해 주었습니다.
os 모듈을 사용해 실행되는 파일의 절대 경로와 합쳐 주겠습니다.
상단에 os 모듈을 import 시켜 줍니다.
print(n.names_dic)으로 데이터가 잘 있는지 확인해 줍니다.
import pandas as pd import json import os def merge_files(): family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)['성씨'].iloc[:-1].apply(lambda x: x[4]).unique().tolist() name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)['이름'].iloc[:-1] name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)['이름'].iloc[:-1] name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)['이름'].iloc[:-1] names = pd.concat([name_2022,name_2012,name_2008]).tolist() names.remove('기타') names = list(set(names)) names_dic = {'f':family_names,'n':names} with open('.\\upload\\json\\names.json','w',encoding='utf-8') as f: json.dump(names_dic,f) class Name: def __init__(self): self.names_dic = self.read_json() def read_json(self): file_ = os.path.abspath(os.path.dirname(__file__)) filepath = os.path.join(file_,'upload','json','names.json') with open(filepath,'r',encoding='utf-8') as f: data = json.load(f) return data if __name__=="__main__": n = Name() print(n.names_dic)
잘 나오네요.
이제 이중에 키 f의 값들은 self.f에 n 값들은 self.n에 대입해 줍니다.
2. 이름 1개 무작위 생성
이름 1개를 무작위로 생성하는 기능을 하는 함수 generate() 를 만들어 줍니다.
random 모듈의 randint 함수를 활용해 무작위로 나온 정수로 self.f 와 self.n 의 값을 무작위로 가져와 합쳐줍니다. 각각의 randint 의 마지막값으로는 self.f 와 self.n의 길이에서 -1을 해준값을 넣어 줍니다.
코드작성후 5번 정도 실행해 출력값을 확인해 보겠습니다.
print(n.generate()) print(n.generate()) print(n.generate()) print(n.generate())
class Name: def __init__(self): self.names_dic = self.read_json() self.f = self.names_dic['f'] self.n = self.names_dic['n'] def read_json(self): file_ = os.path.abspath(os.path.dirname(__file__)) filepath = os.path.join(file_,'upload','json','names.json') with open(filepath,'r',encoding='utf-8') as f: data = json.load(f) return data def generate(self): fr = random.randint(0,len(self.f)) fn = random.randint(0,len(self.n)) fr = self.f[fr] fn = self.n[fn] result = fr + fn return result if __name__=="__main__": n = Name() print(n.generate()) print(n.generate()) print(n.generate()) print(n.generate()) print(n.generate())
5개 모두 잘 나오네요!
4. Generate 많이 많이
이름을 여러개 만들기 위해서 generate 함수를 여러번 돌려야 합니다.
차라리 generate 함수에서 num 매개변수를 받아 for문을 돌려서 list형태로 반화하도록 수정합니다.
기본값을 1로 하여 generate함수에 매개변수를 입력하지 않을경우에는 1개의 이름이 들어있는 리스트를 반환하도록 합니다.
기존에 만들었던 generate 함수 앞에 언더스코어 2개를 붙여 맹글링 처리를 하고, 새로운 generate함수를 선언하여 리스트 컴프리핸션으로 __generate 함수를 불러오는 방식으로 코드를 작성했습니다.
작성한 코드를 테스트 하기위해 매개변수를 다 다르게 넣어 출력값을 확인해 봅니다.
class Name: def __init__(self): self.names_dic = self.read_json() self.f = self.names_dic['f'] self.n = self.names_dic['n'] def read_json(self): file_ = os.path.abspath(os.path.dirname(__file__)) filepath = os.path.join(file_,'upload','json','names.json') with open(filepath,'r',encoding='utf-8') as f: data = json.load(f) return data def __generate(self): fr = random.randint(0,len(self.f)-1) fn = random.randint(0,len(self.n)-1) fr = self.f[fr] fn = self.n[fn] result = fr + fn return result def generate(self,num=1): return [self.__generate() for _ in range(num)] if __name__=="__main__": n = Name() n_default = n.generate() print('기본',len(n_default)) for i in [10,100,500,900]: n_g = n.generate(i) print(f'이름 {i}개 생성',len(n_g))
잘 생성 되었네요!!
5. 좀 더 괜찮게? 수정을 해보자
num에 넣어준 개수 만큼 이름이 생성되지만, 중복을 제거하면, 입력된 num 보다 더 적은 수만큰 생성됩니다.
중복을 허용하지 않으면서 원하는 개수만큼 만들어 주고 싶네요.
그런데 조합의 수를 고려하면 현재 데이터로는 일정 개수 이상으로는 만들수가 없습니다.
현재 데이터에 포함된 성씨는 20개 , 이름은 40개 입니다.
조합의 수를 생각해 보면 800개 입니다.
최대 조합의 수를 늘리기 위해 self.n에 있는 이름에 쓰이는 한글을 1글자씩 중복되지 않는 한글 리스트로 만들어 주고, 이름의 첫번째에 쓰인 것은 2번째는 쓰이지 않도록 하는 과정을 거쳐 최대 조합의 수를 늘려 보도록 하겠습니다.
1. 데이터 수정
먼저 self.n에 있는 데이터를 중복되지 않는 한글 1자를 요소로 가지는 리스트로 변환하여 줍니다.
names_to_char라는 함수를 만들어 사용해 보겠습니다.
그리고 self.c에 이 데이터를 담아 출력해 봅니다.
class Name: def __init__(self): self.names_dic = self.read_json() self.f = self.names_dic['f'] self.n = self.names_dic['n'] self.c = self.__names_to_char(self.n) def read_json(self): file_ = os.path.abspath(os.path.dirname(__file__)) filepath = os.path.join(file_,'upload','json','names.json') with open(filepath,'r',encoding='utf-8') as f: data = json.load(f) return data def __generate(self): fr = random.randint(0,len(self.f)-1) fn = random.randint(0,len(self.n)-1) fr = self.f[fr] fn = self.n[fn] result = fr + fn return result def __names_to_char(self,name=[]): result = [] for s in name: result += list(s) result = list(set(result)) return result def generate(self,num=1): return [self.__generate() for _ in range(num)] if __name__=="__main__": n = Name() print(n.c) print(len(n.c))
총 29개의 한글이 생겼습니다. 이제 이 self.c를 이용하면 20 * 29 * 28 = 16240 개의 이름 조합을 생각해 볼수 있습니다.
이 최대 조합의 수를 self.max_num 에 담아 주고,
__generate 함수와 generate 함수를 수정해 줍니다.
class Name: def __init__(self): self.names_dic = self.read_json() self.f = self.names_dic['f'] self.n = self.names_dic['n'] self.c = self.__names_to_char(self.n) self.max_num = 16240 def read_json(self): file_ = os.path.abspath(os.path.dirname(__file__)) filepath = os.path.join(file_,'upload','json','names.json') with open(filepath,'r',encoding='utf-8') as f: data = json.load(f) return data def __generate(self): result = '' i = random.randint(0,len(self.f)-1) result += self.f[i] ic = random.randint(0,len(self.c)-1) s = self.c[ic] result += self.c[ic] self.c.remove(s) i = random.randint(0,len(self.c)-1) result += self.c[i] self.c.insert(ic,s) return result def __names_to_char(self,name=[]): result = [] for s in name: result += list(s) result = list(set(result)) return result def generate(self,num=1): i = 1 result = {} while i<=num: print(f'{i}\r',end='') k = self.__generate() try: g = result[k] if self.max_num+1 ==i: break except: result[k] = 0 i+=1 result = list(result.keys()) return result if __name__=="__main__": n = Name() n_default = n.generate() n_500 = n.generate(500) n_16241 = n.generate(16241) print(n_default,len(n_default)) print(len(n_500)) print(len(n_16241))
6. txt 파일로 저장!
생성된 이름들을 txt 파일로 저장하는 함수를 만들어 줍니다.
함수명을 save로 하고, 파라미터로는 저장할 데이터 리스트와 저장되는 경로를 받아옵니다.
class Name: def __init__(self): self.names_dic = self.read_json() self.f = self.names_dic['f'] self.n = self.names_dic['n'] self.c = self.__names_to_char(self.n) self.max_num = 16240 def read_json(self): file_ = os.path.abspath(os.path.dirname(__file__)) filepath = os.path.join(file_,'upload','json','names.json') with open(filepath,'r',encoding='utf-8') as f: data = json.load(f) return data def __generate(self): result = '' i = random.randint(0,len(self.f)-1) result += self.f[i] ic = random.randint(0,len(self.c)-1) s = self.c[ic] result += self.c[ic] self.c.remove(s) i = random.randint(0,len(self.c)-1) result += self.c[i] self.c.insert(ic,s) return result def __names_to_char(self,name=[]): result = [] for s in name: result += list(s) result = list(set(result)) return result def generate(self,num=1): i = 1 result = {} while i<=num: print(f'{i}\r',end='') k = self.__generate() try: g = result[k] if self.max_num+1 ==i: break except: result[k] = 0 i+=1 result = list(result.keys()) return result def save(self,data=[],filepath='./names.txt'): with open(filepath,'w',encoding='utf-8') as f: f.write('\n'.join(data)) if __name__=="__main__": n = Name() n_500 = n.generate(500) n.save(n_500,'.\\names.txt')
7. 파이썬 실행을 위한 argument 받아 오기
이제 파이썬으로 해당 파일을 실행할때 필요한 인자를 받아 오기 위해 argparse 모듈을 사용해 추가적인 코드를 작성해 줍니다.
실행 하면서 완료되는 출력문들도 넣어 줍니다
전체코드 입니다.
# 전체 코드 import pandas as pd import json import os import random import argparse def merge_files(): family_names = pd.read_excel('.\\upload\\xlsx\\가족관계등록부상 성씨 현황.xls',header=1)['성씨'].iloc[:-1].apply(lambda x: x[4]).unique().tolist() name_2022 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2008.xls',header=1)['이름'].iloc[:-1] name_2012 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2012.xls',header=1)['이름'].iloc[:-1] name_2008 = pd.read_excel('.\\upload\\xlsx\\상위 출생신고 이름 현황_2022.xls',header=1)['이름'].iloc[:-1] names = pd.concat([name_2022,name_2012,name_2008]).tolist() names.remove('기타') names = list(set(names)) names_dic = {'f':family_names,'n':names} with open('.\\upload\\json\\names.json','w',encoding='utf-8') as f: json.dump(names_dic,f) class Name: def __init__(self): self.names_dic = self.read_json() self.f = self.names_dic['f'] self.n = self.names_dic['n'] self.c = self.__names_to_char(self.n) self.max_num = 16240 def read_json(self): file_ = os.path.abspath(os.path.dirname(__file__)) filepath = os.path.join(file_,'upload','json','names.json') with open(filepath,'r',encoding='utf-8') as f: data = json.load(f) return data def __generate(self): result = '' i = random.randint(0,len(self.f)-1) result += self.f[i] ic = random.randint(0,len(self.c)-1) s = self.c[ic] result += self.c[ic] self.c.remove(s) i = random.randint(0,len(self.c)-1) result += self.c[i] self.c.insert(ic,s) return result def __names_to_char(self,name=[]): result = [] for s in name: result += list(s) result = list(set(result)) return result def generate(self,num=1): print('이름을 생성합니다.') i = 1 result = {} while i<=num: print(f'{i}\r',end='') k = self.__generate() try: g = result[k] if self.max_num+1 ==i: break except: result[k] = 0 i+=1 result = list(result.keys()) print('이름 생성 완료') return result def save(self,data=[],filepath='./names.txt'): with open(filepath,'w',encoding='utf-8') as f: f.write('\n'.join(data)) print(f'{filepath} 저장 완료') if __name__=="__main__": n = Name() parser = argparse.ArgumentParser() parser.add_argument('--num',default=1,help="생성하는 이름의 개수 지정") parser.add_argument('--filepath',default='.\\names.txt',help="저장 경로(default=현재 경로 names.txt )") args =parser.parse_args() num = int(args.num) filepath =args.filepath data= n.generate(num) n.save(data,filepath)
파일을 저장하고 터미널에 아래와 같은 명령어를 입력해 테스트 해봅니다.
python name.py --num 30 --filepath .\\names_text.txt
아주 잘 되는 군요 ㅎㅎ
회고
이름 생성기를 만들면서 다른 정보를 포함한 개인정보 생성 모듈을 만들면 좋겠다는 생각이 들었스니다.
이름 생성을 위해 한글을 좀더 추가 해 준다면, 더 많은 조합을 생성해 볼수 있지 않을까 합니다.
다음은 다른걸 만들어 봐야겠습니다.