Most viewed articles
Recent articles
- [파이썬] 파이썬의 타입 힌트 PEP 484에 대한 소개Python 3.5 버전에는 다음과 같은 형식으로 IDE와 코드 가독성에 도움을 줄 수 있도록 함수의 인자와 반환값에 대한 타입 힌트가 처음으로 도입 되었다.def greeting(name: str) -> str: return 'Hello ' + name그리고 후에 나온 3.6 버전에서는 인자와 반환값 만이 아니라 변수에도 타입 힌트 표기가 가능해졌다.def greeting(name: str) -> str: s: str = 'Hello ' + name return s타입 힌트의 의의와 목표타입 힌트 기능은 타입 표시에 관한 표준 구문을 제공하고, 더 쉬운 정적 분석과 리팩토링 및 타입 정보를 추론하는 것에 대한 도움을 주기 위해 만들어졌다.예를 들어 예상하지 못한 타입이 변수에 .. 더보기
- [GraphQL] 3. GraphQL에서의 인증 // Authentication in GraphQL 1. GraphQL에서의 인증 방식GraphQL은 플랫폼 독립적이고 기존의 REST API와는 완전히 다르기 때문에 GraphQL에서의 인증은 큰 문제라고 생각할수도 있지만 인증은 그렇게 어렵지 않다. 기존의 JWT(Json Web Token)을 충분히 이용 가능하다JWT 토큰을 전달하는 위치가 헤더에서 쿼리나 뮤테이션의 인자로 바뀌었을 뿐이다. 우리가 GraphQL 서버를 만들떄 사용하는 Flask와 Graphene에서 인증을 처리하는 것도 기존 Flask에서 Flask-JWT-Extended나 Flask-JWT-Simple을 사용했던 것처럼 Flask-GraphQL-Auth를 사용하면 그저 쿼리 리솔버나 뮤테이션에 인증 데코레이터를 적용해 우리가 익숙하게 사용하던 JWT(Json Web Token)를.. 더보기
- [GraphQL] 2. Graphene에 MongoDB(MongoEngine) 연동하기 // MongoDB and Graphene MongoEngine과 Graphene 우리가 만든 GraphQL 서버에 DB를 연결해 보자. 기본적으로 웹 서버는 클라이언트의 요청을 따라 DB를 조회하거나 삭제, 수정, 추가를 한다. 우리의 GraphQL 서버도 쿼리가 들어오면 쿼리에 맞추어 DB를 조회하고, 뮤테이션 요청이 들어오면 DB에 항목을 추가, 수정하거나 삭제한다.graphene에 쿼리 요청이 들어온다면 graphene은 그 요청을 받아서 resolver에서 요청된 조건대로 DB에 조회를 하고 그 결과물을 스키마에서 반횐하기로 정의된 필드에 바인딩해 클라이언트가 요청한 방식대로 전달한다.따라서 우리가 resolver를 작성하기 위해서는 MongoDB ORM인 Mongoengine의 도큐멘트를 GraphQL 필드에 바인딩하는 유틸리티 함수인.. 더보기
- [GraphQL] 1. 파이썬과 플라스크로 기본적인 GraphQL 서버 만들어보기 // GraphQL with Flask(Python) GraphQL 시스템 알아보기 GraphQL 서버를 만들려면 GraphQL API를 구성하는 요소들에 대해 알아볼 필요가 있다. GraphQL API는 다음의 요소로 이루어진다. 스키마: DB 스키마가 테이블과 릴레이션을 정의하는 것처럼 GraphQL 스키마는 뮤테이션, 쿼리, 타입과 Enum 등 GraphQL 시스템을 정의한다. 쿼리: CRUD의 Read를 담당하는 부분이다 필드: 쿼리의 속성, DB의 테이블 역할을 수행하고 반환값을 결정한다. 뮤테이션: CRUD의 Create, Update, Delete를 담당한다 리솔버: 쿼리나 뮤테이션 요청이 들어올 때마다 요청에 맞게 리턴값을 만들어 내는 로직 부분이다. 즉, GraphQL 시스템은 스키마로 시스템의 구조를 정의하고, 리솔버에서 행동을 정의한다... 더보기
- [GraphQL] 0. 왜 GraphQL을 쓸까? // Why GraphQL? 현재 수많은 웹 서비스와 API들은 REST API를 사용하여 클라이언트-서버 간 통신을 수행한다. 물론 REST API는 좋은 방식이지만 다음과 같은 문제점이 생긴다. 첫번째, 수많은 양의 엔드포인트들 두번째, 데이터가 원한것보다 너무 많음 세번째, 여러가지 데이터를 사용하기 위해 요청을 여러번 해서 데이터를 받아와야 함 (N+1 문제) 네번쨰, 응답 데이터의 구조를 API 도큐멘트 없이 알 수 없다. 그러나 ✨GraphQL✨이란게 있다! GraphQL을 간단히 설명해 보자면 클라이언트-서버 간 통신을 위해 기존 REST에서 사용하는 엔드포인트 방식 대신 DB에 날리는 SQL 쿼리처럼 API 서버를 대상으로 하는 쿼리 언어(Application Query Language)를 사용하는 방식이다. Grap.. 더보기
- [컴파일러] 컴파일러: 원리, 기법, 도구 - 구문 정의와 파스 트리 구문 정의 (syntax definition) 문맥 자유 문법은 언어의 구문을 기술하기 위해 사용되며 컴파일러의 전반부를 표현하는 방법이다. 그렇다면 문맥 자유 문법(줄여서 자유 문법)은 어떻게 표현될까? 익숙한 if-else 문을 통해 자유 문법을 알아보자. if (expression) { statement } else { statement } 이 C 코드를 자유 문법으로 나타내면 다음과 같이 표현된다. - statement -> if (expression) {statement} else {statement} 화살표의 뜻은 왼쪽 문법 기호가 오른쪽 문자열을 생성한다는 뜻이다. (오른쪽 문자열로 왼쪽 문자열로) 이러한 형식을 생성 규칙(production) 이라고 한다. 문맥 자유 문법을 통해서는 의미 .. 더보기
- [컴파일러] 컴파일러: 원리, 기법, 도구 - 컴파일러의 개요 컴파일러는 front end, middle end, back end의 세가지 단계로 구성되어 있다. front end: 토큰화를 위한 어휘 분석(Lexing), 파스 트리 구성을 위한 구문 분석(Parsing), 중간 코드를 위한 의미 분석 등을 처리한다. middle end: 중간 코드에 대해 프로그램의 분석과 최적화를 처리한다. back end: 각각의 CPU 아키텍처에 대해 코드 최적화를 수행하며 최종 코드를 생성한다. 먼저 우리는 front end에서 다루는 어휘 분석과 구문 분석, 그리고 의미 분석에 대해 알아볼 것이다. 컴퓨터 언어는 다음의 두가지 요소로 구성된다. - 언어의 구문(syntax of language): 프로그램의 모양 -> 코드의 모양 - 언어의 의미(semantics of l.. 더보기
- [컴파일러] 백패칭 백패칭 GOTO문의 전방 점프나 if 분기 구문 같은 경우에는 내부적으로 점프를 사용하는데 점프할 부분의 소스 코드가 읽히지 않아 점프의 번지를 지정할수 없는 상태이므로 중간 코드에 빠진 부분을 만들어 놓고 해당 점프의 목표 부분을 찾으면 점프의 번지를 결정한다. 이것을 백패칭이라고 하는데 이렇게만 써놓아서는 이해가 잘 안되므로 간단한 C언어와 어셈블리 코드를 예시로 들어 설명하겠다. if (x==y) { x=-1; } else { x=1; }위의 C언어는 어셈블리로 다음과 같이 표현된다. MOV _x, R1 CMP _y, R1 JE EQUAL MOV 1, _x EQUAL: MOV -1, _x 위의 어셈블리 코드에서 중요한 부분은 JE EQUAL이다. 이 코드의 뜻은 한단계 전의 CMP가 참이면 (여기서.. 더보기