레이블이 개발인 게시물을 표시합니다. 모든 게시물 표시
레이블이 개발인 게시물을 표시합니다. 모든 게시물 표시
2021년 8월 29일 일요일

파이썬의 기본 문법

컴퓨터 공부는 '백물이 불여일타'. 어려운 말들 늘어놓고 이말 저말 암기하려고 하면 공부하기가 힘듭니다. 컴퓨터 공부는 일단 두드려 보고, 만들어 보는 것이 가장 빠르게 학습을 하는 길이라고 생각합니다. 파이썬 공부를 처음 시작하시는 분들을 위해서 만든 포스팅입니다. 파이썬 언어의 특징, 자료 구조 등등 이론적 토대는 별도로 공부를 하시길 바랍니다.

온라인 컴파일러


파이썬 문법 공부는 아래의 사이트를 통해서 진행하시면 됩니다. 실제로는 파이썬을 설치해서 사용해야 하지만 그것은 나중에 꼭 필요할 때 하시는 것으로 하고, 일단 문법 공부를 간단하게 하는 정도는 온라인 컴파일러를 사용하시는 것을 추천합니다. 

맥북이나 맥에는 파이썬이 기본적으로 깔려 있습니다. 터미널 사용법을 아시는 분은 터미널에서 파이썬을 구동해서 공부해도 됩니다.

일단 파이썬 설치를 못 하는 분들을 위해서 3개의 사이트를 추천해 드리겠습니다. 취향에 맞는 곳에서 공부하시면 됩니다.


기초문법


이제부터는 글을 평어체로 쓰겠습니다.

변수와 자료형


파이썬은 변수 선언을 할 때 데이터 타입을 명시하지 않는다. 또한, 자바스크립트의 변수 선언부처럼 'var'와 같은 것도 사용할 필요가 없다.
a = 10
위와 같이 사용하면 그만이다. 변수 a는 int값 10을 갖게 되었다.
a = 10
print(a)
print(type(a))
변수 a에 담긴 값과 데이터 타입을 확인해 보면 그 결과는 다음과 같다.




변수 a에는 숫자 10이라는 값이 담겨 있으며 데이터 타입은 int형임을 알 수 있다. 어디서나 이렇게 유연하게 변수 선언을 하면 된다.
count = 20
math, english = (90, 100)
name = "Jongsik"
option = True
memo = "Good morning"
score = 90.5
companies = ["LG", "Samsung", "Hyundai"]

print(count, math, name, option, memo, score, companies)
print(type(count), type(math), type(name), type(option), type(memo), type(score), type(companies))
자료형을 몇가지 더 사용해보았다. 위에서 아래로 count, math, name 등의 변수를 선언하였다. 순서대로 정수형, 정수형(튜플 이용), 문자열, 불리언, 문자열, 실수형, 리스트 형태의 자료가 사용되었다.

변수가 가진 값들을 그대로 print한 것과 각 변수의 자료형태를 print한 결과는 다음과 같다.


이처럼 파이썬은 자료형을 별도로 설정하지 않아도 들어가는 값에 따라 자동으로 자료형태가 설정된다.

주석

"""
파이썬입니다!
기본적인 변수 사용법에 대한 연습장
여러줄 주석은 이렇게 사용합니다
"""

# 리스트 타입 (한줄 주석)
companies = ["LG", "Samsung", "Hyundai", "Google", "Amazon"]

print(companies)
print(companies[0])
print(companies[2])
print(companies[3][0])
print(companies[3] + companies[4])
이번에는 주석문을 사용하였다. 한줄 주석은 #을 사용하면 된다. 주석문을 여러줄로 사용하고 싶은 경우에는 홑따옴표나 쌍따옴표를 3개 연속으로 사용하고 이것으로 감싸주면 된다. 보통 IDE를 사용할 경우에는 윈도우는 Ctrl + / 맥은 Option + / 키를 사용하면 편리하다.

리스트와 딕셔너리


리스트 타입을 다룰일이 많을테니 리스트 타입을 다루는 아주 기본적인 방법 몇가지만 짚고 넘어가보자. 위의 코드를 실행하면 5개의 print문이 아래와 같이 출력된다.





companies라는 변수는 5개의 회사 이름이 각각의 원소로 존재하는 리스트를 갖고 있다. 이것을 그냥 print문으로 출력하면 목록과 목록이 가진 원소값들 그러니까 회사 이름이 그대로 출력된다.

다른 언어들이 배열을 다룰 때 처럼 대괄호를 사용하면 특정한 원소값만 출력할 수 있다. 가장 앞에 있는 원소값 즉, companies[0]을 출력하면 목록에서 가장 앞에 있는 'LG'가 출력된다. 당연히 companies[2]를 출력하면 3번째에 있는 'Hyundai'가 출력된다.

companies[3][0] 이 부분이 재미있다. 다른 언어에서는 2차원 배열에 속한 원소값을 꺼내올 때 이렇게 사용한다. 위의 예제에서는 'G'가 출력된다. 4번째에 있는 원소 'Google'에서 다시 첫번째에 있는 글자인 'G'를 추출한 것이다.

마지막으로 4번째 원소와 5번째 원소를 단순히 더하기 하면 결과값은 'GoogleAmazon'이다. 위의 예제에서 리스트에 포함된 모든 원소는 문자열이기 때문에 문자열을 더하면 단순히 문자열이 합해진 값이 결과로 출력된다.
a = "We are Korean!"

print(a)
print(a[:])
print(a[0])
print(a[:5])
print(a[4:8])
변수 a에 담긴 값은 단순한 문자열이다. 파이썬은 유연해서 단순 문자열에 포함된 각 문자도 하나의 원소로 취급할 수 있다.

리스트를 다룰때와 마찬가지로 대괄호 []를 사용하여 문자열에 포함된 특정한 문자를 추출할 수 있다. 파이썬은 리스트에 포함된 원소를 추출하거나 슬라이싱 하기 위해서 콜론을 이용한다. 독특하고 편리하게 원하는 값을 추출할 수 있다.

[:]를 사용하면 리스트의 모든 값을 출력한다. [:5]는 [0:5]와 동일하다. 첫번째 글자부터 6번째 글자까지 슬라이스 하여 추출하라는 의미이다. [4:8]은 5번째 글자부터 9번째 글자까지 출력하라는 의미이다. [4:]라고 하면 5번째 글자부터 마지막까지 모두 출력하라는 의미이다. 위의 예제를 실행하면 결과값은 아래와 같다.






이상에서 소개한 자료형 외에도 파이썬은 다양한 자료형을 제공한다. 복소수 형태라던가 딕셔너리도 제공한다. 복소수는 사용할 일이 많을지 모르겠지만 딕셔너리는 이야기가 나온김에 간단하게 살펴보고 넘어가자.
user = { "name": "Jongsik", "age": 39, "sex": "male" }

print(user)
print(user["name"])
print(user["age"])
딕셔너리는 "키:밸류" 쌍으로 이루어진 값들의 집합이다. JSON을 많이 사용해 보았다면 익숙한 형태일 것이다. 파이썬의 딕셔너리는 JSON으로 다시 JSON은 딕셔너리로 입출력이 편리하다.




위의 예제를 출력한 결과값은 이와 같다. 다른 프로그래밍 언어에서 딕셔너리를 다루는 법과 거의 동일하다.

분기처리 제어문, if


이제 제어문의 기본적인 형태를 살펴보자.
a = True

if a == True:
    print("결과는 참")
else:
    print("결과는 거짓")
    
------------------------
>> 결과는 참
변수 a에 불리언 값 True를 주었다. if문을 사용해서 a의 값이 참이면 '결과는 참'이라는 문장을 출력하고 거짓이면 '결과는 거짓'이라는 문장을 출력하는 아주 간단한 코드이다.

다른 프로그래밍 언어와 별달리 다른 점은 없다. 다만, 파이썬만의 특성이 몇가지 있는데 그 부분만 짚고 넘어가면 되겠다.

우선 파이썬의 제어문에는 보통의 다른 언어와 달리 괄호가 없다. 그냥 조건문을 작성하고 콜론(:)을 사용하여 해당 문장을 마무리하면 된다. 콜론을 빠뜨리면 에러가 난다.

그리고 조건문 이후에 오는 문장은 인덴테이션을 받드시 해주어야 한다. 파이썬은 문장의 끝을 알리는 세미콜론(;)을 사용하지 않는 만큼 정확한 인덴테이션을 요구한다. 따라서, 인덴테이션을 제대로 해주지 않아도 구문 오류가 난다. 주석문 조차도 마음대로 달련 오류가 나니 인덴테이션을 제대로 맞춰주도록 한다.
age = 39

if age >= 10 and age <= 19:
    print("당신은 10대입니다")
elif age >= 20 and age <= 29:
    print("당신은 20대입니다")
elif age >= 30 and age <= 39:
    print("당신은 30대입니다")
else:
    print("당신은 청년은 아닙니다")
    
------------------------
>> 당신은 30대입니다
이번에는 변수 a에 39라는 정수를 어싸인하였다. 변수 a에 있는 값으로 현재 세대를 판정하는 간단한 if ~ elif ~ else 제어문이다.

이것도 다른 프로그래밍 언어와 별로 다른 부분은 없지만 파이썬의 특징이 몇가지 있다. 우선 파이썬은 &&, || 와 같은 연산자를 사용하지 않는다. 파이썬에서는 해당 연산자를 곧이 곧대로 and, or 라고 사용하면 된다.

그리고 조건이 여러가지인 경우에 다른 언어에서의 else if 문을 파이썬에서는 elif로 사용한다. 일단은 이 부분만 중점적으로 숙지하면 된다.
car = {"benz", "bmw", "audi"}

if "benz" in car:
    print("독일차 명단에 존재합니다")

--------------------------------
독일차 명단에 존재합니다
딕셔너리나 목록에 특정한 값이 포함되어 있는지 in 을 사용하여 간단하게 체크할 수 있다.
member = { "Jinsu", "Mihee", "Sohee" }

if "Jongsik" not in member:
    print("Jongsik은 멤버가 아닙니다")
위와 같이 not을 사용하여 목록에 포함되지 않은 값을 처리할 수도 있다. 다른 프로그래밍 언어 경험이 있다면 !in과 같은 방법을 시도하는 분도 있을텐데 이 구문은 잘못된 구문으로 오류를 뱉는다. not in이라고 정확하게 쓰자.

반복문, for


프로그래밍 언어에서 사용하는 제어문의 양대산맥 중 하나인 if문을 이용한 분기처리 문법에 대해서 수박 겉핥기로 알아보았다. 이제 나머지 한쪽 산맥인 반복문에 대해서 알아보자.

여러가지 형태의 반복문 중 단연 많이 쓰이는 것은 for문이다.
for i in range(0, 5):
    print(i)

결과:----------------------
0
1
2
3
4
가장 간단한 형태의 for문이다. 0에서 시작해서 4까지 총 5바퀴를 돌면서 i값을 출력하는 코드다. 다른 언어와는 조금 다른 점이 보이는데 하나씩 짚어보자.

우선 range라는 부분이 독특하게 여겨질 것이다. range는 다음과 같이 사용한다. range(시작숫자, 끝나는 숫자, 증가값). 여기서 시작숫자와 증가값은 생략할 수 있다. 시작숫자를 생략하면 0에서 끝 숫자까지 도는 것이고, 증가값을 제외하면 다른 언어의 ++과 비슷한 효과를 가지며 한바퀴 돌 때 마다 값을 1씩 증가시킨다.

for문도 if문과 마찬가지로 선언문이 끝나는 부분에 세미콜론(:)을 사용해주고, 그 다음줄부터는 들여쓰기(인덴테이션)를 제대로 맞추어 주저야 한다. 그렇지 않으면 구문 오류로 코드가 실행되지 않는다.

위의 예제는 for 문을 돌리면서 선언한 변수 i에 한바퀴 돌 때마다 0에서 4까지 숫자를 1씩 증가시키면서 i를 i++ 처리하는 예제다. range의 끝나는 숫자 바로 앞의 숫자까지 for문이 돈다.
numbers = [1, 3, 7, 9, 12]

for i in numbers:
    print(i)
    
결과:----------------------
1
3
7
9
12
리스트에 있는 원소의 숫자만큼 for문을 돌고 각 원소를 하나씩 꺼내서 뿌려주는 코드다.

반복문, while


while은 조건이 참인 경우에 루프를 도는 반복문이다. 기본적인 문법은 다음과 같다.

while 조건문:
    실행되는 코드
For 문과 달리 튜플을 돌거나 변수 생성을 하지 않느다. 조건문이 True인지 False인지를 체크하고 조건문의 결과가 True인 경우에만 루프를 돈다.
debt = 1000
due = 0
while debt > 0:
    debt = debt - 100
    due = due + 1
    print("상환 {0}개월차, 빚 100만원을 갚았습니다".format(due))
    print("남은 빚은 {0}만 원입니다".format(debt))
    
    if debt == 0:
        print("모든 빚을 갚았습니다")

결과: -----------------------------
상환 1개월차, 빚 100만원을 갚았습니다
남은 빚은 900만 원입니다
상환 2개월차, 빚 100만원을 갚았습니다
남은 빚은 800만 원입니다
상환 3개월차, 빚 100만원을 갚았습니다
남은 빚은 700만 원입니다
상환 4개월차, 빚 100만원을 갚았습니다
남은 빚은 600만 원입니다
상환 5개월차, 빚 100만원을 갚았습니다
남은 빚은 500만 원입니다
상환 6개월차, 빚 100만원을 갚았습니다
남은 빚은 400만 원입니다
상환 7개월차, 빚 100만원을 갚았습니다
남은 빚은 300만 원입니다
상환 8개월차, 빚 100만원을 갚았습니다
남은 빚은 200만 원입니다
상환 9개월차, 빚 100만원을 갚았습니다
남은 빚은 100만 원입니다
상환 10개월차, 빚 100만원을 갚았습니다
남은 빚은 0만 원입니다
모든 빚을 갚았습니다
빚 1000만 원을 변수 debt가 갖고 있다. while 문은 빚을 모두 값아서 0원이 될 때까지 루프문을 돈다. 루프를 한바퀴 돌 때 마다 빚을 100만원 씩 갚아 나가고, 기간을 1개월씩 증가시킨다. 최종적으로 빚을 모두 갚으면 빚을 모두 갚았다는 문구를 출력하고 루프문을 종료하는 간단한 코드이다.

continue, break, pass


continue : 반복문의 초반으로 돌아가서 다음 반복문을 계속 실행한다.
break : 반복문의 실행을 중단하고 빠져나간다.
pass : 처리될 구문은 있지만 처리할 일은 없을 때 익셉션을 방지하기 위해 사용한다.

먼저 break는 제어문을 탈출할 때 사용한다. 간단한 사용 방법은 다음과 같다.
for a in range(0 ,10):
    if a == 3:
        break
    print(a)

결과:--------------------
0
1
2
위의 구문은 변수 a에 0부터 9까지 총 10바퀴를 돌면서 숫자를 할당하고 출력하게 하는 코드이다. if 문 안에 break가 걸려있다. for문이 3바퀴를 돌고나면 break가 걸리면서 이 루프문은 종료된다. break는 이렇게 루프를 종료하고 빠져나가는 역할을 갖고 있다.
for a in range(0 ,10):
    if a == 3:
        continue
    print(a)
결과:--------------------
0
1
2
4
5
6
7
8
9
이 구문은  앞의 구문과 동일하다. break가 있던 부분에 continue가 들어간 것만 다르다. break와 달리 continue는 루프를 계속 돈다. 파이썬 인터프리터가 continue를 만나는 순간 아래에 있는 코드는 무시하고 곧장 다시 루프문의 다음 바퀴를 돌기 위해 올라간다. 그리고 다시 루프를 계속 돈다.

결과를 보면 0에서 9까지 10바퀴의 루프를 도는 동안 3번은 print가 되지 않은 것을 확인할 수 있다. 3바퀴째에 print 구문에 도달하기 전에 continue를 만났기 때문이다.
def test(a):
    
print (test("안녕!"))

결과:----------------------
File "<string>", line 3
    print (test("안녕!"))
    ^
IndentationError: expected an indented block
위의 코드는 test라는 함수를 만들어서 print 구문을 통해서 test 함수를 호출한다. test 함수 안에는 아무런 내용도 없다. 그래서 코드를 실행하면 블럭에 코드가 비어 있다고 에러를 뱉는다. 이런 에러를 방지하기 위해서 pass를 사용한다.
def test(a):
    pass
    
print (test("안녕!"))

결과:----------------------
None
함수 블럭은 생성되었지만 할 일이 없는 경우에 pass를 사용하여 indented block 익셉션을 방지하였다.

외부 모듈 불러오기(import)


자바나 타입스크립트와 같이 파이썬도 import라는 구문을 사용할 수 있다. import를 사용하면 외부의 모듈을 가져와서 사용할 수 있다.
import 모듈명
이렇게 사용하면 해당 모듈을 모두 가져온다.
from 모듈명 import 기능명
이렇게 사용하면 모듈안에 있는 특정한 기능만 꺼내서 가져온다. 모듈은 파이썬이 제공하는 기본 모듈들이 있고, 세계의 여러 개발자들이 만들어 둔 오픈소스 모듈들도 있을거고 또 우리가 만드는 확장자 .py 파일도 외부 모듈로써 필요할 때는 언제든 외부의 .py 파일을 import 해서 사용할 수 있다.

기본모듈


파이썬에는 수 많은 기본 모듈이 제공된다. 파이썬에 내장된 기본모듈이므로 별도로 설치를 할 필요가 없다. 파이썬에서 제공하는 기본 모듈을 잘 활용하면 프로그램을 만들 때 매우 유용하게 사용할 수 있다. 그 중에서 몇 가지 표준 모듈만 살펴보자.

우선 math 모듈을 사용한 예제다. math 모듈은 복잡한 수학 계산을 편리하게 처리할 수 있도록 도와주는 함수들을 제공한다. 복소수는 cmath 모듈에서 지원한다.
import math

print(math.fabs(-99))    # 절대값 반환
print(math.factorial(4)) # 팩토리얼값 반환
print(math.isnan(10))    # 숫자이면 False 반환
print(math.isqrt(16))    # 제곱근 반환
print(math.log(24))      # 자연로그 반환(밑 e)
print(math.pow(3, 3))    # 거듭제곱 반환

결과:-------------------------
99.0
24
False
4
3.1780538303479458
27.0
math 모듈에서 지원하는 함수 몇가지만 사용해 본 예제다. 위와 같이 사용하면 된다.

json을 인코딩/디코딩 할 때 매우 편리하게 사용할 수 있는 json 모듈 등 유용한 기본 모듈이 상당히 많이 지원되고 있다. 표준 라이브러리 목록과 사용 방법은 내용이 방대하므로 파이썬 공식 홈페이지에서 제공하는 매뉴얼을 참고하는 것을 추천한다. 

표준 라이브러리 매뉴얼 주소 : https://docs.python.org/ko/3/library/index.html

파이썬에는 멋진 외부 모듈도 많다. 대표적으로 선형대수 라이브러리인 넘파이와 같은 외부 모듈도 꼭 활용해보면 좋겠다. 파이썬의 기본 연산 속도가 느리다고 생각되면 이 모듈을 쓰면 대규모 숫자들의 빠른 연산이 가능하다. 그리고 표준편차, 분산, 푸리에 변환 등을 빠르고 편리하게 계산하고 사용할 수 있다.

넘파이에 대한 이야기가 나왔으니 넘파이에 대해서 정리를 잘 해둔 블로그가 있어서 링크를 해두니 참고하자.

f-string 포맷팅


파이썬2까지는 문자열을 다룰 때 C에서 썼던 %-포맷팅 방법을 쓰거나 위의 while문 예제에서 사용했던 {}.format() 포맷팅 방식을 썼다. 그러나 파이썬3에서는 가독성이 떨어지는 이런 방법을 쓰지 않고도 f-string 포맷팅 방법을 사용할 수 있게 되어서 가독성이 좋아졌다.

간단한 사용법은 다음과 같다.
name = "송종식"
age = 38
memo = f"안녕하세요. 제 이름은 {name}입니다. {age}살이에요."
print(memo)

결과:--------------------------
안녕하세요. 제 이름은 송종식입니다. 38살이에요.
리액트, Vue와 같은 프론트엔드 프레임워크에서 사용하는 보간자와 비슷한 방법으로 사용하면 된다.
price = 1000
amount = 5
memo = f"사과{amount}개에 {amount*price}입니다"
print(memo)

결과:--------------------------
사과5개에 5000입니다
이런식으로 f-string을 이용해서 바로 연산을 처리할 수도 있다.
profile = {"name": "Jongsik Song", "age": 38}
data = f'이름은 {profile["name"]}이고 나이는 {profile["age"]}살 입니다'
print(data)

결과:--------------------------
이름은 Jongsik Song이고 나이는 38입니다
리스트와 딕셔너리를 활용할 때는 이와 같이 처리하면 된다. 홑따옴표와 쌍따옴표 사용에 주의하자. f-string은 날짜처리를 비롯해서 더욱 다양한 기능을 지원한다. 잘 활용하면 정말 편리한 기능이니 숙지하자. 

f-string 포맷팅에 대한 더 많은 정보는 다음 링크를 통해서 확인하자.

형변환


파이썬은 형변환이 유연하다.
a = 10
print(type(a))
a = "10"
print(type(a))

결과:-----------------
<class 'int'>
<class 'str'>
변수에 들어가는 값의 자료형이 바뀌면 변수에 자료형 변경을 가하는 작업을 하지 않아도 자동으로 변수형이 변한다. 변수 a가 int형에서 string형으로 자료형이 변한 것을 확인할 수 있다.

이상으로 파이썬을 다루기 위한 가장 기초적인 문법에 대해서 다루어 보았다.


2021년 4월 5일 월요일

오랜만에 코딩 좀 하려고 봤더니, 아이오닉의 변화가 상당하네

방치했던 주식 앱도 손을 좀 보고 싶고, 추가하고 싶은 기능이 생겼다. 그리고 만들고 싶은 앱이 몇개 생겼다. 그래서 오랜만에 취미삼아 개인 프로젝트를 좀 해볼까 싶었다. 

근래 익숙했던 아이오닉을 사용할지 아니면 플러터를 사용할지 아주 잠시 고민에 빠졌다.

플러터와 아이오닉은 모두 원소스 멀티유즈가 가능한 개발 플랫폼이다. 1인 개발자가 사용하기엔 정말 좋은 도구다. 하나의 코드베이스로 안드로이드, iOS, 웹(+pwa) 등 다양한 플랫폼에 대응 가능한 결과물을 빌드할 수 있는 것이 큰 장점이다.

다만 미묘한 차이가 있다. 플러터는 코드를 컴파일 하면 앱이 네이티브 수준에서 작동한다. 반면에 아이오닉은 웹뷰 기반이다. 당연히, 앱의 성능은 물론이고 미묘한 화면 처리는 플러터가 월등히 우월하다. 그렇다고 해서 코르도바를 기반으로 한 아이오닉의 성능이 못 쓸 정도도 아니다.

아이오닉은 기존에 HTML, CSS, JS를 잘 사용했던 사람이라면 비교적 금방 익숙해 질 수 있다. 물론 앵귤러를 써 보지 않은 사람에겐 러닝커브가 없진 않다.

나는 오래전부터 꾸준히 아이오닉을 사용해 왔기 때문에 아이오닉을 사용하는 편이 편하다. 플러터를 쓰려면 Dart라는 언어를 새로 배워야 하고 플러터 프로젝트의 구성에 대해서도 공부를 해야하는 등 비교적 가파른 러닝 커브가 발생하기 때문이었다.

아이오닉은 다 좋은데 Angular 베이스라서 약간 마음에 안 드는 부분이 있었다. 그래서 이참에 플러터를 한번 공부해볼까 싶었다. 플러터와 아이오닉 사이에서 마음의 결정을 못 하고 있다가, 우연히 아이오닉 공식 사이트를 보고 깜짝 놀랐다.

기존에 아이오닉으로 만들어뒀던 아이오닉 기반의 레거시 코드를 업데이트 정도는 해야겠다 싶어서 아이오닉 사이트에 들어간 것이었다. 한동안 못 봤던 사이에 아이오닉은 버전이 많이 업그레이드 되어 있었다. 네이티브 기능들도 과거보다 조금 더 잘 지원하고, UI컴포넌트의 갯수도 훨씬 더 많이 늘어났고, 품질도 높아져 있었다.

무엇보다 놀랐던 것은 아이오닉이 이제 더는 앵귤러 베이스의 도구가 아니라는 점이었다.

이제는 아이오닉 프로젝트를 시작하기 전에 리액트, 앵귤러, 뷰 중에서 원하는 자바스크립트 프레임워크나 라이브러리를 선택할 수 있는 기능이 생겼다. 아이오닉 프레임워크도 전면 재개발 되었다.

아이오닉에서 지원하는 프론트엔드 자바스크립트 프레임워크와 라이브러리들

앞으로 아이오닉은 기존의 앵귤러 + 코르도바 기반이 아니라 앵귤러, 리액트, 뷰 중에서 하나를 고를 수 있고 코르도바와 캐파시터를 이용해서 앱을 빌드할 수 있다.

아이오닉은 훌륭한 도구임에도 불구하고 온리 앵귤러 베이스여서 외면 받고 저평가를 받아 온 측면이 없지 않다. 이제 원하는 프론트엔드 프레임워크를 입맛대로 고를 수 있는데다, 빌드 후 성능도 더욱 네이티브에 근접하게 좋아졌다. 

아이오닉 팀에서 누가 이런 생각을 했는지 몰라도 정말 대단하다. 제갈량급 인재라 할만하다. 프론트엔드 프레임워크를 다 쓸 수 있게 고쳐버릴지는 몰랐다. 어쨌든 개인적으로 즐겨쓰는 도구가 사장될까 걱정하던 이용자 입장에서는 날로 진화하는 프레임워크를 보니 안심도 되고 신나기도 한다.

플러터를 좀 배워볼까 하던 나는 플러터 배우기를 조금 뒤로 미뤄뒀다. 당분간은 아이오닉을 이용해서 앱 개발 작업을 조금 더 진행할 예정이다. 어차피 뒷단은 DB에 값을 넣었다 뺐다 하는 단순 웹서비스 베이스의 작업이니 아이오닉을 써도 성능에 크게 무리가 없을 것이고 러닝커브가 없어서 개인적으로 나에게는 유리할 것이다.

하지만 메타버스 시대를 맞아서 조금 더 기기 친화적인 서비스를 만들려면 플러터 공부도 하루 빨리 시작해야 할 것이다.

플랫폼별로 최적화 된 개발을 하는 게 가장 좋겠지만 그건 훗날 혹시라도 팀을 만들게 되면 고려할 사항이다. 혼자서 자바와 스위프트로 플랫폼별 대응을 해 본적이 있는데 일단 딱 하나의 서비스에 인생을 올인할 게 아니면 1인 개발자에겐 리소스 장벽이 있었다. 물론 혼자서 안드로이드, iOS, 웹 플랫폼에 고퀄을 내며 각기 대응하는 능력자 형님들도 계시긴 하지만.


2021년 2월 26일 금요일

클럽하우스에서 투자 사기가 발생한 것 같습니다

출처 : Unsplash @artcoastdesign

아직 확실히 밝혀진 건이 아닙니다. 그래서 정확하게 필명을 거론할 수는 없습니다. 그런데, 피해자분들이 꽤 생긴 것 같습니다. 주로 젊은 주린이 분들 위주로 피해가 생긴 듯 합니다. 그리고 피해자 분들 이야기를 들어보니 피해 규모가 좀 되는 것 같습니다.

가해자로 지칭되는 남성은 저도 클럽하우스에서 몇번 목격한 적이 있습니다. 나이는 많지 않은 사람으로 추정됩니다. 교포이거나 현재 미국과 같은 영미권 국가에 거주하는 것으로 추정됩니다.

이 사람은 자신감이 상당했습니다. 투자방이라고 하면 가리지 않고 들어와서 손을 들고 발언을 했는데, 방 분위기를 금방 장악했습니다. 들어보면 투자 실력은 형편 없었습니다. 투자 실력이 형편 없는 것은 금방 티가 났지만 워낙에 말을 자신있게 하고 마이크를 잘 안 놓는 편이라서 분위기를 압도하며 방을 장악하는 타입이었습니다. 주린이들을 현혹 시키기엔 충분한 자신감이었습니다.

한번은 이 친구가 가치투자자들이 모여있는 방에 평소와 같이 난입을 했습니다. 아무도 안 물어봤는데 갑자기 막 자랑을 해댔습니다.

"여자 친구가 갖고 있던 5만불짜리 계좌를 오전 3시간 만에 600% 수익을 냈습니다." 

그 소리를 듣는 순간 저는 사기꾼이라고 직감했습니다. 일단 몇번 그 친구의 이야기를 들으면서 투자관이 주린이보다 더 형편없다는 것을 이미 알고 있었습니다. 그리고 이 친구는 입만 열면 몇 시간의 트레이딩으로 600% 수익을 냈다는 둥, 1000% 수익을 냈다는 둥 되도 안한 거짓말과 자랑을 일삼았습니다.

또 하루는 이런일도 있었습니다. IT업계에서 유명한 골빈해커라는 개발자가 있습니다. 그 사람이 만든 방에 들어가서 오가는 이야기를 듣고 있었습니다. 새벽 시간인데도 방에는 많은 사람들이 있었습니다. 그런데, 그 방에도 문제의 이 친구가 들어와서 방을 뒤흔들기 시작했습니다.

골빈해커님이 고민하던 기술에 대한 것을 자기는 이미 해결했다는 식으로 자랑을 늘어놓고는 나갔습니다.

어마어마한 자신감이 넘치는 친구였지만 전형적으로 꾼들이 보이는 패턴의 화술을 구사하고 있었습니다. 물론 그 사람의 펀더멘털은 검증된 것도 없지만 이야기 몇마디만 들어봐도 수준이 어느 정도인지는 파악이 되는 것이었고요.

자기 부모님이 모 회사 지분 10만주가 있어서 변호사를 통해서 매각을 한다는 둥 뜬금없는 소리를 남발하면서 남들과 소통은 잘 안되고 자기 자랑만 일삼는 친구였습니다. 하여튼 그런 친구였는데 결국은 그 친구가 사고를 친 것 같습니다.

지금 클럽하우스에 피해자 모임방이 열렸는데, 정확한 내막과 골자는 모르겠지만 주린이분들 몇몇 분이 그 사람에게 피해를 입은 듯 합니다. 투자금 조로 돈을 부쳤는데 3일째 연락이 두절된 상태라고 하는 것 같습니다.

게다가 B2B 거래 명목으로 테슬라 주식과 비트코인을 보내줬는데 받지 못하는 분들도 상당 수 계신 상태이며 모 대기업 임원과 친분을 과시하며 스마트폰 사기도 쳤다고 합니다.

그리고 과거 국내 공유 오피스를 돌면서 스타트업들을 상대로 사기를 친 전력도 있다고 합니다.

일단 피해자분들도 정신을 좀 차려야 합니다. 일면식도 없는 사람한테 돈은 왜 부칩니까. 게다가 상대의 얼굴도 안 보이고 실체도 모르는 클럽하우스에서 말입니다. 사기꾼들은 자신감이 넘칩니다. 그 자신감에 현혹되면 안됩니다. 펀더멘털을 간파하는 눈을 기르시길 바랍니다.

클럽하우스를 이용하는 사람들의 프로필 사진과 Bio를 보면 알겠지만 죄송하게도 거기 계신분들의 프로필 중 80% 이상은 부풀려졌거나 허세라고 봅니다. 뭐 전부다 미남미녀에 전부다 CEO고 부자고 고학력자고.. 에라이. 현실은 반지하 원룸에 사는 사람조차도 클럽하우스에서는 무슨 오피니언 리더 행세에 인싸 행세에, 펜트하우스 사는 행세라니.. 아무리 오디오 기반이라지만 금방 다 들통이 납니다.

이런저런 것들이 눈에 거슬리기 시작하니 저도 최근에는 클럽하우스에 대한 피로도가 높아져서 잘 들어가지 않고 있습니다. 점점 쓸데없는 노가리방만 늘어나고..

펀더멘털이 탄탄하고 진짜로 실력있는 사람이 하루종일 거기에 죽치고 살지는 않습니다. 일말의 도움도 안되는 억지 네트워크를 만들려고 발버둥치지도 않을테구요. 자기를 꾸미지도 않겠죠. 현명한 사람이라면 그 시간에 실력을 키우겠죠.

하여튼 이 사건이 진짜로 사기 사건인지, 아니면 다른 오해가 있었던 건지 속 시원히 밝혀지고 문제가 있다면 잘 해결되기를 바랍니다. 피해 내용과 규모가 아직 정확히 밝혀진 건 아닙니다. 사실 확인이 필요한 부분들이 있으나 몇몇 피해자들이 돈을 송금한 건 증거들이 있는 상황이구요.

더는 추가적인 피해자가 나오지 않기를 바랍니다. 그래서 급한 마음에 포스팅을 남깁니다.


2017년 12월 11일 월요일

Visual Studio Code로 AWS EC2 붙어서 작업하기

가급적 git이나 svn같은 형상관리 도구를 쓰는게 좋습니다. 다만, 소규모 프로젝트거나 개인 프로젝트의 경우, 또는 긴급을 요하는 작업을 할 경우에는 아래처럼 작업해도 무방합니다.

요즘 저는 비주얼 스튜디오 코드를 주력 IDE로 사용하고 있습니다. 가볍고, 빠르고, 강력합니다. 무료이고요. VSC로 EC2에 붙어서 작업할 수 있는 환경설정 방법을 간단하게 기록으로 남겨두겠습니다. 개발자라면 별거 아닌 것이지만, 이제 막 코딩을 배우는 주변분들이 힘들어 하시는 것 같아서 아예 글로 남겨두겠습니다. 참고하시면 좋을 것 같습니다.

1. 마켓플레이스에서 ftp-simple 설치


마켓플레이스 메뉴를 선택합니다. 'ftp-simple'을 검색해서 설치합니다. 설치가 완료되면 화면 가운데에 뜨는 '새로고침' 버튼을 눌러서 에디터를 새로고침 해줍니다.

2. ftp-simple 설정


F1키를 누르고 'ftp'라고 검색합니다. 아래에 'ftp-simple : CONFIG ..' 메뉴를 선택합니다. 그러면 아래 화면과 같은 JSON파일이 나옵니다.


서버당 제이슨 객체 한덩어리입니다. 위의 그림대로 FTP서버 정보를 입력하시면 됩니다. FTP의 포트번호는 통상 21번입니다.


이런식으로 개발을 진행할 서비스 별로 여러대의 서버를 추가할 수 있습니다.

3. AWS EC2 접속 설정


SSH기반이므로 접속 타입을 sftp로 설정해줍니다. 그리고 AWS콘솔에서 내려받아서 내 컴퓨터 어딘가에 놔둔 privateKey 파일의 경로를 privateKeyPath에 써줍니다. 위의 설정은 Ubuntu 기준이고, 별다른 손을 대지 않은 케이스입니다. 접속 후 기본 경로는 /var/www이고 sftp이므로 기본 포트는 22번입니다.


4. EC2 접속 확인


F1키를 눌러서 검색창이 뜨면 'ftp'를 입력합니다. 하단에 'ftp-simple : Remote directory open to workspace'를 선택합니다.


설정해 둔 EC2 인스턴스에 원격 접속합니다. 아까 저는 이름을 'AWS for my apps'라고 지어뒀습니다.


잠깐 기다리면 저의 비주얼 스튜디오 코드가 EC2 인스턴스에 접속이 완료됩니다. 지정해 둔 루트 경로의 디렉토리명이 뜹니다. 그걸 선택해줍니다.


서버에 있는 파일들을 전부 다운로드 받을때까지 기다려주세요. 시간이 좀 걸릴수도 있습니다. 서버측 파일을 다 내려받아 동기화가 완료될때까지 기다려주세요.


서버에 있는 파일들이 동기화가 완료되었습니다. 파일과 디렉토리 구조들을 볼 수 있습니다. 루트 디렉토리에 있는 index.html파일을 수정하고 파일을 저장해보겠습니다.


서버상에서 수정한 index.html 파일이 제대로 반영된 것을 확인할 수 있습니다.


네트워크 환경에 따라 파일 업/다운로드 속도가 매우 느릴 수 있습니다. 비주얼 스튜디오 코드는 별로 친절한 도구가 아닙니다. 상황이 어떻게 진행되는건지 멈춘건지 알 수 없기 때문에, 콘솔을 띄워서 상황을 확인해야 합니다. '보기' - '디버그 콘솔' 메뉴를 선택해서 콘솔을 띄우시고 콘솔 메뉴에 '출력' - 'ftp-simple'을 선택해서 ftp 통신 상황을 체크하시면 됩니다.

ATOM이나 다른 IDE들도 설정 방법은 다 비슷합니다. 다음에는 생산성을 극적으로 향상 시켜주는 라이브리로드 환경 세팅에 대해서 한번 써 보겠습니다.

즐프하세요!

2017년 12월 11일
송종식 드림