프로그래밍 29

SQL이란 무엇인가

SQL이란 무엇인가? - 아래 글은 2019년 11월부터 2개월간 칸아카데미 서포터즈로 활동하면서 작성한 글입니다. SQL은 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 언어이다. 질의어 중 가장 인기있는 것이기도 하며, 많은 DBMS들이 SQL을 지원한다. 세 문장을 찬찬히 뜯어보자. 일단, 데이터베이스는 데이터베이스 관리 시스템이 아니다. DB != DBMS 데이터베이스는 말 그대로 데이터베이스 자체이다. 여러 사람/프로그램이 쓸 것을 염두에 두고 만들어진 정보의 집합이다. 일상 생활에서 우리는 정보를 저장해두고 쓸 일이 아주 많다. 페이스북, 은행, 쇼핑몰 등 다양한 서비스에서 유저들의 정보를 데이터베이스에 저장한다다. 그렇게 저장해둔 정보는 필요할 때 조회하거나, ..

프로그래밍 2020.03.18

[AWS] ec2로 띄운 서버에 DNS 설정하기

목표는 아주 간단했다. ec2에서 띄운 서버를 이용해 https://app.example.com 같은 주소로 get 요청을 보내면 200 OK가 뜨게 하는 것이었다. 구글에 한글로 "ec2 dns 연결" 따위로 검색해보면 route 53에 도메인을 연결해서 사용하는 방법에 대한 글이 많이 나오는데, 결과적으로 나는 route 53을 사용하지 않고 elb(elastic loadbalancer)를 사용했다. 먼저 https는 고려하지 않고 http만 생각하고 설정을 했다. 유저가 http://app.example.com에 접속하면 http 요청은 웹서버로 바로 가는 것이 아니라 elb로 가게 된다. 정확히는, elb의 80번 포트로 요청이 가게 되고 elb는 이 요청을 ec2의 특정 포트(웹서버가 돌아가고 ..

프로그래밍 2020.03.16

type conversion과 type assertion의 차이

v1 := int(n) // type conversion v2, ok := n.(int) // type assertion v1도 정수이고 v2도 정수일 것이다(에러가 나지 않는다면). 위 두 줄의 코드는 어떻게 다른가? 1. type conversion type casting이다. Golang에서는 명시적으로 형변환을 해줘야 한다. 자동으로 형변환을 해주는 일 따위는 없다. 예를 들어, int형을 int64형으로 바꾸고 싶다면 아래와 같이 명시적으로 코드를 작성해야 한다. var n int = 15 var v1 int64 = int64(n) 데이터 타입이 A인 것을 A가 아닌 다른 타입으로 바꾸는 것이다. 2. type assertion 네이버 영영사전에서 assert의 뜻을 찾아보면, 첫 번째 의미가 ..

프로그래밍 2020.02.24

ORM vs ODBC

기존에 토이프로젝트를 node.js 기반으로 작업했었는데, sequelize를 사용했다. 이번에 golang으로 간단한 서버를 짜면서 sqlx를 사용했는데, sequelize가 보유했던 기능들이 있을 거라 생각했지만 그건 착각이었다. 애초에 sqlx는 orm이 아니다. 각 프로젝트의 깃헙 메인 README에 친절하게 적혀있다. 아래는 sqlx 저장소 README의 첫 문장이다. sqlx is a library which provides a set of extensions on go's standard database/sql library. sqlx는 ORM이 아니다. sqlx는 go에 기본 라이브러리인 database/sql을 기반으로 확장된 기능을 제공한다고 적혀있다. 아래는 sequelize 저장소 ..

프로그래밍 2020.02.24

golang module을 사용해보자.

golang으로 작업을 하면서 팀원분이 go module를 사용해보라고 하셨다. 분명 수많은 사람들이 쉽게 go module를 사용하는데, 뭔가 잘 되지 않아서 앓고 있었는데 알고보니 내가 2018년도 글을 보고 있었다. 미래의 나 & 다른 사람들이 삽질하지 않기를 바라며, 몹시 간단한 일이지만 그래도 적어둔다. 일단 프로젝트 폴더가 $GOPATH/src 밖에 있는지 확인하자. 밖에 있다면, 프로젝트 최상위 디렉토리에서 대략 아래와 같은 형태로 명령어를 실행한다. go mod init example.com/m golang 블로그에도 go module 사용방법에 대한 글이 있고, 저런 식으로 예시를 드는데 example.com이 무엇을 의미하는지 알 수가 없어서 혼란스러웠다. JAVA 같은 언어를 사용해 ..

프로그래밍 2020.02.21

Mysql에 스트링으로 저장할까? 숫자형으로 저장할까?

Q. 앞으로 계산할 일도 없고, 수정할 일도 없는, 무조건 참조만 할, 적당히 작은 숫자가 있다. 이걸 숫자형으로 저장하는 게 좋을까, 아니면 스트링으로 저장하는 게 좋을까? 혹은 어느 쪽을 선택해도 상관없을까? A. 어지간해서는 숫자형으로 저장하는 게 좋다! 해당 수가 -32768 ~ 32767 범위일 경우 (Unsigned의 경우에는 0 ~ 65535), 이를 숫자형으로 저장하기 위해서는 2바이트가 필요하다. 반대로 문자열은 몇 바이트가 필요할까? utf8mb4 언어셋으로 5개 길이의 문자열로 저장한다고 가정하자. (5 * (문자열의 길이) * 4바이트) + 크기값 저장용 1바이트 = 21바이트 즉 하나의 데이터마다 19바이트씩 더 필요하다. 1000개를 저장한다고 가정하면, 단순히 계산해도 1900..

프로그래밍 2020.02.14

pub/sub 구조란 무엇인가

발행-구독 모델, pub/sub system 등 다양한 이름으로 불리고 있지만 이 블로그 글에서는 pub/sub 구조라고 부르려고 한다. 우리의 친구 위키피디아를 보면, 정의가 간결하게 잘 적혀있다. 발행-구독 모델은 비동기 메시징 패러다임이다. 발행-구독 모델에서 발신자의 메시지는 특별한 수신자가 정해져 있지 않다. 대신 발행된 메시지는 정해진 범주에 따라, 각 범주에 대한 구독을 신청한 수신자에게 전달된다. 수신자는 발행자에 대한 지식이 없어도 원하는 메시지만을 수신할 수 있다. 이러한 발행자와 구독자의 디커플링은 더 다이나믹한 네트워크 토폴로지와 높은 확장성을 허용한다. 사실 무슨 말인지 잘 모르겠으니까 보기 힘드니까 포인트별로 짚어보려고 한다. 1) pub/sub 구조에서 수신자는 발행자에 대한 ..

프로그래밍 2020.02.12

A Tour of Go Exercise - Web Crawler 풀이

튜토리얼 자체에서는 WaitGroup에 대한 설명은 없는데, WaitGroup을 써서 풀었다. 출제자는 아마 채널을 이용해서 풀기를 의도했던 게 아닐까 싶다. 코드는 여기서 실행해볼 수 있다. https://play.golang.org/p/Rm6J-yLHR5j The Go Playground package main import ( "fmt" "sync" ) type Fetcher interface { // Fetch returns the body of URL and // a slice of URLs found on that page. Fetch(url string) (body string, urls []string, err error) } // Crawl uses fetcher to recursively..

프로그래밍 2020.02.11

golang 에서 nil 이란 무엇인가

결론 - zero value는 명시적인 초기값을 할당하지 않고 변수를 만들었을 때 해당 변수가 갖게 되는 값이다. - nil은 포인터, 인터페이스, 맵, 슬라이스, 채널, 함수의 zero value이다. 그저 어떤 값이 빈 값인지(파이썬으로 치자면 None인지)확인하고 싶은데, 뜬금없이 컴파일 에러가 날 때가 있다. 왜 이런 일이 발생하는지 알기 위해서는 golang에서 nil이 무엇인지 알아야 한다. 우리의 친구 스택오버플로에는 이미 누군가 동일한 질문을 올려놨고, 누군가 고마운 분이 답변을 달아놓았다. https://stackoverflow.com/questions/35983118/what-does-nil-mean-in-golang What does nil mean in golang? There ar..

프로그래밍 2020.02.11
반응형