Loading...
2021. 1. 23. 11:13

[RxJava] 2. Reactive 기본 연산자(Operator) - map, filter, reduce

Reactive Programming에서 꽃이라고 할 수 있는 Reactive Operator에 대해 알아보도록 하겠습니다. 만약 여러분들이 Java 8을 사용하고 있다면, 이러한 Reactive 연산자가 매우 익숙하실 수도 있습니다. RxJava에서는 Reactive Programming에 맞춰, 이러한 Reactive Operator를 제공합니다. 그러나 여러분들이 아셔야할 것은 이런 Reactive 연산자가 단연 RxJava, Java 8에서와 같이 "Java"에서만 볼 수 있는 것은 아닙니다. Python에서도 Javascript에서도 Reactive Programming만 지원한다면 이러한 연산자는 어디서든 볼 수 있습니다. 이번 글에서는 RxJava에서 Reative Operator가 어떤식으..

2021. 1. 16. 13:55

[FastAPI] 4. SQLAlchemy + Alembic 조합을 이용한 Database Migration 가이드

웹 서비스를 개발하고 배포한 뒤에 반드시 한 번 쯤 따르는 업데이트 사항이 바로 데이터베이스 마이그레이션입니다. 데이터베이스를 마이그레이션하는 경우는 보통 아래의 3가지가 대표적입니다. 인스턴스의 이전 클라우드를 사용한다면 다른 인스턴스, 혹은 다른 리전으로의 이전 특정 Entity에 대한 변경 요청 우리 부서 혹은 우리 서비스에는 이 기능을 넣기 위해 이 칼럼이 더 추가로 필요할 것 같아요. 일부 영속된 데이터를 특정 데이터로 변경 이제는 이 명칭을 이 명칭으로 바꿀거에요. 모든 사항에 적용되었으면 좋겠어요. 간단하게 생각한다면 이러한 작업을 수동으로 처리할 수도 있습니다. 다른 데이터베이스 인스턴스를 하나 테스트용으로 만들고, SQL 쿼리를 짜본 다음 쿼리 테스트하고, 확실한 쿼리가 작성되었다면 이를..

2021. 1. 10. 17:13

[RxJava] 1. RxJava의 기본 - Observable

지난 포스트에서 Observable에 대해 간단히 다뤄봤고, 이에 따른 리액트 함수에 대해 알아보며 각 차이를 알아봤습니다. 이번 포스트에서는 Observable을 좀 더 심오하게 다뤄보고, 이에 응하는 Single, Maybe 등 다양한 클래스 등을 공부하면서 RxJava와 좀 더 친숙해지는 시간을 가져보도록 하겠습니다. Observer Design Pattern RxJava의 근간이 되는 Observable 클래스는 소프트웨어 디자인 패턴인 Observer Pattern을 근간으로 되어 있습니다. 옵서버 패턴 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. 옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 ..

2021. 1. 9. 16:38

[RxJava] RxJava로 시작하는 Java Reactive 프로그래밍

Java에서 여러 가지의 일을 동시에 수행하기 위한 방법에는 스레드를 사용하는 방법과 비동기 처리를 이용하는 방법이 있습니다. Java에서도 C++와 마찬가지로 select 함수를 제공하고, Thread 객체를 제공하기 때문에 이를 이용해서 동시 처리를 하는 것은 그리 큰 고민이 될 문제는 아닙니다. 그러나 Java로 스레드를 사용한 프로그래밍은 Python이나 Go와 같은 다른 프로그래밍 언어에 비해 사용하기가 무척 어렵습니다. 그냥 단순하게 Thread 객체를 생성하고 사용하는 것만 고려한다면 그리 큰 문제가 되는 것은 아니지만 메모리에 저장된 자원을 동시에 사용하는 이슈 등 처리해줘야 할 일들이 굉장히 많을 뿐더러 코드를 간략하게 짠다하더라도 내가 만든 메소드나 함수가 스레드 위에서 동작하는지 그렇..

2020. 12. 31. 15:41

[FastAPI] 3. SQLAlchemy + Graphene 조합으로 GraphQL 서버 만들기

이번 포스트에서는 GraphQL에 대한 이야기를 해보도록 하겠습니다. What is GraphQL ? GraphQL에 대한 이야기는 그리 길지 않기 때문에 여기서 간단하게 다뤄보도록 하겠습니다. GraphQL은 Facebook에서 개발한 데이터 표현 언어로 여기서 QL이 Query Language에 해당합니다. 우리는 서버에서 데이터를 가져오기 위해 REST API를 사용하였고, REST API는 메소드와 요청 데이터 혹은 응답 데이터로 구분하여 원하는 데이터를 가져오거나 데이터를 적재하는 등을 수행하였습니다. 그러나 GraphQL은 메소드 없이 오직 Query Language만을 이용하여 원하는 모델을 적재하고, 가져올 수 있습니다. 또한 원하는 항목을 클라이언트가 직접 명시함으로써 서버에서 제공해주는..

2020. 12. 27. 12:14

[FastAPI] 2. SQLAlchemy를 이용한 간단한 CRUD API 만들기

이번 글에서는 ORM에 대한 사용 방법에 대해 알아보도록 하겠습니다. ORM은 Object Relation Mapping의 약자로 객체를 이용해서 데이터베이스 Entity에 접근하는 방법입니다. 보통 애플리케이션 레벨에서 DB에 접근할 때는 데이터베이스 드라이버를 이용하여 SQL Query를 던져 실행하는 방법을 사용하지만 SQL Query는 소프트웨어 엔지니어에게 있어 러닝 커브를 증가 시키고, 소프트웨어 코드 가독성을 저하시키는 원인이 되었습니다. 하지만 ORM을 이용하면 기본적인 CRUD를 포함한 간단한 쿼리에 대해 SQL Query를 프로그래밍 코드에 질의하지 않아도 프로그래밍 코드 안에서 처리할 수 있는 이점을 얻을 수 있습니다. Python 언어에서의 대표적인 ORM 라이브러리로 SQLAlch..

2020. 12. 25. 16:42

[FastAPI] 1. GET, POST, PUT, DELETE 등 기본 API 만들고 문서 자동화 해보기

지난 글에 이어서 FastAPI를 이용해서 기본적인 REST API 개발 이야기 두 번째를 이어가보도록 하겠습니다. 우리가 REST API를 개발하면 주요 메소드 종류 5가지가 있는데요. 바로 GET, POST, PUT, DELETE, PATCH 이렇게 5가지 입니다. 물론 이 외에도 OPTIONS가 있지만 이 글에서는 다루지 않겠습니다. 기본 API 만들기 (GET) REST API의 기본 API는 먼저 GET 메소드부터 시작됩니다. GET 메소드는 서버로부터 리소스를 가져올 때 쓰는 READ API 입니다. FastAPI에서는 아래의 두 가지 방법으로 작성할 수 있습니다. from fastapi import FastAPI app = FastAPI() @app.route('/health') async ..

2020. 12. 25. 15:16

[Python] FastAPI 프레임워크를 이용한 비동기 REST API 개발

Python 언어를 이용하여 REST API 서버를 만들 수 있는 방법은 여러 방법이 있습니다. 국내 혹은 많은 개발자들의 사랑을 받고 있는 Django, 그리고 가벼운 프레임워크로써 많이 사용하고 있는 Flask 등 여러가지가 있는데요. 이번 글에서는 Jetbrains의 IDE 도구인 PyCharm과 FastAPI 프레임워크를 이용해서 REST API 서버를 개발하는 시간을 가져보도록 하겠습니다. What is FastAPI? Python에서는 웹 서버와 연동하기 위해 WSGI라는 인터페이스를 사용합니다. 그러나 WSGI는 동기 방식으로 프로그램을 처리하기 때문에 미리 들어온 요청을 처리할 때까지 다음 사람이 계속 기다려야 하는 단점을 감수해야 합니다. FastAPI는 Starlette이라는 비동기 프..

2020. 12. 20. 11:14

[Python] PyCharm에서 Poetry를 이용한 디펜던시 관리

소프트웨어 개발시 디펜던시의 관리는 이제 선택이 아닌 필수가 되었습니다. 여태까지 Python 언어를 이용해 소프트웨어 개발을 하였을 때는 requirement를 이용하여 환경별로 디펜던시 관리를 했었습니다. 그러나 requirements는 하나의 디펜던시를 설치할 때 하위 요소까지 설치해주지 않아 종속되는 디펜던시를 수동으로 설치해야 하는 불편함이 있습니다. Poetry Poetry - Python dependency management and packaging made easy. Intuitive CLI Poetry's commands are intuitive and easy to use, with sensible defaults while still being configurable. Soon ex..

2020. 12. 6. 18:42

[Python] REST API 개발로 알아보는 WSGI, ASGI

REST API 서버를 개발하기 위해서는 이제 특정 언어를 배워야 할 필요 없이 원하는 언어로 자유롭게 개발할 수 있는 세상이 오게 되었습니다. Python 언어 또한 다양한 프레임워크를 제공함으로써 REST API 서버를 쉽게 개발할 수 있는데요. 이를 제공하는 다양한 프레임워크가 많이 존재하지만 그 중 가장 보편화 되어 알려진 프레임워크는 아래의 두 가지 일 것입니다. Django Flask Django는 MTV 패턴을 제공하여 API 뿐만 아니라 템플릿을 이용하여 정적 HTML 파일을 생성해 뷰를 만들 수 있도록 제공하여 빠른 개발을 통해 높은 생산성을 자랑하는 프레임워크입니다. 반면 Flask는 오직 API만을 쉽게 제공하여 빠른 API 서버만을 만들 수 있도록 제공하는 것이 특징이죠. Sprin..

2020. 8. 26. 13:00

[Spring] Jib(지브)를 이용한 Docker 이미지 만들기

https://blog.neonkid.xyz/228 [Spring boot] 애플리케이션을 Docker 이미지로 만들기 Old & New Spring boot로 개발한 서버를 운영하기 위해서는 인스턴스에 서버 애플리케이션을 배포해야 합니다. 애플리케이션을 배포하는 방법에는 WAS로 배포하는 방법도 있지만 Docker 컨테이너 이미지를 만�� blog.neonkid.xyz 위 포스트에서 두 가지 방법을 이용해 Spring boot 애플리케이션을 Docker 이미지로 만들 수 있었습니다. 그러나 Dockerfile을 직접 작성하기에는 스크립트를 작성하기 어려운 분들한테는 러닝 커브가 부담이었다는 것이 다소 아쉬웠던 부분이었는데요. Google Jib 위와 같이 보통 Docker 이미지를 만들고자 한다면, 프..

2020. 8. 25. 21:43

[Spring boot] Spring boot Security를 이용한 OAuth2 인증 구현 3 - 국내 포털 인증

지난 포스트에서 기존의 User Entity 혹은 애플리케이션의 User Entity와 연동하여 OAuth2 인증을 사용하는 방법에 대해 다뤄봤습니다. Spring boot Security에서는 기본적으로 Google, Facebook 등의 해외 소셜 로그인 API를 지원하며 우리는 지원해주는 메소드를 잘 이용하여 Key와 Client ID만 넣어주면 쉽게 OAuth2 인증을 구현할 수 있었습니다. 그런데, NAVER, Kakao 등 국내 포털 사이트의 OAuth2 인증을 구현하려면 어떻게 해야 할까요? NAVER, Kakao API를 이용한 OAuth2 인증 Spring boot Security에서는 공교롭게도 국내 포털 OAuth2 인증에 대한 구현체를 제공해주지 않습니다. 따라서 이들 OAuth2 ..

2020. 8. 16. 20:10

[Spring boot] Spring boot Security를 이용한 OAuth2 인증 구현 2 - User Entity 연동

웹 서비스를 개발하게 된다면, 기본적으로 갖춰져야 할 것은 바로 사용자 인증일 것입니다. 우리 서비스에 가입한 사용자인지를 구분해야 한다는 점과 더불어, 단골인지, 아닌지 등이나 사이트를 관리하는 관리자 등을 구분하는 데 있어, 사용자 인증은 필수적인 요소라고 할 수 있습니다. 그러나 서비스에 있어 가장 번거로운 것은 사용자 등록을 위한 회원 가입일 것입니다. 왜냐하면 사용자가 서비스를 이용하기 위해 자신의 개인 정보를 입력해야 하고, 본인 인증 절차를 거쳐야 하며, 주소와 전화번호 등을 입력함과 더불어, 또 다른 서비스를 이용할 때마다 ID와 비밀번호를 개별적으로 생성하고 관리해야 하기 때문입니다. 이번 포스트에서는 OAuth2 인증을 통해 접속한 사용자들을 저장하는 User Entity를 생성하고, ..

2020. 8. 12. 14:47

[Spring] Argument Resolver를 이용한 유연성 있는 파라미터 처리

서비스를 운영하다보면 다양한 종류의 데이터를 받게 됩니다. 그럴 때마다 Controller 부분에서 이를 전처리하게 되는데, 이렇게 되면 각 Controller에 전처리 해야 하는 코드를 함수화 하거나 Utils 클래스를 만들고, 이를 의존성 주입해서 사용하는 방법이 그나마 코드를 줄일 수 있는 방법입니다. 그러나 Utils를 사용해도 매번 함수를 호출해야 하는 불편함이 있습니다. 그렇게 되면 코드가 중복되고, 이것이 커지면 역시 코드가 난잡해지게 됩니다. Spring에서는 이러한 파라미터를 공통으로 처리할 수 있도록 구현된 인터페이스가 있는데, 그것이 바로 Argument Resolver입니다. Spring Argument Resolver API 엔드포인트로부터 들어온 데이터(파라미터)를 가공하여 필요..

2020. 8. 10. 18:12

[Spring boot] Spring boot Security를 이용한 OAuth2 인증 구현 1 - Google 계정 인증

지난 포스트에 이어서, 오늘은 새로운 프로젝트를 생성하여 Spring boot Security 디펜던시를 이용해 OAuth2 인증을 구현하는 시간을 가져보고자 합니다. 지난 포스트에서 OAuth2 인증을 구현하기 위해 인증 토큰과 액세스 권한을 얻는 방법에 대해 알아봤습니다. 클라이언트에서 권한 서버를 통해 권한을 확인하고, 부여 받은 ID와 Secret를 이용하여 토큰을 받는 방식이었죠. 이를 토대로 Spring boot security를 이용하여 회원 가입과 인증을 동시에 어떻게 구현할 수 있는지 지금부터 살펴보도록 하겠습니다. 이 포스트는 기본 애플리케이션으로 하여금, OAuth2 로그인부터 User Entity 연동까지 다룰 것이며 이번에 다룰 것은 기본적인 Spring boot security ..

2020. 8. 7. 15:22

[Spring boot] Spring boot Security로 시작해보는 인증

Spring Framework를 이용하여 웹 서비스나 REST API 서비스를 개발하게 되면 가장 필요로 하는 것은 바로 인증일 것입니다. 여기서 말하는 인증이란, 내가 개발한 서비스를 이용하기 위해 식별하고자 하는 사용자 혹은 관리자라고 할 수 있습니다. 일반적으로 Spring을 이용해서 인증 로직을 구현하고자 한다면, JPA를 이용해 사용자 Entity를 만들고, 연동하여 아이디와 패스워드를 동기화 한 후, 권한을 부여하는 방식으로 로직을 구현할 수 있을 것입니다. 그런데, 이를 직접 구현하지 않아도 이미 잘 만들어진 모듈이 있습니다. 그것이 바로 Spring boot Security입니다. 이번 포스트에서는 Spring boot Security를 왜 사용해야 하는지, 사용하기 위해 어떤 개념들을 공..

2020. 7. 25. 23:29

[Algorithm] - 2020 Kakao InternShip for Tech Developers Coding test 문제 풀이

최근 들어 개인 프로젝트, 각종 테스트 등으로 인하여 블로그에 대한 글 포스팅이 자주 안되고 있는 점에 대해 깊이 반성하고 있습니다. 그런 계기로 하여금 오늘은 제가 내일 치루게 될 코딩테스트를 위해 오늘 하루 날을 잡고, 연습하게 되었는데요. 이번 포스트는 카카오 코딩테스트 문제 두 번째인 2020 카카오 인턴십 코딩테스트 문제 풀이와 짤막한 후기를 남겨보고자 합니다. (참고로 이번 코딩 테스트는 난이도가 꽤 어려웠습니다.) Question 01. 키패드 누르기 문제 원문: (https://programmers.co.kr/learn/courses/30/lessons/67256) 스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다. 이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해..

[Spring] JPA의 플러시(flush)

JPA를 사용할 때, 객체를 생성하고 이를 영속성 컨텍스트에 영속시켜 커밋하는 과정까지를 알아봤습니다. 그런데, JPA의 commit()을 호출할 때 항상 발생하는 flush()는 어떤 역할을 하는 녀석일까요? flush() 커밋 메소드를 호출하게 되면 JPA 영속성 컨텍스트에 있는 객체들이 DB로 반영되게 됩니다. 그런데 실제로 commit() 메소드를 호출했을 때 이것이 진행되는 것일까요? 사실은 commit() 메소드가 호출될 때 flush() 메소드가 호출되어지고, 실제로는 flush() 메소드에 의해서 DB에 반영되어집니다. 즉, flush는 영속성 컨텍스트의 내용을 DB에 반영하는 역할을 하는 메소드이며, 쓰기 지연 SQL 저장소에 있는 SQL 쿼리가 DB 서버로 보내지기 때문에 영속성 컨텍스..