전체 글
-
블록체인카테고리 없음 2023. 5. 18. 09:06
블록체인이란? A가 B에게 1000원을 주려고 할 때 하나의 방법으로 은행을 통해 계좌이체를 할 수 있습니다. 이때 은행이라는 제 3자가 A와 B 사이에 중개자 역할을 하게 됩니다. 그런데 만약 은행에 문제가 발생한다면 A와 B가 거래한 내역이 사라질 수도 있습니다. 블록체인은 은행 같은 중개기관에 데이터를 저장하는 것이 아닌 분산 네트워크에 동일한 데이터를 관리하게 됩니다. 은행 같은 중앙화 시스템은 중앙서버 하나만 공격하게 되면 정상적인 운영이 어렵게 됩니다. 하지만 블록체인처럼 많은 곳에 동일한 데이터를 관리하게 되면 하나의 서버가 다운이 되어도 나머지 서버는 정상적으로 데이터를 유지할 수 있습니다. A와 B가 블록체인으로 거래를 한다면 그 거래내역은 블록체인 네트워크에 참여하는 모든 서버에 저장이..
-
다중 서버 환경에서 세션 관리WEB 2023. 4. 8. 15:12
서버가 많은 요청을 수행함으로써 Scale out 방식으로 서버를 확장할 때 로드 밸런싱을 통해 부하 분산을 하는데 이때 발생하는 세션 불일치의 문제를 해결하는 방법을 알아보겠습니다. 웹 애플리케이션은 HTTP 프로토콜을 사용하는데 HTTP는 무상태성(Stateless)의 특징을 가지기 때문에 서버는 클라이언트의 상태를 저장하지 않습니다. 그래서 로그인과 같이 상태를 저장해야 하는 로직 같은 경우 쿠키와 세션을 이용할 수 있습니다. 쿠키와 세션으로 상태 유지 로그인 요청할 때 클라이언트가 로그인 요청을 하면 서버에서는 세션 id를 생성하고 서버가 가진 로컬 세션 저장소에 유저정보와 함께 저장합니다. 응답에 Set-Cookie 헤더로 세션 id를 담아 클라이언트로 보내면 브라우저가 쿠키를 저장합니다. 로그..
-
격리 수준(isolation level)DB 2023. 3. 14. 21:27
격리 수준(isolation level)은 동시에 여러 트랜잭션이 동시에 처리될 때 트랜잭션이 얼마나 고립되어 있는지를 의미합니다. 격리 수준이 높으면 트랜잭션간의 고립정도도 높아져 데이터 정합성이 높아지지만 성능이 저하됩니다. 격리 수준이 낮으면 트랜잭션간의 고립정도도 낮아져 동시 처리성이 높아 성능이 좋아지지만 데이터 정합성이 떨어집니다. 그래서 각 프로젝트의 성격에 맞는 격리 수준을 조절하는 것이 필요합니다. 먼저 격리 수준에 따라 발생하는 부정합을 알아보겠습니다. 부정합 Dirty Read 아직 커밋되지 않은 데이터를 다른 트랜잭션에서 읽는 현상입니다. Non-Repeatable Read 하나의 트랜잭션 내에서 같은 Select 쿼리를 실행했을 때 서로 다른 결과가 나타나는 현상을 말합니다. P..
-
인덱스(Index)DB 2023. 3. 13. 22:29
인덱스는 데이터베이스의 검색 속도를 향상하기 위한 자료구조입니다. 주로 책 뒤에 있는 색인에 비유해서 표현하는데, 색인과 마찬가지로 먼저 찾고자 하는 데이터를 색인에서 찾아 해당 위치를 알아내 실제 책의 위치에서 데이터를 찾을 수 있습니다. 인덱스도 실제 테이블과 별개의 저장 공간에 위치해 있고, 인덱스에서 찾고자 하는 데이터를 찾고, 실제 데이터를 얻을 수 있습니다. 그러기 위해서는 색인과 인덱스는 항상 정렬돼 있어야 합니다. 그래야 빠르게 찾을 수 있기 때문입니다. 정렬이 되어 있다고 해도 처음부터 순서대로 찾는다면 인덱스를 별도로 만든 의미가 없을 것입니다. 그래서 주로 B-Tree 기반 알고리즘을 사용해 인덱스를 찾게 됩니다. 클러스터 인덱스 VS 논클러스터 인덱스 클러스터 인덱스(Clustere..
-
필터 VS 인터셉터Spring 2023. 3. 9. 21:51
애플리케이션 로직에서 공통으로 처리해야 할 작업을 위한 기술을 알아보겠습니다. 로그인을 한 사용자인지 확인이 필요한 로직이 여러 요청에서 필요하다면 필터 또는 인터셉터를 이용해 처리할 수 있습니다. 필터 먼저 필터의 흐름을 보면 디스패처 서블릿 요청 전/후로 실행해 요청에 대한 공통적인 작업을 처리해 줍니다. 스프링에서 필터를 사용하기 위해 javax.servlet.Filter 인터페이스를 구현해주어야 합니다. init(), destroy() 메서드는 default 메서드이므로 doFilter() 메서드만 오버라이딩해도 됩니다. init() : 필터 초기화 메서드. 서블릿 컨테이너가 생성될 때 1회 호출함 doFilter() : 해당되는 url의 요청과 응답에 실행됨. 필터 로직 작성 destroy() ..
-
OAuth(w. 카카오 로그인)WEB 2023. 3. 8. 22:14
OAuth란? OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고, 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는 접근 위임을 위한 개방형 표준이다. 내가 만든 사이트에서 사용자의 아이디와 비밀번호를 받고 검증하는 방식 대신 카카오, 구글 등의 인증 방식을 사용함으로써 카카오, 구글과 같은 서비스의 자원에 접근할 수 있는 권한을 얻을 수 있습니다. 이때 OAuth 기반으로 인증이 이루어집니다. OAuth의 주체 Resource Owner(사용자) 실제 사용자 Resource Server에 자신의 정보를 가진 소유자 Client(나의 서비스) 사용자를 대신해 Resource Server에 접근하고 싶은 애플리케이션 Resour..
-
React RouterReact 2023. 2. 23. 23:26
React SPA는 url마다 새로운 페이지를 불러오는 것이 아니고, url마다 해당하는 페이지를 렌더링 합니다. React 자체적으로 내장된 기능이 없으므로 라우팅 라이브러리가 필요합니다. 설치 먼저 react-router-dom을 설치해 줍니다. $ npm install react-router-dom 예제화면 다음과 같이 상단에 메뉴바가 있고 각각의 페이지가 아래 나오는 화면을 만들어 보겠습니다. 주요 컴포넌트 react-router-dom에서 BrowserRouter, Routes, Route를 불러옵니다. import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; react-router-dom에는 와 가 있습니다. 는 HT..
-
DI(Dependency Injection), IoC(Inversion of Control)Spring 2023. 2. 22. 20:38
의존성(Dependency)이란? 의존성이란 하나의 코드에서 다른 코드를 사용하는 것을 말합니다. 클래스 A에서 클래스 B를 사용할 때 A는 B에 의존적이라고 할 수 있습니다. public class A { B b = new B(); public A(){ ... } } 코드로 예를 들어보겠습니다. 아래 코드에서 Computer 클래스는 CPU 인터페이스를 의존하고 있습니다. 이 코드의 문제점은 추상 타입인 Cpu 인터페이스뿐만 아니라 구체 타입인 IntelCorei5 클래스에도 의존하고 있다는 것입니다. IntelCorei5 클래스가 변경이 되면 Computer 클래스에도 영향을 미치기 때문에 이런 의존성에는 문제가 있습니다. public class Computer { Cpu cpu = new Intel..