전체 글 106

Socket.IO 소개 2 - Event

이전 글... Socket.IO 소개 1 - server Emitting events 서버와 클라이언트 간에 이벤트를 보내는 방법에는 여러 가지가 있습니다. Basic emit // Server io.on("connection", (socket) => { // "world"라는 데이터를 담은 // "hello"라는 event를 보냅니다. socket.emit("hello", "world"); }); // Client // "hello"라는 이벤트에 대한 리스너입니다. socket.on("hello", (arg) => { // 해당 이벤트가 보낸 arg를 출력합니다. console.log(arg); // world }); Socket.IO API는 Node.js EventEmitter에서 영감을 얻었습니다..

Socket.IO 소개 1 - Server

들어가기 전에... 실시간 통신에 대해 먼저 배운 뒤 해당 글을 보면 더 좋습니다. 소개 Socket.IO는 low-latency, 양방향, 이벤트 기반 통신을 가능하게 하는 라이브러리입니다. WebSocket 프로토콜 위에 구축되었으며 HTTP long polling 또는 자동 재연결에 대한 폴백과 같은 추가 보장을 제공합니다. 다음은 Socket.IO를 사용한 간단한 양방향 통신 구현의 예입니다. // Server Side import { Server } from "socket.io"; const io = new Server(3000); io.on("connection", (socket) => { // client에게 메시지를 보냅니다. socket.emit("hello from server", 1,..

CORS란 (Origin, SOP, CORS, CSP)

들어가기 전에... 교차 출저 리소스 공유(Cross Origin Resource Sharing, CORS)를 알기 위해서는 동일 출처 정책(Same Origin Policy, SOP)과 출처(Origin)가 무엇인지에 대한 지식이 있어야 합니다. 따라서 이번 포스팅에서는 순차적으로 Origin이 무엇인지 배우고 SOP가 무엇인지 배운 뒤 CORS에 대해 배워보겠습니다. Origin 출처(Origin)는 CORS와 SOP의 O에 해당하는 Origin을 뜻합니다. 이는 URL의 프로토콜(스킴이라고도 함), 도메인, 포트로 정의 됩니다. 두 객체의 프로토콜, 호스트, 포트가 모두 일치하는 경우 같은 출처라고 말합니다. http://example.com:80/app1/index.html 위와 같은 URL이 있..

실시간 통신 - WebSocket이란

실시간 통신의 필요성 유저들은 더 빠르고 반응성 있는 웹 애플리케이션과 서비스를 기대합니다. 예를 들어 실시간 채팅 애플리케이션이나 주식 시장 모니터링, 실시간 위치 추적 및 멀티플레이어 게임과 실시간 협업 툴 등이 그러합니다. 우리는 HTTP 프로토콜을 사용하여 이러한 실시간 통신과 비슷한 것을 이룰 수 있습니다. 물론 완벽하지는 못하지만요. 이번 포스팅에서는 기존 HTTP 기술을 활용하여 이러한 실시간 통신과 비슷한 경험을 달성하는 기술과 해당 기술의 단점을 보완하는 WebSocket에 대해 배워보겠습니다. HTTP를 사용한 실시간 통신의 구현 HTTP를 사용한 실시간 통신은 크게 Polling, Long Polling, Streaming 이 세 가지로 나눌 수 있습니다. 어떻게 HTTP를 사용하여 ..

Spring IoC 컨테이너 - 2

Bean Overview Spring IoC 컨테이너는 하나 이상의 빈을 관리합니다. 이러한 빈은 컨테이너에 제공하는 구성 메타데이터(e.g., XML )로 구성됩니다. 컨테이너 내에서 이러한 빈 정의(Bean definition)는 아래 메타데이터를 포함하는 BeanDefinition 개체로 표시됩니다. - A package-qualified class name: 정의 중인 Bean의 실제 구현 클래스입니다. - Bean이 컨테이너에서 어떻게 동작해야 하는지를 나타내는 Bean 동작 구성 요소(Bean begavioral configuration) 예를 들어, scope, **라이프사이클 콜백 등이 있습니다. - bean이 작업을 수행하는 데 필요한 다른 bean에 대한 참조. 이러한 참조를 협력자(c..

스프링 2023.07.15

Spring IoC 컨테이너 - 1

왜 스프링을 사용하나요 스프링(Spring)은 Java 기반의 오픈 소스 애플리케이션 프레임워크입니다. 스프링은 엔터프라이즈급 애플리케이션을 개발하기 위한 다양한 기능과 추상화된 라이브러리들을 제공하여 개발자가 애플리케이션을 더 쉽고 효율적으로 개발할 수 있도록 도와줍니다. 사실 위 문장만 보고 과연 스프링은 저래서 사용하는 거구나 하고 이해하기는 어렵습니다. 이어지는 포스팅에서는 스프링이 제공해주는 "다양한 기능과 추상화된 라이브러리들" 중에서 핵심인 IoC 컨테이너와 Spring AOP를 알아볼 것입니다. 스프링을 사용하는 이유는 앞으로 배울 이러한 기술들을 간편하게 사용할 수 있도록 제공해주기 때문이라고 생각하시면 됩니다. Core Technologies 스프링 프레임워크에 절대적으로 필요한 기술들..

스프링 2023.07.05

JPA N+1 문제 해결

N + 1 문제란? 엔티티를 가져오고 난 뒤 연관된 엔티티를 가져오기 위해 다시 쿼리를 날리는 것을 N + 1 문제라고 합니다. 예를 들어, Member와 Team이 N:1로 매핑되어 있을 때 'select m from Member m'이라는 JPQL문을 사용하면 우선, 한 번의 쿼리로 모든 Member를 가져옵니다. 그리고 Team 엔티티의 값에 접근하는 순간 추가적으로 쿼리가 나갑니다. 이때 Member row 하나당 한 번의 쿼리가 나가므로, Member의 row가 총 N개라면 N 번의 추가 쿼리가 나가게 됩니다. Member 엔티티를 가져올 때 1번 + Team 엔티티를 가져올 때 N 번의 쿼리가 발생하므로 총 N+1번의 쿼리가 발생합니다. 애초에 Member 엔티티를 가져올 때 Team 엔티티까..

JPA 2023.07.04

프로세스와 스레드

프로세스 프로세스란 메모리에서 실행 중인 프로그램(program in execution)을 뜻합니다. 여기서 프로그램이란 컴퓨터에서 실행할 수 있는 파일을 통칭합니다. 카카오톡, 크롬, Visual Studio Code 등등이 전부 프로그램입니다. 이러한 HDD에 저장된 프로그램이 메모리에 올라가 실행되면 그것을 프로세스라고 부르는 것입니다. 프로그램과 프로세스의 차이는 메모리에서 실행 중인가 아니면 HDD에서 가만히 있는 중인가의 차이입니다. HDD에 있으면 프로그램이고 그게 메모리에 올라가면 프로세스입니다. 프로세스는 task, job이라고도 불리며 Code + Data + Stack + Heap 등을 갖습니다. ** Code, Data, Stack, Heap? - Code: 프로세스의 실행 코드가 ..

운영체제 2023.07.03

트랜잭션의 격리성과 격리 수준

개인적으로 공부한 내용을 기반으로 작성하였습니다. 잘못된 내용을 반견하신 경우, 댓글로 알려주시면 감사하겠습니다. 이전 글의 트랜잭션 ACID 속성으로부터 파생된 내용입니다. 트랜잭션 격리성 트랜잭션은 종종 동시에 실행됩니다. 여러 트랜잭션이 동시에 수행되더라도 각각의 트랜잭션은 다른 트랜잭션의 수행에 영향을 받지 않고 격리되어 수행되어야 합니다. 즉, 한 트랜잭션의 작업이 다른 트랜잭션에 영향을 주지 않고 서로 격리되어 실행되어야 한다는 의미입니다. 이러한 Isolation 성질을 보장하지 않으면 데이터의 일관성과 무결성이 깨질 수 있습니다. 예를 들어, 각각 50원씩 들어있는 계좌 X, Y가 있을 때, X에서 Y로 30원을 입금하는 트랜잭션 1과 Y에서 X로 30원을 입금하는 트랜잭션 2가 격리성을 ..

데이터베이스 트랜잭션

개인적으로 공부한 내용을 기반으로 작성하였습니다. 잘못된 내용을 반견하신 경우, 댓글로 알려주시면 감사하겠습니다. 트랜잭션(Transaction) 트랜잭션은 DBMS 내에서 데이터베이스에 대해 수행되는 작업 단위입니다. 트랜잭션은 하나 이상의 데이터베이스 조작 작업을 하나의 논리적인 작업 단위로 묶어 관리합니다. 아래에 트랜잭션의 필요성을 느낄 수 있는 예시가 있습니다. A 사용자가 B 사용자의 계좌에 500원을 이체하는 메서드: A 사용자의 계좌에서 500원을 출금합니다. // 1 B 사용자의 계좌에 500원을 입금합니다. // 2 위와 같이 A 사용자가 B 사용자의 계좌에 500원을 이체하는 메서드가 있다고 생각해 봅시다. 해당 메서드는 1) A의 계좌에서 500원을 출금하고, 2) B 사용자의 계좌..