[서론]프로그램 만들다 보면 보면 데이터베이스로 부터 데이터를 읽고 쓰는 작업은 필수적이라고 해도 무방할 정도로 데이터베이스에 값을 쓰고 읽는 작업을 많이 한다. 저번 포스팅에서는 Google Guice(이하 주스)를 이용한 의존성 주입을 하는 법에 대해서 알아보았다면 이번 포스팅에서는 주스를 이용해서 MyBatis와 연동하는 법에 대해서 알아보도록 한다. 해당 연동 부분은 내가 참여하고 있는 프로젝트에서 직접 사용하고자 하여 자료를 조사하고 만들었는데 자료가 충분하지 않아 고생을 한 부분이다. (혹은 내가 자료들을 잘못 이해 해서 ...) [MyBatis와의 연동]저번 시간에 의존성 주입 모듈을 만들기 위해서 InjetConfig라는 클래스가 AbstractModule을 상속한 클래스에 주입될 클래스들..
[서론]이번 프로젝트 개발 중 모듈 별로 나눠져있는 API(Application Programming Interface)에 사용자의 접근을 권한별로 처리 해달라는 요구사항을 받았다. 처음에는 스프링 시큐리티를 사용하여 API에 보안을 적용하려고 하였지만 모듈 별로 스프링 시큐리티의 설정을 하면서 개발 하기에는 비효율적이라고 판단하였다. 그래서 나는 기존 스프링 설정에 구애를 받지 않고 단일 모듈로 동작 할 수 있는 필터를 만들어서 배포하고자 하였다. 이 때 의존 주입을 구글 주스를 사용하여 스프링으로 만들어져 있는 API의 설정과 혼동되지 않도록 하였다. 이번 포스팅에서는 먼저 간단하게 구글 주스를 사용하는 방법에 대해서 설명한다. [구글 주스란?]구글 주스는 스프링이 해주는 역할 중에 하나인 의존성 주..
서론 Spark는 데이터를 RDD라는 형태로 만들어서 사용하게 된다. 이 RDD(Resilient Distributed Dataset)를 가공하기 위한 방법에는 두가지 있다. 첫번째는 트랜스포메이션, 두번째는 액션이다. 먼저 트랜스포메이션에 대해서 설명을 하면 트랜스포메이션은 기존에 존재하던 RDD에 동작하여 새로운 RDD를 생성해낸다. 액션은 RDD에 저장되어 있는 결과데이터를 반환해준다. 여기서 중요한 것이 하나 있는데 RDD에 트랜스포메이션을 가해봤자 액션이 동작하기 전까지는 해당 트랜스포메이션 들이 동작 하지 않는다. 그 이유는 Spark가 동작하는 방식인데 Spark는 액션이 발생하기 전까지 RDD에 부여 되었던 트랜스포메이션에 대한 메타데이터만 저장하고 있다가 액션이 발생하면 해당 메타데이터를..
서론어플리케이션을 만듦에 있어서 데이터베이스에 정보를 업데이트하고 지우고, 인설트하는 것은 필수적인 요소라고 볼 수 있다. 데이터베이스에 정보를 최신화 함에 있어서 중요한 것이 바로 Transcation관리이다. 어떻게 일의 단위를 어떻게 묶어 주느냐에 따라 데이터의 품질이 좋아지냐 나빠지느냐에 기로에 서게 된다. 예를 들어 한 어플리케이션의 기능에서 A, B 두 개의 테이블에 정보를 각각 업데이트 한다고 하자. 첫번째 정보를 정상적으로 최신화 하였지만 프로그램 오류에 의해서 중간에 오류가 발생하였을 경우 첫번째 정보는 rollback되어야 한다. 만약 Transaction이 정상적으로 처리되지 않는다면 분명 기능은 동작하였고 A 테이블에는 데이터가 있지만 B 테이블에는 데이터가 존재 하지 않는 문제점이..
서론Web Application Server(이하 WAS)과 브라우저는 Http프로토콜을 사용하므로 연결이 지속적으로 유지가 되지 않는다. 이에 WAS는 사용자의 접속 정보를 유지하기 위해 Session이란것을 만들어 사용자의 요청헤더에 붙어 있는 쿠키값의 세션값과 비교해서 사용자를 구분하게 된다. 어플리케이션을 만들면서 해당 Session객체만을 사용해서 사용자를 구분할 수 있지만 요구 사항에 따라 이 Session객체와 관련된 수많은 자원들이 생성되어지게 될 수 있다. 예를 들어 A WAS, B WAS 총 두대의 WAS를 구동하는데 A WAS에서의 세션은 B WAS에서 인식하지 못하기 때문에 데이터베이스를 이용해서 A WAS에서 발급된 세션에 대한 정보를 테이블로 만들어 B WAS에서 사용되도록 할 ..
서론개발이 Client, Server로 나눠지면서 Server에서는 동적페이지를 Client에 제공하는 것이 아니라 Client에서 사용할 데이터를 제공해주는 형식으로 진행되면서 Server에서는 JSON 형태의 결과값을 응답결과로 전달하게 된다. Spring의 경우 ResponseEntity와 Response관련 어노테이션을 사용해서 손쉽게 JSON형태의 응답결과를 전송할 수 있다. 이번 포스팅에서는 Play를 사용할 시 어떻게 JSON형태의 응답 결과를 Client로 전달할 수 있는지에 대해서 알아보자.사용한 Play Version은 2.4.2, Scala version은 2.11이다. play.api.libs.json.Json의 사용Play 또한 Spring과 마찬가지로 JSON형태의 응답결과를 전..
서론스프링에서는 들어오는 요청에 대해 사전에 제어 할 수 있는 Filter와 Interceptor가 존재한다. 스프링의 Filter와 Interceptor는 요청에 대해 사전 처리, 후처리를 할 수 있는 기능이다. 기능은 똑같지만 서로 다른 차이가 있다. 간단하게 설명하자면 Filter와 Interceptor는 처리 시점이 다르다 Filter의 경우 Servlet으로 호출이 들어가기 전 해당 호출을 처리하며 Interceptor의 경우 Servlet을 통과해온 요청이 Controller로 들어가기 전에 대한 호출을 처리하는 것의 차이를 들 수 있다. Play에서도 Filter를 지원하는데 어떻게 사용하는지에 대해서 알아보자. 이 포스팅을 작성하면서 사용한 Play Version은 2.4.2, Scala ..
서론요즘 웹 서비스는 마이크로서비스 아키텍처 형태로 서비스를 제공하는 경우가 많다. 여기서 말하는 마이크로서비스 아키텍쳐는 하나의 큰 어플리케이션을 여러 개의 작은 어플리케이션으로 나누어서 개발하는 방법을 말한다. 예를 들어 기존의 한 어플리케이션이 데이터 조회와 사용자커뮤티티 서비스를 제공하는 것(모놀리틱 아키텍쳐)에서 데이터 조회 서비스와 사용자 커뮤니티 서비스를 분리해서 개발하는 것이 마이크로서비스 아키텍처이다.이렇게 마이크로서비스 아키텍쳐로 개발을 진행하게 되면 장점은 각 모듈은 제공하는 서비스가 서로 독립적이기 때문에 해당 모듈에 가장 잘맞는 프로그래밍 언어를 선택 할 수 있으며 모듈 별 배포를 따로 할 수 있으므로 전체 서비스를 내리지 않고도 배포를 할 수 있다. 예를 들어 모놀리틱 아키텍쳐에..
서론 Spring을 사용하면 Spring Security를 사용해서 보안을 설정 할 수 있다. Spring Security을 적용하면 프레임워크 상에서 기본적으로 설정된 내용을 바탕으로 동작하게 된다. 예를 들어 로그인 하지 않은 사용자가 권한이 맞지 않는 페이지에 접근하면 자동적으로 Login 양식이 있는 화면으로 리다이렉트 시켜버리는 경우가 있다. 이 경우 일반 JSP로 구현을 한다면 상관이 없지만 Back-End와 Front-End간의 JSON을 통신하는 경우에는 문제가 발생한다. Front-End의 소스에서 Html Tag로 이뤄진 응답결과를 제대로 파싱할 수 없어서 에러를 만들어 내게 된다.이번 포스팅에서는 이러한 문제점을 해결하는 법에 대해서 설명한다. 문제점에 대한 확인로그인 하지 않은 사용..
서론 저번 포스팅에서 서버로부터 실시간으로 데이터를 받아오기 위한 기법에 대해서 설명을 하였고 이번에는 실제로 구현을 해본다. 구현을 위해 선택한 방법은 Streaming 기법을 선택 하였으며 Netty를 사용하였다. Netty를 사용한 이유는 이벤트 기반으로 동작하는 네트워크 프레임워크로써 요청에 대한 이벤트를 설정해서 항상 대기하는 서버가 아닌 이벤트 기반으로 동작하게 하여 효율성을 높이기 위해서 선택하였으며 통신기법은 WebSocket을 사용하였다. WebSocket 같은 경우는 HTML5에서 지원되므로 낮은 버전의 브라우저에서는 동작하지 않게 된다. 이 경우 SSE를 사용하여야 하며 이번 포스팅에서는 WebSocket기준으로만 구현을 하였다. Netty에 대한 간략한 설명 Netty에 대해서는 깊..