방명록
- [ backend/데이터베이스 ][mysql] 언두 로그2025-03-26 12:10:07🔗 [mysql] InnoDB 스토리지 엔진 훑어보기MVCC는 Multi Version Concurrency Control의 약자로 멀티 버전에 대한 동시성을 제어한다. 멀티 버전은 하나의 레코드에 대해 여러 버전이 관리되는 것을 의미하며, 레코드 레벨 트랜잭션을 지원하는 DBMS에서 제공하는 기능이다. MySQL은 InnoDB의 언두 로그를 통해 MVCC를 구현한다. 언두 로그언두 로그의 역할을 알아보기 전에 데이터가 변경되었을 때 어떤 일이 일어나는지 그림과 함께 살펴보자. 디스크의 데이터가 버퍼 풀의 페이지에 로드되어 있다.UPDATE문을 수행하면 데이터 페이지가 새로운 값으로 갱신되며, 이전 값은 언두 로그로 복사된다.이처럼 언두 로그는 이전 버전의 데이터를 백업하여 트랜잭션 과 격리 수준을 보..NEW
- [ backend/데이터베이스 ][mysql] InnoDB 스토리지 엔진 훑어보기2025-03-25 22:00:45MySQL 서버는 사람의 머리 역할인 MySQL 엔진과 손발 역할의 스토리지 엔진으로 구분된다.MySQL 엔진 : 클라이언트의 접속과 요청을 처리하고, 파서와 전처리기, 옵티마이저로 SQL 실행을 최적화한다스토리지 엔진 : 데이터를 디스크에 저장하고, 디스크로부터 데이터를 조회한다InnoDB는 스토리지 엔진의 구현체 중 하나로, 가장 많이 사용되는 스토리지 엔진이다.InnoDB 아키텍처지금부터 InnoDB의 주요 구성요소에 대해 알아보자. 버퍼 풀은 InnoDB의 가장 핵심적인 부분으로, 일종의 메모리다.디스크의 데이터를 메모리에 캐싱한다.쓰기 작업을 지연시켜 추후 일괄 처리한다.캐싱과 쓰기 지연을 통해 불필요한 디스크 IO를 줄이고 빠르게 응답한다.버퍼 풀은 메모리를 페이지 단위로 작게 쪼개어 관리한다..NEW
- [ backend/테스트 ][spring] BDD 스타일로 테스트 코드 작성하기2025-03-09 23:45:00테스트 코드를 작성해본 사람이라면 given-when-then에 대해 들어봤을 것이다. 이는 테스트 코드를 작성하는 대표적인 스타일 중 하나다.given : 초기 상태나 특정 입력이 주어진 상황(= 조건) 설정when : 테스트 대상이 되는 행동then : 예상되는 결과 검증given:사용자가 로그인했다.when:사용자가 상품을 장바구니에 추가한다.then: 장바구니에 상품이 있어야 한다.given-when-then 패턴은 BDD에서 자주 사용되는데 지금부터 BDD에 대해 알아보자. BDD; Behavior-Driven DevelopmentBDD는 Behavior-driven development의 약자로, 소프트웨어의 동작을 중심으로 개발하는 방법론이다.시스템이 어떻게 동작해야 하는지 명확하게 정..NEW
- [ backend/테스트 ][spring] @DataJpaTest 대신 @SpringBootTest를 사용해야 하는 이유 (feat. 테스트 컨텍스트)2025-03-09 18:30:49@DataJpaTest를 사용하는 이유`@DataJpaTest`는 JPA 컴포넌트를 위한 테스트 어노테이션으로, 레포지토리와 엔티티처럼 JPA와 관련된 빈만 로드한다. 기본적으로 인메모리 임베디드 데이터베이스를 사용하며, `@Entity` 클래스를 스캔하고 레포지토리를 구성한다. 각 테스트 메서드는 트랜잭션으로 처리되며, 테스트가 끝난 후에는 자동으로 롤백된다. 이를 통해 테스트 데이터가 데이터베이스에 남지 않고, 데이터 정합성을 유지할 수 있다. 그럼에도 불구하고 @DataJpaTest 대신 @SpringBootTest를 사용해야 하는 이유앞에서 살펴봤듯이 `@DataJpaTest`를 사용하면 JPA 관련 컴포넌트만 로드하기 때문에 전체 어플리케이션을 로드하는 불필요한 오버헤드를 줄일 수 있다. 하지..NEW
- [ backend ][etc] Spring REST Docs와 Swagger UI를 사용한 API 문서화2025-01-17 15:20:49프론트엔드(클라이언트)와 백엔드 사이 원활한 협업을 위해서는 API가 필수적으로 작성되어야 한다. 이때 중요한 역할을 하는 것이 바로 OpenAPI, Swagger, Spring REST Docs다.OpenAPI : API를 정의하기 위한 표준 형식 (주로 JSON과 YAML 형식으로 작성)Swagger : OpenAPI 스펙을 기반으로 API 문서를 시각화하는 도구Spring REST Docs : 스프링에서 제공하는 API 문서화 도구Swagger vs. Spring REST Docs스웨거는 컨트롤러에 몇 가지 어노테이션만 달아주면 API 문서를 자동으로 만들어준다. 문서화가 간편하다는 장점도 있지만 단점도 가진다.스웨거 어노테이션과 비즈니스 로직이 섞인다 (침투적)테스트가 없어 문서의 신뢰성이 낮다 ..NEW
- [ backend/프레임워크 ][spring] 웹 어플리케이션 기능 확장하기 (WebMvcConfigurer)2025-01-05 18:00:29스프링 부트 프레임워크는 프로젝트 설정 과정을 간소화하여 어플리케이션을 빠르게 개발하도록 돕는다. 하지만 프로젝트 목적에 따라 스프링 부트 기본 설정을 변경해야 하는 경우가 있다. 다행히 스프링 웹 MVC 프레임워크는 기존 기능을 확장하거나 교체하는 다양한 방법을 제공한다. 웹 어플리케이션을 설정하는 방법은 크게 세 가지가 있다.`WebMvcConfigurer` 인터페이스를 사용하여 필요한 기능들을 추가하거나(add) 교체한다(configure)`@Primary` 어노테이션을 사용하여 기본으로 만들어지는 빈을 재설정한다웹 MVC 프레임워크에서 정의한 스프링 빈 이름과 타입으로 빈을 직접 생성한다 (스프링은 이미 이름과 타입이 일치한 스프링 빈이 있다면 새롭게 만들지 않기 때문이다!)여기서는 `WebMvc..NEW
- [ backend/프레임워크 ][spring] 스프링 부트 시작하기 (스프링/스프링 부트/@SpringBootApplication/ApplicationContext)2024-12-19 20:00:54프레임워크는 목적에 맞는 일반적인 기능을 제공한다. 예를 들어 웹 어플리케이션 프레임워크는 HTTP 기반의 요청과 응답을 처리할 수 있도록 객체나 클래스를 제공한다. 이처럼 프레임워크에서 일반적인 기능과 비기능적인 로직을 제공함으로써 개발자는 비즈니스 로직에 집중할 수 있다. EJB vs. 스프링스프링 프레임워크 이전에는 EJB(Enterprise JavaBeans)를 사용했다. EJB를 사용하기 위해서는 인터페이스를 구현하고 클래스를 상속 받아 부모 클래스를 오버라이드 해야 했다. 즉, EJB 프레임워크의 메서드가 비즈니스 로직에 침투되고, (invasive) 프레임워크와 개발자의 코드가 강하게 결합된다. 스프링은 개발하기 복잡하고 어려운 EJB를 대체하기 위해 등장했다. 스프링을 사용하면 더 이상 특..NEW
- [ backend/프레임워크 ][spring] JPA/Hibernate, Spring Data JPA, 영속성 컨텍스트2024-12-16 15:00:51JPA/HibernateJPA는 Java Persistence API로, 자바 어플리케이션이 데이터를 영속할 수 있도록 API를 제공한다. JPA는 ORM 표준 스펙이므로 실제로 동작하기 위해서는 구현체가 필요한데 Hibernate가 대표적인 JPA 구현 프레임워크다. 모든 자바 어플리케이션은 데이터베이스에 데이터를 저장하기 위해 JDBC API를 사용한다. JDBC는 Java Database Connectivity의 약어로, 자바의 데이터 접근 표준이다. Hibernate 같은 프레임워크를 이용하면 내부에서 JDBC를 사용하여 데이터를 처리한다.# JPA/Hibernate 관련 설정spring: jpa: show-sql: false # (default=false) JPA/Hibernate가 생성..NEW