트랜잭션에 대해
·
프로그래밍/데이터베이스
데이터베이스, RDBMS는 트랜잭션이라는 기능을 제공합니다. INSERT나 UPDATE 명령으로 데이터를 추가, 갱신할 때 이미 트랜잭션 명령을 사용하고 있었습니다, 하지만 우리는 사용하면서 지금까지 특별히 의식할 필요가 없었습니다. 그 이유는 자동 커밋(auto commit)이라 불리는 기능이 동작했기 때문입니다. 이런 트랜잭션으로 어떤것을 할 수 있는지 트랜잭션은 무엇인지 알아보도록 하겠습니다. 트랜잭션 트랜잭션에 대해 알아보기에 앞서 정규화에 의해 분할된 주문 테이블과 주문 상품 테이블의 관계를 생각해 보겠습니다. 주문 주문 상품 주문 테이블과 주문 상품 테이블 사이에는 의존관계가 존재합니다. 주문 테이블에 행이 존재한다면 주문 상품 테이블에는 적어도 하나의 행이 존재해야 합니다. 그렇지 않다면 주..
Singleton 패턴과 스프링에서는 Singleton 패턴을 어떻게 사용하고 있을까?
·
프로그래밍/Java
개요 현재 프로젝트에서 스프링을 사용하고 있습니다. 스프링을 사용하다 보면, 스프링은 IOC(Inversion Of Control -제어의 역전)컨테이너를 이용해, 스프링 Bean을 관리한다고 설명하고, 스프링Bean은 기본적으로 Singleton으로 Bean 객체를 생성한다고 알고 있었습니다. 그럼 이와 관련된 내용중 Singleton방식이 무엇인지 먼저 디자인 패턴에서의 Singleton 패턴에 대해 알아보고, 스프링에서는 Singleton 패턴을 어떻게 사용하고 있는지 알아보도록 하겠습니다. 디자인 패턴 에서의 Singeleton Pattern 싱글톤 패턴을 객체를 생성할 때, 인스턴스를 오직 한개만 제공하는 클래스입니다. 즉 객체를 처음 생성한 후 그 후에 해당 객체를 재생성할때는 동일한 객체를 ..
Long 과 AtomicLong은 어떤 차이가 있을까?
·
프로그래밍/Java
개요 프로젝트를 진행하면서 HashMap을 이용해 Key-Value 형태로 된 InMemory DB를 직접 구현하던 도중, 유저의 정보를 저장할 때 Long Type으로 선언된 유저의 ID값을 증가시켜줘야 하는 경우가 생겼습니다. 이때 대부분 ID 값을 id++ 과 같은 연산을 통해 수행할 텐데, 이렇게 증가 연산을 수행하게 되면 어떤 문제가 발생하게 되는지 그리고 어떻게 해결해야 할지 알아보도록 하겠습니다. 먼저 아래와 같은 연산을 통해 id값을 증가해 준다고 가정하겠습니다 public class UserTable { //예시용 테이블 클래스 Long userId; public void incrementUserId() { userId++; } } 이렇게 작성된 코드는 싱글 스레드 환경에서는 정확하게 동..
ConcurrentHashMap은 어떻게 동시성 문제를 해결할까?
·
프로그래밍/Java
개요 현재 진행중인 프로젝트에서 유저의 정보를 저장하는 저장소를 In-Memory Database로 간단하게 구현해야 할 필요가 생겨 구현을 진행하던 도중 유저의 정보를 저장하기에 적합한 자료구조로 Map을 선정했습니다. 그 중 자바에서 제공해주는 Map 인터페이스의 구현체로 HashMap과 ConcurrentHashMap이 있습니다 그 중 저는 현재 진행중인 프로젝트는 웹 프로젝트이고, 동시성 문제가 발생할 수 있기 때문에, 이런 상황에 사용하기 적합하다고 알려져 있는 ConCurrentHashMap을 사용하기로 했습니다. 하지만 현재 ConCurrentHashMap이 어떤 방식으로 동작하는지, 어떤 장 단점이 있는지 제대로 알지 못하기에 이번 기회에 사용을 하기에 앞서 학습을 해보고자 글을 작성합니다..
인증 방식으로 세션 VS 토큰 어떤걸 선택해야 할까?
·
프로그래밍/프로젝트
개요 진행 중인 프로젝트에서 사용자 로그인 과정 중 사용자 인증 방식으로 어떤 방법이 있는지, 각각의 인증 방법의 장단점은 무엇인지에 대해 알아보고, 프로젝트에는 어떤 걸 적용하는 게 좋을지에 대해 얘기해 보겠습니다. 인증이란? 인증 방식을 설명하기에 앞서 간단하게 인증이란 무엇인지에 대해 설명하겠습니다. 인증은 프로젝트를 예로 들어 굿즈 포유 시스템이 제공하는 서비스에 접근하기 위해 사용자의 정보를 확인하는 과정입니다. 세션 인증 방식 세션 기반의 인증 방식은 오랫동안 웹 애플리케이션의 기본 인증 방식이었습니다. 세션 인증 방식을 사용하고, 세션을 데이터베이스에 저장하는 방식을 사용하면 사용자가 로그인을 요청하면 사용자의 로그인 세션이 서버에 의해 생성됩니다. 그리고 이 로그인 세션 정보가 데이터베이스..
다중 서버 환경에서 사용자 로그인 구현시 세션 관리 방법으로 어떤걸 선택해야할까?
·
프로그래밍/프로젝트
이번 포스팅에서는 현재 프로젝트를 시작하면서 선택한 서버 확장 방식인 Scale Out 방식에서, 로드 밸런서를 통해 부하 분산 처리를 함에 따라 생기는 문제점 중 하나인 세션 관리에 대해 어떻게 해결할 것인지, 그리고 그와 관련된 내용들에 대해 포스팅을 통해 알아보려 합니다. 세션 관리 세션 관리(Session Management)를 왜 해야 할까요? 현재 저는 진행 중인 Goods-For-You 프로젝트에서 회원 로그인 기능을 구현하려 합니다. 회원 로그인 기능은 다음과 같은 과정으로 진행될 것으로 생각이 됩니다.(Goods-For-You 프로젝트는 대용량 트래픽을 받는 상황에서, 서버의 성능과 고가용성을 생각하면서 진행되고 있는 프로젝트입니다.) 사용자가 회원가입 시 입력한 아이디, 비밀번호를 입력..
OAuth2.0에 대해 알아보자
·
프로그래밍/HTTP
OAuth2.0이란? OAuth란? RESTAPI가 서로 다른 두 애플리케이션 간 데이터를 간편하게 전달하기 위해 만든 관례라면, OAuth는 데이터를 간편하고 안전하게 주고받기 위해 만들어진 표준입니다. OAuth는 ID와 비밀번호 대신 액세스 토큰(Access Token)을 기반으로 사용자를 식별합니다. 이 토큰은 API를 제공하는 리소스 서버만 발급할 수 있으며 일정시간(대부분 1시간)이 지나면 폐기될 수 있습니다. 또한 모든 토큰은 필요한 권한만 지니게 할 수 있어서 OAuth를 이용하면 서버는 클라이언트의 접근 권한을 쉽게 제어할 수 있다는 장점이 있습니다. OAuth의 장점 OAuth를 사용할때의 장점을 페이스북 API를 사용하는 앱을 예시로 들어 설명하겠습니다. 페이스북 API를 사용할 때 ..
서버 확장 전략 어떤걸 선택해야 할까?
·
프로그래밍/Infra
현재 프로젝트를 진행하고 있으면서 제가 만들고 있는 서비스의 흥행으로 사용자 이용량이 증가하게 되면 시스템의 확장이 필요해집니다. 그렇다면 그 때, 시스템의 확장을 위한 방법에는 어떤 것이 있을지 그리고 어떤 방식을 채택하는게 좋을지 알아보도록 하겠습니다. 먼저 서버의 확장이 왜 필요할지에 대해 알아보도록 하겠습니다. 간단한 사이드 프로젝트를 진행하게 되면, 위 그림과 같이 사용자 단말에서 웹 서버를 바로 조회하는 형식으로 프로젝트를 진행하게 됩니다. 이러한 단일 서버 형태의 단점은 사용자의 데이터를 웹 서버에 보관한다는 점, 그리고 그로인해 웹 서버가 사용자 단말과의 트래픽 처리와 함께 데이터 처리도 관여 하기 때문에, 전체적으로 웹 서버의 트래픽이 증가 해 장애 가능성이 높아진다는 점이 있습니다. 따..