본문 바로가기

분류 전체보기277

🙊 Fixture Monkey 도입 🙊 Fixture Monkey 도입 이유객체 생성객체가 가지고 있는 데이터 항목이 많아 객체 생성 비용이 크다.비즈니스 요구사항이 변경될 때 객체를 변경하고 테스트를 수정해야 할 수 있다.엣지 케이스 발견엣지 케이스를 직접 찾아야 하고 동일한 테스트를 여러번 작성해야한다🤔 Fixture Monkey가 뭔디https://naver.github.io/fixture-monkey/v1-0-0/Fixture Monkey는 테스트를 위한 객체 생성을 자동화해주는 Jqwik 기반 PBT 라이브러리입니다.🤔 Property-based Testing (PBT)는 뭘까?Property-based Testing은 테스트 케이스를 일일이 작성하는 대신, 프로그램이 랜덤 속성(property)을 만들어주고 테스트하는 방식.. 2024. 12. 19.
Gighub Action , Docker Compose, Nginx, code deploy 무중단 배포 무중단 배포1. rolling update 배포새로 배포되어야 하는 버전을 하나씩 순차적으로 적용시키면서 배포하는 방식입니다. 한 번에 모두 배포되는 게 아니기 때문에 배포가 되는 과정에서 옛날 버전과 새로운 버전이 공존합니다. 그렇기 때문에 잘못하면 배포하는 과정 중에 호환성 문제가 생길 수 있습니다2. Blue,Green 배포예시를 들자면 이전의 8080포트를 쓰고 있는 컨테이너가 있습니다. 새로운 컨테이너를 새로운 포트(8081)로 올립니다. 다 올려졌다면 nginx는 새로운 컨테이너 포트로 연결하고 이전 컨테이너는 내립니다.3. 카나리 배포적은 사용자에게 먼저 배포 후 A/B 테스트. 현재 단계에서는 고려하지 않겠습니다.rolling update는 인스턴스를 두 대 이상 사용하여 비용 문제가 발생.. 2024. 12. 18.
Gighub Actions,docker 배포(Linux Ec2) GitHub ActionsGitHub Actions는 일반적으로 CI(Continuous Integration, 지속 통합) 또는 CD(Continuous Deployment, 지속 배포)와 같은 자동화를 위해서 사용됩니다. 운영환경에 소스코드를 머지하기 위해 반복적으로 처리되야 할 일들들을 처리해줍니다. 즉, CI/CD를 위한 파이프라인입니다. CD ( Code Deploy)Source Code를 운영환경에 자동 배포하는 역할을 수행하는 행위(지속적 자동 배포) 전체적인 플로우1. Github Action에서 소스코드를 빌드한다.2. Github Action에서 빌드한 소스코드를 이미지로 빌드한다.3. Github Action에서 빌드한 이미지를 Docker 레퍼지토리에 넣는다.4. Github Act.. 2024. 12. 18.
데이터베이스 시스템에서 동시성을 제어하는 방법? 대표적인 동시성 제어 방식으로 MVCC(Multi-Version Concurrency Control) 와 Lock-Based Concurrency Control이 있습니다.1. MVCC(Multi-Version Concurrency Control/ 잠금 없는 읽기)MVCC는 데이터의 여러 버전을 유지하여 트랜잭션이 동시에 데이터를 읽고 쓸 수 있도록 하는 방식입니다. 각 트랜잭션은 자신만의 일관된 스냅샷(MySQL::언두 로그)을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항에 영향을 받지 않습니다.데이터의 각 버전을 유지하여 읽기 작업이 쓰기 작업과 독립적으로 이루어질 수 있습니다. 트랜잭션은 시작 시점의 스냅샷을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항을 보지 못합니다.또한 읽기 작업.. 2024. 12. 18.
[쿼리문 개선] 댓글/대댓글 조회 dto로 받기 && 반복 루프로 인한 추가 쿼리 호출 문제 해결 기존코드PostCommentGetService@Service@RequiredArgsConstructorpublic class PostCommentGetService { private final PostCommentRepositoryCustom postCommentRepositoryCustom; @Transactional public List getPostComment(long postId) { List postCommentList = postCommentRepositoryCustom.findByPostId(postId); List responseList = new ArrayList(); Map responseHashMap = new HashMap();.. 2024. 12. 18.
DB ↔ ENUM 컨버터, 상하위 ENUM으로 명함 도메인 최적화 1. 기존 설계의 한계관심사는 별도의 테이블에서 관리되고 있었습니다. 이를 명함 데이터와 연결하기 위해 관심사 테이블과 명함-관심사 매핑 테이블이 필요했습니다interest 테이블: 관심사 데이터를 저장.id_card_interest_mapping 테이블: 명함(id_card)과 관심사(interest)를 연결.데이터 예시:interest 테이블:idname1GAME2MOVIE3DRAMAid_card_interest 테이블:id_card_idinterest_id101110121021문제점id_card테이블에 관심사를 담지 않고 id_card_interest 테이블에 별도로 저장함에 따라 한 개의 idCard가 여러 행을 차지하기 때문에 데이터 공간 낭비라고 생각하였습니다명함 조회 시, 관심사 테이블과 매.. 2024. 12. 18.
사용자가 웹사이트에 처음 접근했을 때 발생하는 일련의 과정 예를들어 사용자가 www.google.com을 입력하면, 브라우저는 HTTP 프로토콜을 사용해 구글 웹 서버와 통신하려고 합니다. HTTP는 OSI 7계층 중 애플리케이션 계층에서 동작하는 프로토콜입니다.이때 브라우저는 요청한 도메인 이름(www.google.com)에 대한 IP 주소를 알아야 하기 때문에 DNS(Domain Name System) 서버에 질의합니다. 이 질의 과정 또한 애플리케이션 계층에서 이루어지며, DNS 서버는 해당 도메인에 대한 IP 주소(예를 들어, 142.250.190.78)를 응답합니다.IP 주소를 얻은 후, 브라우저는 구글 서버와 통신을 시작합니다. HTTP는 TCP/IP를 기반으로 작동하므로, 데이터를 주고받기 전에 TCP 3-Way Handshake 과정이 필요합니다... 2024. 12. 16.
@Transactional 어노테이션에 대한 작동방식 1. @Transactional이란@Transactional은 Spring에서 제공하는 선언적 트랜잭션 관리 방식입니다. 이 어노테이션 하나로 다음과 같은 복잡한 트랜잭션 처리 코드들을 자동으로 처리할 수 있습니다:데이터베이스 커넥션 획득트랜잭션 시작 (setAutoCommit(false)) (비즈니스 로직 실행)정상 완료시 커밋 또는 예외 발생시 롤백커넥션 반환2. @Transactional 동작 원리@Transactional의 동작은 Spring AOP를 기반으로 합니다.프록시 객체는 다음과 같은 트랜잭션 관련 코드를 자동으로 삽입합니다:1) 메서드 호출 전데이터베이스 연결 (Connection 객체 생성).트랜잭션 시작 (setAutoCommit(false)).트랜잭션 동기화 (현재 트랜잭션 정보.. 2024. 12. 16.
private 메소드는 어떻게 테스트 할까(feat 객체 분리) 상위 public 메소드로 하위 private 메소드를 테스트 할 때 문제점extractNumbers메소드에서 호출되는 메소드들은 다 private 메소드들입니다. 각 기능들을 테스트 하기 위해 extractNumbers메소드를 호출하여 결과중심의 테스트로 private 메소드들을 테스트하였습니다. 문제점은 테스트에 실패했을 때 어느 메소드에서 실패했는지 모르는 것입니다. 유지보수를 위해 잘게 메소드로 나누었지만, 어느 메소드가 잘못됐는지 알지 못하는 모순되는 상황에 봉착 했습니다.```java// private 메소드 양만 봐도 어지럽습니다..public class StringParser { private static final String BLANK = ""; private static f.. 2024. 12. 13.