Back-end

· Back-end
들어가며Kafka와 같은 큐 서비스를 사용할 때 메시지가 유실되거나 중복처리될 수 있는 상황이 있습니다.어떤 구간에서 발생하고 어떻게 대처할 수 있는지 알아보겠습니다. 메시지 전달 보증 수준일반적인 큐 서비스에서 메시지 전달 보증 수준은 아래와 같습니다.At Most once: 1회 전송을 시도. 메시지가 중복되지 않지만 유실될 가능성 있음.At Least once: 최소 1회 전송. 메시지가 절대 유실되지 않지만 중복 처리될 수 있음.Exactly once: 1회만 전송. 메시지가 절대 유실되지 않으며 컨슈머에서 중복처리 하지 않음.Kafka의 특징 중 하나가 Exactly-once를 보장할 수 있는 것입니다. (3.0 버전 이후로 Default 설정이 At Least once에서 Exactly onc..
· Back-end
들어가며동시성 문제는 서버 애플리케이션을 개발 할 때 항상 고민해야하는 문제입니다. 공유 자원을 여러 스레드가 접근하려할 때 경쟁상태가 발생하여 lost update와 같은 이상 현상이 발생할 수 있습니다. 이러한 동시성 처리를 위해 데이터베이스 Lock을 사용할 수 있습니다. Spring Data Jpa를 사용한다면 어노테이션으로 간단하게 낙관적 락, 비관적 락을 손쉽게 적용하여 동시성 처리를 할 수 있습니다. @Transaction 어노테이션 속성으로 isolation 단계를 SELIALIZATION으로 설정하여 데이터 정합성을 보장할 수도 있습니다. 추가로 자바 문법에서 지원하는 메서드에 synchronized 키워드를 붙혀 내부적으로 모니터락을 사용하여 동시성 처리를 할 수 있지만, scale-o..
· Back-end
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) 일반적인 경우에는 이러한 방식이 문제..
· Back-end
들어가며 교내 입학지원시스템인 Hello, GSM 서버 개발 중에 겪었던 문제점들 중 하나였던 싱글톤 빈 동시성 문제와 해결과 개선 방안에 대해 소개드리겠습니다. 간단하게 Hello, GSM 서비스에 대해 소개하자면, 광주소프트웨어마이스터고등학교 입학 원서를 제출, 합격자 관리, 합격자 조회 등등 여러 편리한 기능을 제공하는 서비스입니다.  성적 계산식 이슈 릴리즈를 2주 정도 남겨둔 상황에서 상당히 크리티컬한 이슈가 발생했습니다. 입학지원시스템에서 가장 중요하다고 할 수 있는 성적 계산식에서 발생한 문제였습니다. 비즈니스상 성적 환산점 만점은 300점이지만, 무슨 이유에서인지 300점을 초과하는 case가 발생했습니다. 하지만 400줄이 넘어가는 계산식 클래스와 비즈니스 요구사항이 덕지덕지 뭍어있는 ..
· Back-end
들어가며서버 애플리케이션의 규모가 커질 수록 트래픽이 많아지며 데이터베이스에 쓰기, 수정, 읽기 등등의 작업이 빈번하게 일어나게 됩니다. 이러한 상황에서 서비스에 예상치 못한 장애가 발생할 수 있습니다. 그렇기 때문에 높은 트래픽의 상황에 대비하여 시스템의 확장성, 고가용성, 성능을 높히기 위한 노력이 필요합니다. 데이터베이스의 성능 향상을 위한 기술은 파티셔닝, 샤딩, 레플리케이션에 대해 알아보겠습니다. 파티셔닝데이터베이스 파티셔닝은 데이터베이스의 테이블을 분활하여 저장하는 기술입니다. 데이터베이스에 데이터가 많이 저장되어있다면 그만큼 인덱스 자료구조의 크기가 큰 것이며 쓰기 작업시 B-Tree 재구조화 시간도 오래걸리는등 성능이 많이 떨어지게 됩니다.파티셔닝은 수직(Vertical) 파티셔닝, 수평(..
· Back-end
들어가며클라우드 인프라 기술이 대두되면서 유연한 확장과 안정성을 추구하는 많은 회사에서 MSA 아키텍처를 도입하게 되었습니다. (클라우드 인프라와 MSA) MSA 아키텍처를 도입한다면 기존 모놀리식 아키텍처 시스템의 한계를 극복할 수 있습니다. 여러 서비스 간의 장애 전파, 스케일 아웃, 확장의 어려움 등 여러 이점이 있습니다. 하지만 항상 MSA 아키텍처가 옳은 답은 아닙니다. 복잡한 구조로 유지보수가 힘들 수 있고 비용적인 부분도 무시할 수 없습니다. 이러한 MSA 구조에서 고민해야하는 부분 중 하나인 트랜잭션 작업의 원자성을 어떻게 지킬 수 있을지 알아보겠습니다. 모놀리식과 MSA의 트랜잭션 처리먼저 모놀리식과 MSA의 트랜잭션 처리에 대해 비교해보겠습니다. 설명을 위해 간단하게 토스 앱에서 돈을 ..
· Back-end
트랜잭션데이터베이스에서의 트랜잭션이란 데이터베이스에서 데이터의 상태를 변경하기 위해 수행하는 작업들의 논리적인 최소한의 단위입니다. 쉽게 말해 하나의 작업에 대해 한꺼번에 실행되어야 하는 일련의 작업들의 모음이라고 생각할 수 있습니다. 트랜잭션을 쉽게 설명하기 위한 좋은 예가 하나 있는데요, 바로 계좌이체입니다. 계좌이체라는 작업은 돈을 송금한 측의 계좌에서 돈을 차감, 송금 받을 측의 계좌에 돈을 추가해야합니다. 만약 계좌이체라는 작업 중에 송금 하는 측의 돈을 차감 후 송금 받는 측의 돈을 추가하려 할 때 오류가 발생해서 작업이 중지되었다면... 송금 하는 측의 돈만 차감되는 심각한 장애로 이어지게 됩니다. 이렇듯 계좌이체라는 작업은 돈의 차감, 추가라는 일련의 작업들이 마치 하나의 작업처럼 이루어져..
· Back-end
JPAJava Persistence API, JPA는 자바 진영의 ORM 표준 API(인터페이스) 입니다. RDB와 객체 간의 매핑을 지원해주는 ORM 기술의 자바 표준의 API로 대표적인 구현체로는 Hibernate입니다. ORMObject-Relational Mapping, ORM은 뜻 그대로 객체와 RDB 테이블을 매핑해주는 기술입니다. 덕분에 SQL 중심적으로 개발하는 방식에서 객체 중심적으로 개발을 할 수 있도록 패러다임 불일치를 해결해줍니다. JPA를 사용하는 이유JPA 기술을 사용한다면 직접 SQL문을 작성하지 않고 객체의 메서드로 DB를 조작할 수 있어 객체지향적으로 개발할 수 있습니다. DB의 종류를 변경해도 각 DB에 맞는 쿼리를 다시 짜야할 필요가 없는 장점이 있습니다. 반복적인 CR..
신희성
'Back-end' 카테고리의 글 목록