본문 바로가기
반응형

전체 글517

이벤트 소싱 이벤트 소싱(Event Sourcing) 은 데이터의 최종 상태를 저장하는 대신, 상태를 변경시킨 이벤트들의 이력을 저장하는 방식을 의미합니다. 예를 들어, 체스 프로그램을 개발할 때 체스판의 상태를 데이터베이스에 저장하는 방법은 크게 두 가지가 있습니다.첫 번째 방법은 체스판의 상태를 그대로 옮겨서 저장하는 방식입니다. 1a 컬럼에 검은색 폰을 나타내는 bp라는 값을 설정할 수 있습니다.두 번째 방법은 체스의 기보를 저장하는 방식입니다. '검은색 폰이 1a로 이동했다.'라는 이벤트를 기록합니다. 순서대로 쌓여있는 이벤트를 매 순간 재생(replay)하여 체스판의 최종 상태를 나타낼 수 있습니다.이때, 후자의 방식처럼 모든 상태 변경을 이벤트로 저장하는 방식을 이벤트 소싱이라고 합니다.장단점이벤트 소싱은.. 2025. 9. 17.
Statement 와 PreparedStatement 의 차이점 JDBC에서 Statement와 PreparedStatement는 모두 SQL 실행을 담당하지만, 사용 방식과 성능, 보안 측면에서 차이가 존재합니다.Statement 클래스는 문자열 연결을 이용해 SQL을 동적으로 구성해야 합니다. 이러한 특성으로 인해 SQL 인젝션 공격에 취약하다는 단점이 있습니다.Statement stmt = conn.createStatement();ResultSet rs = 30")" >stmt.executeQuery("select * from users where age > 30");반면, PreparedStatement는 동적으로 파라미터를 바인딩할 수 있는 기능을 제공합니다. 값을 바인딩하면 내부적으로 이스케이프 처리하기 때문에 SQL 인젝션 공격을 방지할 수 있습니다.S.. 2025. 9. 16.
NOT IN 쿼리를 사용할 때 발생할 수 있는 문제와 최적화 방법 아래와 같이 NOT IN을 사용한 쿼리는 직관적이고 사용하기 쉽지만, 대규모 데이터셋에서 심각한 성능 저하를 일으킬 수 있습니다.SELECT pFROM Post pWHERE p.id NOT IN :postIds문제점NOT IN은 부정 조건으로, 대부분의 DBMS에서 전체 테이블 스캔이나 인덱스 풀 스캔을 유발합니다. 전체 데이터나 테이블을 스캔한 후 조건에 맞지 않는 레코드를 필터링 해야하기 때문에 데이터베이스 옵티마이저가 효율적인 실행 계획을 세우기 어렵습니다.인덱스를 효과적으로 활용하지 못합니다. IN 절은 인덱스 Range Scan을 통해 빠르게 처리할 수 있지만, NOT IN은 인덱스 활용도가 현저히 떨어집니다.대량의 값을 IN 절에 넣으면 실행 계획 생성이 늘어나고, 파싱 및 최적화 단계에서 추.. 2025. 9. 15.
최종적 일관성 최종적 일관성(Eventual Consistency) 이란 분산 시스템에서 고가용성을 유지하기 위해서 사용하는 일관성 모델입니다. 데이터가 수정되면, 그 변경 내용은 비동기적으로 다른 노드에 전파되기 때문에 일시적으로 각 노드의 데이터가 다를 수 있습니다. 하지만 시간이 지나면 모든 노드에 변경 사항이 전달되어 결국에는 모든 노드가 동일한 데이터를 가지게 되는 것을 의미합니다.만약, 사용자가 특정 노드에 데이터를 수정하면 다른 노드에 변경 사항이 복제되는 상황을 가정하겠습니다.이미지 출처 : Google Cloud위 구성은 복제를 수행하고 있는 노드에 대해 조회 연산을 허용하여 높은 가용성을 유지할 수 있으며, 최종적으로는 모든 노드가 같은 데이터를 가지고 있는 최종적 일관성을 달성할 수 있습니다. 하지.. 2025. 9. 12.
SQL Injection (SQL 인젝션) SQL 인젝션(SQL Injection) 은 웹 애플리케이션에서 사용자의 입력값이 SQL 쿼리에 안전하게 처리되지 않을 때 발생하는 보안 취약점입니다. 공격자는 이 취약점을 이용해 쿼리를 조작하여 인증을 우회하거나, 데이터를 조작하거나, 테이블 자체를 삭제할 수도 있습니다.예를 들어, 로그인 검증 시 아래와 같은 코드를 사용한다고 가정해 보겠습니다.public boolean login(String username, String password) { String sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"; try (Connection conn = DriverMana.. 2025. 9. 11.
테스트 격리 테스트 격리(Test Isolation) 는 각 테스트가 서로 독립적으로 실행되도록 보장하는 것을 말합니다. 즉, 어떤 테스트가 실행되더라도 다른 테스트의 결과나 상태에 영향을 주거나 받지 않아야 한다는 의미입니다.테스트 격리가 중요한 이유는 격리가 제대로 이루어지지 않으면 비결정적 테스트가 발생할 수 있기 때문입니다. 비결정적(Non-deterministic) 테스트는 같은 테스트를 여러 번 실행했을 때 항상 같은 결과를 내지 않는 테스트를 말합니다. 예를 들어, 테스트가 데이터베이스와 같은 공유 자원에 의존할 경우 실행 순서나 다른 테스트의 실행 여부에 따라 성공 또는 실패 결과가 달라질 수 있습니다. 비결정적 테스트는 실패했을 때 실제 코드의 문제인지, 비결정적 요인 때문인지 판단하기 어려워집니다... 2025. 9. 10.
NoSQL 데이터베이스 유형 NoSQL 데이터베이스의 유형은 키-값, 문서 지향, 열 지향, 그래프, 시계열이 있습니다.키-값 데이터베이스(Key-value Database) 는 키를 고유한 식별자로 사용하는 키-값 쌍의 형태로 데이터를 저장합니다. 구조가 단순하고, 빠른 읽기 및 쓰기 성능을 제공합니다. Redis, Amazon DynamoDB가 대표적인 예시이고, 세션 저장, 캐시, 실시간 순위 등으로 사용할 수 있습니다.문서 지향 데이터베이스(Document-oriented Database) 는 JSON, BSON, XML 등의 형식으로 데이터를 저장합니다. 유연한 스키마를 가지고 있으며, 복잡한 데이터 구조를 쉽게 표현할 수 있습니다. MongoDB, CouchDB가 대표적인 예시이고, 콘텐츠 관리 시스템, 사용자 프로필 저.. 2025. 9. 9.
템플릿 메서드 패턴 템플릿 메서드 패턴(Template Method Pattern) 은 기능의 뼈대와 구현을 분리하는 행위 디자인 패턴입니다. 템플릿 메서드 패턴은 실행 단계의 절차를 결정하는 상위 클래스와 실행 단계를 구현하는 하위 클래스로 구성됩니다.public abstract class Student { public abstract void study(); public abstract void watchYoutube(); public abstract void sleep(); // 템플릿 메서드 final public void doDailyRoutine() { study(); watchYoutube(); sleep(); }}class BackendStudu.. 2025. 9. 8.
Spring 에서 객체를 Bean 으로 관리하는 이유 Bean으로 객체를 관리하는 이유는 애플리케이션의 설계, 확장성, 유지보수 측면에서 많은 이점을 제공하기 때문입니다.1. 의존성 관리 자동화빈으로 등록된 객체들은 Spring 컨테이너(BeanFactory, ApplicationContext)가 자동으로 의존성을 주입해줍니다. 개발자가 직접 객체를 생성하고 의존성을 연결할 필요가 없어집니다. 또 컨테이너가 빌드 시점에 순환 의존성을 감지하여 설계 오류를 조기에 발견할 수 있습니다.@Serviceclass OrderService( private val productRepository: ProductRepository, // 자동 주입 private val paymentGateway: PaymentGateway // 자동 주입)2. .. 2025. 9. 4.
728x90
반응형