목록Back-end (17)
장미정원

들어가며동시성 문제는 서버 애플리케이션을 개발 할 때 항상 고민해야하는 문제입니다. 공유 자원을 여러 스레드가 접근하려할 때 경쟁상태가 발생하여 lost update와 같은 이상 현상이 발생할 수 있습니다. 이러한 동시성 처리를 위해 데이터베이스 Lock을 사용할 수 있습니다. Spring Data Jpa를 사용한다면 어노테이션으로 간단하게 낙관적 락, 비관적 락을 손쉽게 적용하여 동시성 처리를 할 수 있습니다. @Transaction 어노테이션 속성으로 isolation 단계를 SELIALIZATION으로 설정하여 데이터 정합성을 보장할 수도 있습니다. 추가로 자바 문법에서 지원하는 메서드에 synchronized 키워드를 붙혀 내부적으로 모니터락을 사용하여 동시성 처리를 할 수 있지만, scale-o..

Spring WebFlux, MVC Stack에 대해 WebFluxSpring WebFlux는 reactive web stack 프래임워크이며, non-blocking I/O를 지원하고 event-loop 방식으로 적은 양의 스레드로 대용량 요청을 처리할 수 있습니다.WebFlux 스택을 기존에 사용하는 MVC 모델과 비교하며 설명하도록 하겠습니다. MVC Thread Per Request 모델Spring MVC는 요청을 처리할 때 blocking 방식으로 처리합니다. (DB I/O, HTTP req ex. RestTemplate)MVC 서버는 요청이 들어올 때 ThreadPool에서 Thread를 꺼내서 요청 하나에 할당합니다. (thread per request) 일반적인 경우에는 이러한 방식이 문제..

들어가며 교내 입학지원시스템인 Hello, GSM 서버 개발 중에 겪었던 문제점들 중 하나였던 싱글톤 빈 동시성 문제와 해결과 개선 방안에 대해 소개드리겠습니다. 간단하게 Hello, GSM 서비스에 대해 소개하자면, 광주소프트웨어마이스터고등학교 입학 원서를 제출, 합격자 관리, 합격자 조회 등등 여러 편리한 기능을 제공하는 서비스입니다. 성적 계산식 이슈 릴리즈를 2주 정도 남겨둔 상황에서 상당히 크리티컬한 이슈가 발생했습니다. 입학지원시스템에서 가장 중요하다고 할 수 있는 성적 계산식에서 발생한 문제였습니다. 비즈니스상 성적 환산점 만점은 300점이지만, 무슨 이유에서인지 300점을 초과하는 case가 발생했습니다. 하지만 400줄이 넘어가는 계산식 클래스와 비즈니스 요구사항이 덕지덕지 뭍어있는 ..

들어가며서버 애플리케이션의 규모가 커질 수록 트래픽이 많아지며 데이터베이스에 쓰기, 수정, 읽기 등등의 작업이 빈번하게 일어나게 됩니다. 이러한 상황에서 서비스에 예상치 못한 장애가 발생할 수 있습니다. 그렇기 때문에 높은 트래픽의 상황에 대비하여 시스템의 확장성, 고가용성, 성능을 높히기 위한 노력이 필요합니다. 데이터베이스의 성능 향상을 위한 기술은 파티셔닝, 샤딩, 레플리케이션에 대해 알아보겠습니다. 파티셔닝데이터베이스 파티셔닝은 데이터베이스의 테이블을 분활하여 저장하는 기술입니다. 데이터베이스에 데이터가 많이 저장되어있다면 그만큼 인덱스 자료구조의 크기가 큰 것이며 쓰기 작업시 B-Tree 재구조화 시간도 오래걸리는등 성능이 많이 떨어지게 됩니다.파티셔닝은 수직(Vertical) 파티셔닝, 수평(..

들어가며클라우드 인프라 기술이 대두되면서 유연한 확장과 안정성을 추구하는 많은 회사에서 MSA 아키텍처를 도입하게 되었습니다. (클라우드 인프라와 MSA) MSA 아키텍처를 도입한다면 기존 모놀리식 아키텍처 시스템의 한계를 극복할 수 있습니다. 여러 서비스 간의 장애 전파, 스케일 아웃, 확장의 어려움 등 여러 이점이 있습니다. 하지만 항상 MSA 아키텍처가 옳은 답은 아닙니다. 복잡한 구조로 유지보수가 힘들 수 있고 비용적인 부분도 무시할 수 없습니다. 이러한 MSA 구조에서 고민해야하는 부분 중 하나인 트랜잭션 작업의 원자성을 어떻게 지킬 수 있을지 알아보겠습니다. 모놀리식과 MSA의 트랜잭션 처리먼저 모놀리식과 MSA의 트랜잭션 처리에 대해 비교해보겠습니다. 설명을 위해 간단하게 토스 앱에서 돈을 ..

트랜잭션데이터베이스에서의 트랜잭션이란 데이터베이스에서 데이터의 상태를 변경하기 위해 수행하는 작업들의 논리적인 최소한의 단위입니다. 쉽게 말해 하나의 작업에 대해 한꺼번에 실행되어야 하는 일련의 작업들의 모음이라고 생각할 수 있습니다. 트랜잭션을 쉽게 설명하기 위한 좋은 예가 하나 있는데요, 바로 계좌이체입니다. 계좌이체라는 작업은 돈을 송금한 측의 계좌에서 돈을 차감, 송금 받을 측의 계좌에 돈을 추가해야합니다. 만약 계좌이체라는 작업 중에 송금 하는 측의 돈을 차감 후 송금 받는 측의 돈을 추가하려 할 때 오류가 발생해서 작업이 중지되었다면... 송금 하는 측의 돈만 차감되는 심각한 장애로 이어지게 됩니다. 이렇듯 계좌이체라는 작업은 돈의 차감, 추가라는 일련의 작업들이 마치 하나의 작업처럼 이루어져..

JPAJava Persistence API, JPA는 자바 진영의 ORM 표준 API(인터페이스) 입니다. RDB와 객체 간의 매핑을 지원해주는 ORM 기술의 자바 표준의 API로 대표적인 구현체로는 Hibernate입니다. ORMObject-Relational Mapping, ORM은 뜻 그대로 객체와 RDB 테이블을 매핑해주는 기술입니다. 덕분에 SQL 중심적으로 개발하는 방식에서 객체 중심적으로 개발을 할 수 있도록 패러다임 불일치를 해결해줍니다. JPA를 사용하는 이유JPA 기술을 사용한다면 직접 SQL문을 작성하지 않고 객체의 메서드로 DB를 조작할 수 있어 객체지향적으로 개발할 수 있습니다. DB의 종류를 변경해도 각 DB에 맞는 쿼리를 다시 짜야할 필요가 없는 장점이 있습니다. 반복적인 CR..

MSAMicroService Architecture, 마이크로서비스 아키텍처는 작고, 독립적인 각각의 서비스들이 모여 하나의 애플리케이션을 이루는 아키텍처를 의미합니다. 마이크로서비스 아키텍처는 모놀리식 아키텍처와 대비되는데요, 기존에 개발하던 애플리케이션 아키텍처 방식이 모놀리식이라고 볼 수 있습니다. 모놀리식 아키텍터와 MSA모놀리식 아키텍처전통적인 시스템 구조인 모놀리식 아키텍처 구조는 하나의 애플리케이션에 모든 비즈니스 서비스를 개발하는 방식입니다. 모놀리식 아키텍처 애플리케이션은 하나의 단일체로서 아무리 작은 변화가 발생해도 애플리케이션 전체를 빌드하고 배포해야합니다. 모놀리식 아키텍처는 소규모 프로젝트나 일반적인 프로젝트에서는 합리적인 선택입니다. 하지만 모놀리식 아키텍처는 대규모 서비스, ..