Programming/SpringBoot

낙관적 락이란?"충돌은 잘 안 날거야" 라고 낙관적으로 가정하고 실제로 충돌이 발생하면 그때 처리하는 동시성 제어 방식을 말한다.작동 방식데이터를 읽을 때 버전 번호(@Version)를 함께 읽음데이터를 수정한 뒤, 업데이트 시점에 버전 번호를 비교DB에 있는 버전 번호랑 다르면 실패(다른 누군가가 먼저 수정했음을 의미)충돌 시ObjectOptimisticLockingFailureException 예외가 발생한다.재시도하거나 사용자에게 충돌 메시지를 보여주는 등 예외 처리가 필요하다.장점성능적으로 유리DB에 직접 락을 걸지 않기 때문에 비관적 락보다 성능상 이점이 존재한다.데드락 X마찬가지로 DB에 직접 락을 걸지 않기 때문에 데드락이 발생하지 않는다.분산 환경에 적용 가능JVM 수준이 아닌 DB 수준에..
동시성 제어란?여러 프로세스나 스레드가 동시에 같은 자원(데이터나 상태)에 접근할 때, 무결성과 일관성을 보장하기 위한 기법왜 필요할까?동시에 여러 사용자가 같은 데이터를 수정하면 문제가 발생할 수 있다.아래 재고 감소 예시를 통해 살펴볼 수 있다. 사용자 A가 상품을 구매하려고 조회하니 1개의 재고가 남아 있다.동시에 사용자 B가 조회하니 1개의 재고가 남아 있다.사용자 A는 구매 가능 상태이므로 물품을 구매하고 재고를 0으로 업데이트한다.사용자 B 또한 구매 가능 상태이므로 물품을 구매한다.Synchronized란?synchronized는 JVM 수준에서 제공되는 모니터 락(Monitor Lock)을 기반으로 작동한다.Monitor란?모든 객체(Object)는 모니터를 가지고 있음synchronize..
AMQP란?AMQP(Advanced Message Queuing Protocol)는 메시지 지향 미들웨어에서 사용되는 개방형 표준 프로토콜입니다.이 프로토콜은 애플리케이션 간에 메시지를 안정적이고 효율적으로 전달하기 위한 규격을 제공합니다. AMQP는 메시징 큐를 중심으로 애플리케이션 간의 비동기식 통신을 가능하게 하여, 분산 시스템 간의 상호작용을 원활하게 만들어 줍니다.AMQP의 동작Producer(생산자)메시지를 생성하고, 이를 큐에 전송하는 역할생산자는 일반적으로 다른 시스템이나 애플리케이션으로부터 데이터를 받아 메시지 형식으로 변환하여 큐로 전송Consumer(소비자)큐에 저장된 메시지를 읽어 처리하는 역할Queue(큐)Consumer가 메시지를 Consume 하기 전까지 보관하는 장소Excha..
멀티 테넌트멀티 테넌트 아키텍처는 하나의 애플리케이션 인프라에서 여러 개의 고객(테넌트)이 서비스를 공유하도록 하는 시스템을 의미합니다. 각 테넌트는 동일한 애플리케이션과 데이터베이스 인프라를 사용하지만, 데이터와 사용자 경험은 서로 독립적이어서 다른 테넌트와는 철저히 분리됩니다. 멀티 테넌트 환경에서 데이터베이스를 관리하는 여러 방식 중, 하나의 데이터베이스에 여러 스키마를 사용하는 방법을 살펴보겠습니다.데이터베이스 구조이 예제에서는 test1, test2 등의 구조를 사용하며, 각 테넌트는 하나의 스키마와 연관되어 있습니다. 사용자가 데이터를 조회할 때, 해당 사용자가 속한 테넌트(스키마)를 파악한 후, 해당 스키마에서 데이터를 조회하게 됩니다.MyBatis에서는 스키마명을 파라미터로 직접 전달하여 ..
@ModelAttribute란?클라이언트가 보내는 HTTP 파라미터들을 Java 객체에 바인딩하는데 사용합니다./me?name=woong&age=26 같은 QueryString 형태 혹은 요청 본문에 삽입되어 있는 Form 형태의 데이터를 처리합니다.주요 Flow1. 요청 수신DispatcherServlet : 모든 HTTP 요청은 DispatcherServlet에 의해 수신됩니다. 이 서블릿은 프론트 컨트롤러로서 요청을 적절한 핸들러(Controller)로 라우팅합니다.2. 핸들러 매핑HandlerMapping : DispatcherServlet은 요청 URL을 기반으로 적절한 핸들러를 찾기 위해 여러 HandlerMapping 구현체를 확인합니다. 예를 들어, RequestMappingHandlerM..
Entity Convention@Entity@Comment("상품 카테고리 정보")@Getter@ToString@NoArgsConstructor(access = AccessLevel.PROTECTED)@SQLRestriction("use_flag = 'Y'")public class ProductCategory extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Comment("상품 카테고리 정보 IDX") private Long productCategoryId; @Column(nullable = false, length = 100) @Comment("카테고리명") private S..
포테이토웅
'Programming/SpringBoot' 카테고리의 글 목록 (2 Page)