이번 글에서는 서버 사이드 플로우를 이용해 액세스 토큰을 획득해보도록 하겠습니다. 0. OAuth2.0 클라이언트 OAuth2.0 클라이언트를 만드는 과정은 다음의 4단계로 나눌 수 있습니다. 클라이언트 애플리케이션 등록하기 액세스 토큰 얻기 액세스 토큰을 이용해서 보호된 리소스에 접근하기 엑세스 토큰 갱신하기 여기에서 액세스 토큰을 갱신하는 것은 신뢰 클라이언트(서버 사이드 워크플로우)일 경우에만 가능합니다. 액세스 토큰을 갱신하려면 리프레시 토큰(Refresh Token)을 안전하게 저장할 수 있어야 합니다. 이번 글에서는 2단계인 '엑세스 토큰 얻기'를 살펴보겠습니다. 그 중 신뢰클라이언트의 서버 사이드 워크플로우를 다뤄보겠습니다. 1. 엑세스 토큰 앞서 애플리케이션을 등록했으면 엑세스 토큰을 요청..
이번 글에서는 OAuth2.0의 애플리케이션을 등록해보겠습니다. 0. OAuth2.0 클라이언트 OAuth2.0 클라이언트를 만드는 과정은 다음의 4단계로 나눌 수 있습니다. 클라이언트 애플리케이션 등록하기 액세스 토큰 얻기 액세스 토큰을 이용해서 보호된 리소스에 접근하기 엑세스 토큰 갱신하기 여기에서 액세스 토큰을 갱신하는 것은 신뢰 클라이언트(서버 사이드 워크플로우)일 경우에만 가능합니다. 액세스 토큰을 갱신하려면 리프레시 토큰(Refresh Token)을 안전하게 저장할 수 있어야 합니다. 이번 글에서는 1단계인 '클라이언트 애플리케이션 등록하기'를 살펴보겠습니다. 1. 클라이언트 애플리케이션 등록하기 클라이언트가 OAuth2.0 서비스 제공자에게 요청을 보내기 전에 서비스 제공자는 자신에게 요청을..
이번 글에서는 신뢰 클라이언트가 사용하는 OAuth2.0 정보교환 방법인 서버 사이드 워크플로우에 대해 알아보겠습니다. 0. 서버 사이드 워크플로우란? 앞선 글에서 서버 사이드 워크플로우는 신뢰 클라이언트가 사용하는 정보교환 방식임을 확인 할 수 있었습니다. 이번 글에서는 마찬가지로 Velog에서 구글 아이디로 회원가입을 한다고 가정하도록 하겠습니다. 빨간색 부분이 이번 글에서 다룰 부분입니다. 1. Access Token 마찬가지로 서버 사이드 워크플로우도 최종적으로는 Access Token을 사용해 사용자의 리소스에 접근합니다. 하지만, 이전 클라이언트 사이드 워크플로우와 다르게 토큰을 발급받기 위해선 한 단계를 더 거쳐야합니다. 서버 사이드 워크플로우는 리소스 제공자에게 먼저 연락처에 접근할 수 있..
이번 글에서는 비신뢰 클라이언트가 사용하는 OAuth2.0 정보교환 방법인 클라이언트 사이드 워크플로우에 대해 알아보겠습니다. 0. 클라이언트 사이드 워크플로우란? 앞선 글에서 클라이언트 사이드 워크플로우는 비신뢰 클라이언트가 사용하는 정보교환 방식임을 확인 할 수 있었습니다. 이번 글에서는 마찬가지로 Velog에서 구글 아이디로 회원가입을 한다고 가정하도록 하겠습니다. 빨간색 부분이 이번 글에서 다룰 부분입니다. 1. Access Token 클라이언트 사이드 워크플로우를 사용하는 어플리케이션은 비 신뢰 어플리케이션이므로 기밀 정보를 저장하고 전달하는 것을 신뢰할 수 없습니다. 클라이언트 사이드 워크플로우에서 아래 빨간색부분 즉 권한을 받는 부분에서 서비스 어플리케이션(Velog)은 리소스 제공자(Goo..
이번 글에서는 OAuth2.0의 개요에 대해 알아보겠습니다. 0. OAuth2.0 동작흐름 앞서 OAuth2.0의 기본적인 동작 흐름은 아래와 같이 설명했습니다. 이제 위의 동작 흐름을 조금더 자세히 살펴 보겠습니다. 1. 사용자 동의(User Consent) 위의 흐름에서 구글은 사용자에게 Velog가 특정 서비스에 접근할 것을 허용할 것인지 확인합니다. 이러한 확인을 사용자 동의(User Consent)라고 합니다. 사용자 동의(User Consent) 과정을 살펴보기 위해 신규 사용자가 Velog에 회원가입하는 상황을 가정하겠습니다. 아래 빨간색 화살표 부분이 사용자 동의(User Consent)를 획득하는 지점입니다. 신규 사용자가 아래와 같이 Google 로그인 버튼을 누르면 사용자는 Googl..
이번 글에서는 전 세계 표준 권한 위임, 인가 오픈 프로토콜인 OAuth2.0에 대해 알아보도록 하겠습니다. 0. OAuth2.0이란? 서로 다른 두 집단이 정보와 리소스를 안전하고 신뢰할 수 있는 방법으로 공유할 수 있게 해주는 프로토콜입니다. 제가 글을 쓰고 있는 플랫폼인 Velog도 OAuth2.0을 사용해 아래와 같이 서비스를 제공하고 있습니다. '~로 로그인'은 OAuth2.0을 활용하는 대표적인 서비스입니다. 1. 인증(Authentication)과 인가(Authorization) OAuth2.0을 이해하기 위해서는 인증(Authentication)과 인가(Authorization)에 대한 이해가 필요합니다. ✔ 인증 인증은 누군가가 그들이 말하는 그 사람이 맞는지 실제로 확인하는 절차입니다...
이번글에서는 앞서 생성한 Spring Batch의 Meta Data Table에 대해 자세히 알아보도록 하겠습니다. 1. Meta Data Table 이전글에서 생성한 spring batch meta data table의 전체 구조는 다음과 같습니다. 이번글에서는 위의 테이블들을 자세히 살펴보도록 하겠습니다. 😎 2. BATCH_JOB_INSTANCE 먼저 batch_job_instance 테이블은 job parameter에 따라 row가 생성되는 테이블 입니다. 현재 MySQL에서 batch_job_instance를 조회해보면 아래와 같이 검색됩니다. • job_instance_id : batch_job_instance 테이블의 PK 입니다. • job_name : 수행한 batch job의 name ..
이번글에서는 MySQL을 사용해 Spring Batch를 실행하는 방법에 대해 알아보도록 하겠습니다. 1. H2 이전글에서 사용한 코드를 동일하게 사용하도록 하겠습니다. 우리는 이전글에서 간단하게 Spring Batch Application이 작동하는 것을 확인했습니다. 이때 MySQL이나 Oracle과 같은 DB를 사용한다고 명시하지 않았기 때문에, Spring Boot의 Default DB인 H2를 사용해 Spring Batch가 수행되었다고 생각할 수 있습니다. 2. MySQL 그렇다면 MySQL을 사용할때도 동일하게 별다른 설정 없이 Spring Batch가 작동할 수 있을까요?.. 정답은 그렇지 않습니다.😅 내장 DB인 H2를 제외한 DB에서 Spring Batch를 사용하기 위해서는, DB에 ..
이번글에서는 Spring Batch를 사용해 간단한 Batch Job을 수행해보도록 하겠습니다. 1. Spring Batch Project 먼저 Spring Batch Project를 생성하도록 하겠습니다. 저는 'Spring Boot 2'와 'Gradle'을 사용하겠습니다. SQL은 'JPA'를 사용하도록 하겠습니다. • Spring Boot 2 • Java 8 • Gradle • JPA Spring Intilizer를 사용해 각자 환경에 맞는 Spring Project를 생성합니다. 프로젝트 생성시 Spring Dependencies는 다음과 같이 선택합니다. 생성이 완료된 project의 build.gradle은 다음과 같습니다. build.gradle plugins { id 'org.springf..
이번글에서는 Batch Application에 대해 알아보도록 하겠습니다. 1. Batch Application Batch Application이란 단발성으로 대용량의 데이터를 처리하는 어플리케이션을 의미합니다. 예를 들어 매일 전날의 대용량 데이터를 집계해 처리해야하는 단발성 비즈니스 로직이 필요하다면, 이를 Batch Application 으로 작성해 수행할 수 있습니다. 만약 이를 Batch Application으로 분리해 수행하지 않고, 실제 서비스를 수행하는 MVC 서버에서 처리하게 된다면 해당 집계처리를 위해 많은양의 CPU, I/O 등의 자원을 소모하게 됩니다. 반면 Batch Application으로 처리한다면 사용자들에게는 쾌적한 서비스를 제공할 수 있습니다. 또한, Batch 로직 수행..
이번 글에서는 stream에 대해 간단하게 알아보도록 하겠습니다. 1. Stream stream이란 java8부터 추가된 기능으로, collections에 lambda를 사용해 효율적으로 iteration을 수행할 수 있는 기능입니다. 이전 글에서 살펴보았던 forEach도 stream의 한 종류로 생각할 수 있으며, 사전적 정의는 다음과 같습니다. "A sequence of elements supporting sequential & parallel aggregate operations" 음.. 조금더 자세히 살펴보겠습니다. 😅 예를 들어 위와 같이 총 6개의 car로 구성된 Cars collections이 있으며, Cars collections이 정비를 위해 정비소에 들렸다고 가정해보겠습니다. 이때 기..
이번 글에서는 lambda를 사용한 foreach iteration에 대해 알아보도록 하겠습니다. 1. Foreach Iteration java8에서는 collections을 looping하는 방법으로 lambda를 사용한 foreach 방법이 새롭게 등장했습니다. 1-1) external iterator 예를 들어 아래와 같은 List가 존재할때 List people = Arrays.asList( new Person("Charles", "Dickens", 60), new Person("Lewis", "Carroll", 42), new Person("Thomas", "Carlyle", 51), new Person("Charlotte", "Bronte", 45), new Person("Matthew", "..
이번 글에서는 lambda의 method refernece에 대해 알아보도록 하겠습니다. 1. Method Reference lambda에서 method reference를 사용하면, 조금 더 간결하게 코드를 작성할 수 있습니다. 😎 1-1) lambda 예를 들어 다음과 같이 작성한 lambda 식이 있을때 public class MethodReferenceExample { public static void main(String[] args) { Thread thread = new Thread(() -> printMessage()); thread.start(); } public static void printMessage() { System.out.println("Hello World!"); } } 위..
이번 글에서는 lambda의 this refernece에 대해 알아보도록 하겠습니다. 1. This Reference this reference란 java에서 current object를 reference하는 방법으로 사용되는 keyword를 의미합니다. 1-1) implements class 아마, 이 글을 보고 계신분들도.. 이미 this refence를 사용해본 경험이 있을 겁니다. 😅 예를 들어 다음과 같이 public class ThisReferenceExample { public static void main(String[] args) { ThisReferenceExample thisReferenceExample = new ThisReferenceExample(); thisReferenceEx..
이번 글에서는 closure에 대해 알아보도록 하겠습니다. 1. Closure closure란 다른 함수의 scope 변수에 접근할 수 있는 함수를 의미합니다. 1-1) implements interface 예를 들어 다음과 같은 예제가 존재할때 public class Closure { public static void main(String[] args) { int a = 10; int b = 20; // implements interface doProcess(a, new Process() { @Override public void process(int i) { System.out.println(i + b); } }); } public static void doProcess(int i, Process p..
이번 글에서는 lambda의 exception handling 방법에 대해 알아보도록 하겠습니다. 1. Exception Handling lambda에서 exception handling을 구현 하기위해선 어떻게 해야할까요? 😅 예를 들어 입력받은 배열의 elements를 key로 나눈 값을 출력하는 예제가 있다고 가정해보겠습니다. public class ExceptionHandling { public static void main(String[] args) { int[] someNumbers = {1, 2, 3, 4}; int key = 2; // print process(someNumbers, key, (k, v) -> System.out.println(k / v)); } private static ..
이번 글에서는 functional interface에 대해 알아보도록 하겠습니다. 1. Functional Interface functional interface란 lambda식에 사용될 수 있는 interface를 의미합니다. 이전 글에서 살펴 보았듯이, lambda에선 interface를 사용해 type을 정의할 수 있습니다. 이때 interface type으로 사용되는 interface는 반드시 한개의 'abstract' method만 선언되어 있어야 합니다. // interface for lambda interface MyLambda { void perform( ); } java8부터는 interface 내부에 default & static 메서드를 직접 구현할 수 있도록 변경되었으므로.. fun..
이번 글에서는 lambda에 대해 조금 더 자세히 알아보도록 하겠습니다. 1. Using Lambda 이전 글의 예제를 다시 한번 살펴보겠습니다. 1-1) function type 이전글에서 Greeter의 greet 메서드에 특정 '기능'을 전달하기위한 방법에는 다음과 같이 2가지 방법이 존재했습니다. 첫 번째는 Interface를 생성하고, 해당 Interface를 구현한 클래스의 인스턴스를 전달하는 방법. 두 번째는 lambda 식으로 작성한 action을 전달하는 방법. 이때 lambda 식은 다음과 같이 작성할 수 있었습니다. aBlockOfCode = () -> System.out.println("Hello World!"); 그렇다면 위의 경우에 aBlockOfCode의 변수 Type은 무엇이..
이번 글에서는 lambda에 대해 알아보도록 하겠습니다. 1. Understanding Lambda lambda란 java8에 추가된 functional programming을 지원하는 기술입니다. lambda는 전통적인 OOP(Ojbect-Oriented-Programming)와는 전혀 다른 방식인 함수형 프로그래밍(Functional-Programming) 방법으로 프로그램을 작성합니다. lambda를 사용해 프로그램을 작성하면 다음과 같은 이점을 가지게 됩니다. • 함수형 프로그래밍 작성이 가능합니다. • 읽기 쉽고 간결한 코드 작성이 가능합니다. • API와 Librariy의 사용이 쉬워집니다. • 병렬 processing으로 처리가 가능해집니다. 2. Functinal Programming vs..
이번 글에서는 thread pool과 executor service를 사용해 작업을 처리하는 방법에 대해 알아보도록 하겠습니다. 1. Thread Pool & Executor Service thread pool은 collections of threads로, 각각의 thread는 주어진 task를 concurrently 하게 수행합니다. 위와 같은 쓰레드 풀은 동시에 가동하는 쓰레드 수에 제한을 둘 때 유용합니다. 새 쓰레드를 생성하는 것은 오버헤드가 따르기 때문에, 매 작업마다 새 쓰레드를 생성하지 않고 쓰레드 풀에 작업을 넘기는 방법으로 수행할 수 있습니다. Thread Pool을 사용하는 Task 객체는 다음과 같이 작성할 수 있습니다. public class WorkTask extends Threa..