- [ 학습기록/CS 공부 ][네트워크] NAT, 부족한 IPv4 주소를 계속 사용할 수 있는 이유2025-03-30 22:20:26컴퓨터나 네트워크를 공부하다 보면 IPv4 주소가 부족하다는 이야기를 자주 듣게 된다. IPv4는 약 42억 개의 주소를 제공하지만, 이는 전 세계 모든 사람이 네트워크 장치를 하나씩만 사용해도 부족한 수다. 노트북, 태블릿, 휴대폰 등 인당 여러 네트워크 기기를 사용하는 상황에서도 우리는 여전히 IPv4를 이용하고 있다. NAT; Network Address TranslationNAT은 부족한 IP 주소 문제를 해결하기 위해 하나의 IP 주소를 여러 장치가 사용할 수 있는 기술을 제공한다. NAT은 공인 IP 주소와 사설 IP 주소를 변환한다.외부 → 내부 : 외부에서 들어오는 패킷의 목적지 IP 주소를 사설 IP 주소로 변경한다.내부 → 외부 : 외부로 나가는 패킷의 출발지 IP 주소를 공인 IP 주..
- [ backend/데이터베이스 ][mysql] 언두 로그와 MVCC2025-03-28 23:20:18버퍼 풀은 디스크 데이터를 캐싱한다. 버퍼 풀에 로드된 레코드를 UPDATE나 DELETE로 수정하면, 데이터 페이지가 새로운 값으로 갱신되고 이전 값은 언두 로그에 백업된다. 페이지와 언두 로그에 같은 레코드에 대해 서로 다른 값이 존재하게 되는데, 이를 멀티 버전이라 한다.InnoDB는 언두 로그를 통해 트랜잭션 롤백 시 이전 상태로 되돌릴 수 있다. 하지만 격리 수준에 따라 적절한 버전을 반환하여 동시성을 제어하는 것도 가능하다. 지금부터 언두 로그가 어떻게 격리 수준을 보장하는지 알아보자. READ UNCOMMITTED가장 낮은 격리 수준으로, 트랜잭션의 커밋 여부와 상관없이 다른 트랜잭션이 수정중인 레코드를 볼 수 있다. 즉, 언두 로그의 백업된 데이터가 아니라 페이지의 최신 데이터를 본다.이처..
- [ backend/데이터베이스 ][mysql] 언두 로그2025-03-26 12:10:07🔗 [mysql] InnoDB 스토리지 엔진 훑어보기MVCC는 Multi Version Concurrency Control의 약자로 멀티 버전에 대한 동시성을 제어한다. 멀티 버전은 하나의 레코드에 대해 여러 버전이 관리되는 것을 의미하며, 레코드 레벨 트랜잭션을 지원하는 DBMS에서 제공하는 기능이다. MySQL은 InnoDB의 언두 로그를 통해 MVCC를 구현한다. 언두 로그언두 로그의 역할을 알아보기 전에 데이터가 변경되었을 때 어떤 일이 일어나는지 그림과 함께 살펴보자. 디스크의 데이터가 버퍼 풀의 페이지에 로드되어 있다.UPDATE문을 수행하면 데이터 페이지가 새로운 값으로 갱신되며, 이전 값은 언두 로그로 복사된다.이처럼 언두 로그는 이전 버전의 데이터를 백업하여 트랜잭션 과 격리 수준을 보..
- [ backend/데이터베이스 ][mysql] InnoDB 스토리지 엔진 훑어보기2025-03-25 22:00:45MySQL 서버는 사람의 머리 역할인 MySQL 엔진과 손발 역할의 스토리지 엔진으로 구분된다.MySQL 엔진 : 클라이언트의 접속과 요청을 처리하고, 파서와 전처리기, 옵티마이저로 SQL 실행을 최적화한다스토리지 엔진 : 데이터를 디스크에 저장하고, 디스크로부터 데이터를 조회한다InnoDB는 스토리지 엔진의 구현체 중 하나로, 가장 많이 사용되는 스토리지 엔진이다.InnoDB 아키텍처지금부터 InnoDB의 주요 구성요소에 대해 알아보자. 버퍼 풀은 InnoDB의 가장 핵심적인 부분으로, 일종의 메모리다.디스크의 데이터를 메모리에 캐싱한다.쓰기 작업을 지연시켜 추후 일괄 처리한다.캐싱과 쓰기 지연을 통해 불필요한 디스크 IO를 줄이고 빠르게 응답한다.버퍼 풀은 메모리를 페이지 단위로 작게 쪼개어 관리한다..
- [ 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의 약자로, 소프트웨어의 동작을 중심으로 개발하는 방법론이다.시스템이 어떻게 동작해야 하는지 명확하게 정..
- [ backend/테스트 ][spring] @DataJpaTest 대신 @SpringBootTest를 사용해야 하는 이유 (feat. 테스트 컨텍스트)2025-03-09 18:30:49@DataJpaTest를 사용하는 이유`@DataJpaTest`는 JPA 컴포넌트를 위한 테스트 어노테이션으로, 레포지토리와 엔티티처럼 JPA와 관련된 빈만 로드한다. 기본적으로 인메모리 임베디드 데이터베이스를 사용하며, `@Entity` 클래스를 스캔하고 레포지토리를 구성한다. 각 테스트 메서드는 트랜잭션으로 처리되며, 테스트가 끝난 후에는 자동으로 롤백된다. 이를 통해 테스트 데이터가 데이터베이스에 남지 않고, 데이터 정합성을 유지할 수 있다. 그럼에도 불구하고 @DataJpaTest 대신 @SpringBootTest를 사용해야 하는 이유앞에서 살펴봤듯이 `@DataJpaTest`를 사용하면 JPA 관련 컴포넌트만 로드하기 때문에 전체 어플리케이션을 로드하는 불필요한 오버헤드를 줄일 수 있다. 하지..
- [ 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 문서를 자동으로 만들어준다. 문서화가 간편하다는 장점도 있지만 단점도 가진다.스웨거 어노테이션과 비즈니스 로직이 섞인다 (침투적)테스트가 없어 문서의 신뢰성이 낮다 ..
- [ backend/프레임워크 ][spring] 웹 어플리케이션 기능 확장하기 (WebMvcConfigurer)2025-01-05 18:00:29스프링 부트 프레임워크는 프로젝트 설정 과정을 간소화하여 어플리케이션을 빠르게 개발하도록 돕는다. 하지만 프로젝트 목적에 따라 스프링 부트 기본 설정을 변경해야 하는 경우가 있다. 다행히 스프링 웹 MVC 프레임워크는 기존 기능을 확장하거나 교체하는 다양한 방법을 제공한다. 웹 어플리케이션을 설정하는 방법은 크게 세 가지가 있다.`WebMvcConfigurer` 인터페이스를 사용하여 필요한 기능들을 추가하거나(add) 교체한다(configure)`@Primary` 어노테이션을 사용하여 기본으로 만들어지는 빈을 재설정한다웹 MVC 프레임워크에서 정의한 스프링 빈 이름과 타입으로 빈을 직접 생성한다 (스프링은 이미 이름과 타입이 일치한 스프링 빈이 있다면 새롭게 만들지 않기 때문이다!)여기서는 `WebMvc..