전체 글 361

다중 서버에서 Session 관리하는 방법! (Multi-server session)

다중 서버 Session 관리 요즘은 서버의 성능을 업그레이드 하는 방법으로 스케일 아웃을 많이 사용한다. 그리고, 쿠버네티스의 여러 개의 POD에 각각 올려서 관리하기도 한다. 일반적인 멀티 서버의 환경은 아래와 같다. 가령, 스프링 부트 프로젝트를 분산 서버로 배포하고있다고 가정하자. 일반적으로 Tomcat이 JSESSIONID라는 세션을 만들어서 관리한다. 세션 저장소는 Tomcat 내부에 있으므로 여러개의 톰캣이 뜨게되면 각각이 가지는 세션 저장소는 다르다. 그러면 WAS1에서 세션을 생성한 사용자가 WAS2로 접속했을 때 세션을 찾을 수 없는 현상이 발생한다. Sticky Session Sticky Session 방식을 사용하면 WAS1에서 세션을 생성한 사용자는 다시 접속할 떄도 WAS1로 접..

DNS round robin 방식 장/단점과 해결방안!

DNS Load Balancing DNS 로드밸런싱은 별도의 하드웨어 장비나, 소프트웨어 없이 사용자가 DNS를 이용하여 도메인 정보를 조회하는 시점에서 트래픽을 분산하는 기법이다. DNS Load Balancing 기법 중에 Round robin 방식은 부하 분산의 대표적인 알고리즘인데, 순서대로 돌아가면서 (보통 시간 단위) 각각의 서버로 트래픽을 분산시켜서 처리하는 알고리즘이다. 즉, 사용자가 도메인 주소를 브라우저에 입력하게되면 DNS가 여러개의 IP 리스트 중에서 랜덤으로 IP를 하나 알려준다. 장단점 장점 중간 장비(로드밸런서 등) 없이도 서비스가 가능하다. 간편하다. 단점 서버의 수 만큼 공인 IP 주소가 필요하다. 서버에 장애가 발생해도 감지하지 않고 부하를 분산시킨다. 일반적인 로드밸런싱..

Operation/Network 2022.04.21

Database - 교착상태 문제를 해결하는 방법!

DB(데이터베이스)에서의 교착상태 운영체제에서 교착상태(Dead Lock)는 각각의 프로세스가 서로의 자원을 점유하기 위해 대기하면서 문제가 발생한다 DB(데이터베이스)에서 교착상태는 여러 개의 트랜잭션(Transaction)들이 실행을 하지 못하고 서로 무한정 기다리는 상태를 의미한다. 트랜잭션 1이 테이블 B에 insert하게 되면서 첫 번째 행의 Lock(잠금)을 얻는다. 트랜잭션 2도 테이블 A의 첫 번째 행의 Lock(잠금)을 얻는다. Transaction 1> start transaction; insert into B values(1); Transaction 2> start transaction; insert into A values(1); 여기서 트랜잭션을 commit 하지 않은채 서로의 첫..

Database/SQL 2022.04.20

OS - 교착 상태(Deadlock) 정리!

교착상태(Deadlock) 교착상태는 다중 프로그래밍 환경에서 나타날 수 있는 문제점으로, 2개 이상의 프로세스들이 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한정 기다리는 현상이다. 교착상태는 위와 같이 그림으로 표현할 수 있다. 프로세스1은 자원 A가 필요하다. 자원 A는 프로세스2에 의해 잠겨져있다. 프로세스2는 자원 B가 필요하다. 자원 B는 프로세스1에 의해 잠겨져있다. 즉, 어느 한 프로세스를 강제적으로 종료하지 않으면 컴퓨터가 정지된 것 처럼 어떤 작업도 수행할 수 없다. 발생 조건 교착상태의 발생 조건은 아래 4가지를 모두 만족하는 것이다. 하나라도 만족하지 않으면 절대로 데드락이 발생하지 않는다. 상호 배제(Mutual exclusion) 한 리소스는 한..

Operation/OS 2022.04.19

메시징 시스템(Messaging System) 정리!

MSA 요즘 MSA가 대두되면서 Kafka, RabbitMQ, ActiveMQ 등 메시징 시스템도 함께 떠오른다. MSA에서는 시스템 간 호출이 많기 때문에 서비스간 결합도를 낮추기 위해서 + 비동기 요청, 성능, 안정성 등 여러가지 이점이 있어서 메시징 시스템을 많이 사용하게 된다. 이 글에서는 MSA에서의 전반적인 메시징 시스템에 대해 다룬다. 용어 MOM (Message Oriented Middleware, 메시지 지향 미들웨어) 독립된 애플리케이션 간 데이터를 주고받을 수 있는 설계 함수 호출, 메모리 공유가 아닌 메시지 교환을 이용하는 중간 계층 Infra Architecture 분산 컴퓨팅이 가능해지며, 서비스간의 결합도가 낮아진다. 비동기로 메시지를 전달한다. Queue, Broadcast,..

JPA - 비관적 락, 낙관적 락 (+ 트랜잭션 격리 수준) 정리!

격리 수준 락(Lock)을 이해하기 전에 트랜잭션 격리 수준을 먼저 알아야한다. 트랜잭션 격리수준(isolation level)이란 동시에 여러 트랜잭션을 처리할 때, 트랜잭션이 얼마나 서로 고립되어 있는지를 의미한다. 즉, 해당 트랜잭션이 다른 트랜잭션에서 변경한 데이터를 볼 수 있는 기준을 결정하는 것이다. 격리수준은 크게 4가지로 나눌 수 있다. READ UNCOMMITTED 커밋되지 않은 데이터를 읽을 수 있다. Dirty Read, Dirty Write가 발생할 수 있다. READ COMMITTED 커밋된 데이터만 읽을 수 있다. 오라클 DBMS에서 표준으로 사용하고 있고 가장 많이 선택된다. Lost Update, Write Skew, Read Skew가 발생할 수 있다. REPETABLE R..

Server/Spring JPA 2022.04.17

Java - Hibernate는 무엇인가?

JPA 하이버네이트(Hibernate)를 이해하기 전에 JPA를 알아야 합니다. JPA는 Java Persistence API의 약자로 자바 ORM에 대한 표준 인터페이스입니다. 자바에서는 JPA를 인터페이스로 구현하고, JPA를 사용할 수 있는 구현체를 만들 수 있도록 설계했습니다. JPA의 구현체로 대표적인 Framework로 Hibernate가 있습니다. Hibernate JPA는 기술 명세입니다. JPA만으로 구현체 없이 ORM을 사용하는 것은 불가능합니다. 하이버네이트(Hibernate)는 JPA의 대표적인 구현체입니다. JPA의 핵심 인터페이스인 EntityManagerFactory, EntityManager, EntityTransaction를 Hibernate에서 각각을 상속하는 인터페이스를..

Language/Java 2022.04.17

DTO를 Inner static class로 간결하게 관리하기! (+ domain 분리)

DTO 관리 API가 클라이언트(Client)가 보낸 Request Payload를 받을 때 RequestDto를 사용하고, 결과 값을 내려줄 때 ResponseDto를 사용합니다. 문제는 API 스펙을 고도화할수록 Dto가 너무 많아진다는 것입니다. End-point 요청에 따라 Request Body가 다르고 Response Body도 다릅니다. 그래서 API 스펙을 많이 뽑을 수록 Dto 패키지는 아래 처럼 지저분해집니다. (이미지 길이 보니까 더 길어 보이네요..!) Domain 분리 프로젝트가 어느정도 크기가 커지면 로직 안에서 동작하는 클래스들은 domain별로 관리하는 게 좋습니다. domain별로 class를 정리합니다. 아까보다는 좋긴 하지만, 더 간결해질 방법이 있습니다. Inner s..

API - CSV(엑셀 파일) 내보내기 성능 개선 및 부하 테스트

Export CSV 지난 주 회사에서 CSV 형태로 친구목록을 내보내는 API를 추가하는 작업이 있었습니다. 작업 내용은 아래와 같습니다. Response Header를 명시한다. -> (Content-type: application/csv) List를 하나 생성한다. List에 CSV의 헤더(첫 행)을 삽입한다. 친구 목록 테이블이 5개의 다른 테이블과 LEFT JOIN해서 결과를 받는다. 조회 결과를 record 단위로 순회하면서 CSV에 맞는 스펙으로 변환하고 List에 삽입한다. 결과를 반환한다. 중요한 점은 개발해야 하는 CSV 구조 Tables 구조가 많이 달라서 데이터 가공 작업을 했어야 했습니다. 예를 들면, 아래와 같은 CSV 스펙이 필요하다고 가정합시다. 집 주소 회사 주소 배송 주소 ..

Operation/Network 2022.04.16

Spring Boot - Thread Pool을 관리하는 방법! (Spring Boot에서의 Thread 기본 원리) [ThreadPoolExecutor]

ThreadPool의 동작을 이해하는 것이 개발하는 앱 서버에 영향을 미칠까..?! ThreadPool은 응답 시간, 처리 속도, TPS에 영향을 미친다. 추가로 병목 현상, CPU 오버헤드, 메모리 부족 등의 문제를 방지해서 안정적인 어플리케이션의 운용이 가능하게 합니다. 즉, ThreadPool에 대한 기본적인 개념을 알아야 더 좋은 Server Application을 개발할 수 있습니다. Java - Threading Model Java에서는 One-to-One Threading-Model로 Thread를 생성합니다. One-to-One Threading-Model은 User Thread(Process의 스레드) 1개는 OS Thread 1개와 연결해야 합니다. 이때 작업 요청이 들어올 때마다 Th..

Server/Spring 2022.04.16