전체 글 318

[Git] Git 워크플로우 비교: GitHub Flow, Gitflow, GitLab Flow

GitHub FlowGitHub Flow는 깃허브에서 만든 단순한 구조의 브랜치 전략이다. 작은 팀과 빈번한 업데이트가 필요한 프로젝트에 이상적이다.브랜치Main, Feature, Bugfix 브랜치로 이루어진다.모든 브랜치는 Main으로부터 나온다.Main으로부터 기능추가, 버그 수정 작업을 위한 새로운 브랜치를 생성한다.기능 개발, 버그 수정기능별로 커밋한다.커밋 메시지와 브랜치 이름은 정확하고 간결하게 작성한다.커밋은 서버의 동일한 브랜치에 병합한다. (Git flow와 차이점)리뷰 및 병합GitHub Actions와 같은 CI/CD 도구를 사용하여, 풀 리퀘스트가 생성되면 자동으로 테스트를 실행할 수 있다. 이렇게 하면 코드가 main 브랜치에 병합되기 전에 기능 브랜치에서 모든 테스트가 통과했는..

DevOps 2024.07.30

[React] 리덕스 미들웨어

리듀서 함수 몸통에서는 사이드 이펙트를 일으키는 코드를 사용할 수 없다. 그런데 이 점은 리덕스 기능을 사용하는 컴포넌트를 복잡하게 만든다. 리덕스 미들웨어는 리듀서 앞 단에서 부작용이 있는 코드들을 실행하여 얻은 결과를 리듀서 쪽으로 넘겨주는 역할을 한다.dispatch(액션) -> 미들웨어 -> 리듀서 -> 리덕스 저장소 리덕스 미들웨어 타입// 리덕스 미들웨어 타입interface Middleware { (api: MiddlewareAPI): (next: (action: unknown) => unknown) => (action: unknown) => unknown;}// 리덕스 미들웨어 API 타입interface MiddlewareAPI { dispatch: D; getState(..

Javascript/React 2024.07.29

[JVM] MockServer

MockServer는 Java 애플리케이션에서 HTTP 서버를 모킹(Mocking)할 수 있는 도구이다. 이를 통해 테스트 시 외부 API 호출을 모킹 하여 일관된 응답을 제공하고, 테스트의 안정성과 재현성을 높일 수 있다MockServer 설정dependencies { implementation("org.springframework.boot:spring-boot-starter-web") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.mock-server:mockserver-netty:5.13.2") testImplementation("org.mock-serv..

JVM 2024.07.29

BDDMockito

BDDMockito는 Behavior-Driven Development (BDD) 스타일의 단위 테스트를 작성하기 위해 Mockito 프레임워크를 확장한 것이다. BDDMockito는 주로 Java 애플리케이션에서 사용되며, 테스트 코드가 더 읽기 쉽고 명확하게 작성되도록 도와준다.BDDMockito의 장점가독성 향상: BDD 스타일의 테스트는 테스트 코드의 가독성을 높여, 테스트 목적을 더 명확하게 표현할 수 있다.행동 중심: Given-When-Then 패턴을 통해, 테스트 케이스를 시스템의 동작과 일치시킬 수 있다.명확한 의도 표현: BDD 스타일의 테스트는 코드의 의도를 더 명확하게 표현하여, 테스트 케이스를 이해하고 유지보수하기 쉽게 만든다.BDDMockito의 주요 메서드given: 테스트 준..

JVM 2024.07.28

JUnit

JUnit은 JVM 생태계에서 가장 널리 사용되는 테스트 프레임워크로, 주로 단위 테스트를 위한 도구를 제공하지만, 통합 테스트에도 활용할 수 있다.JUnit의 주요 특징은 어노테이션 기반 테스트 지원, 단정문(Assert)을 통한 테스트 결과 검증이 있다.통합 테스트여러 컴포넌트를 조합하여 전체 비즈니스 로직을 검증한다. @SpringBootTest를 주로 사용하지만, 대규모 프로젝트에서는 실행 시간이 길어질 수 있다.단위 테스트단위 테스트는 코드의 특정 모듈이 의도한 대로 동작하는지 각 함수와 메소드에 대한 개별 테스트 케이스를 작성하여 검증합니다.FIRST 원칙효과적인 단위 테스트를 위한 5가지 원칙을 FIRST 원칙이라고 한다.Fast: 테스트는 빠르게 실행되어야 한다.Independent: 각 ..

JVM 2024.07.28

테스트 커버리지와 JaCoCo

테스트 커버리지란 소프트웨어의 테스트 수준이 충분한지 표현할 수 있는 지표 중 하나이다.많은 코드 커버리지 도구가 있으며, 가장 보편적으로 사용되는 Jacoco에 대해 다루도록 한다. JaCoCo 개요JaCoCo(Java Code Coverage)는 Java 애플리케이션의 코드 커버리지를 측정하기 위한 도구이다. 코드 커버리지는 테스트된 코드의 비율을 나타내며, 소프트웨어 테스트의 효율성을 평가하는 중요한 지표이다.JaCoCo의 주요 기능커버리지 측정: 테스트 코드 실행 시 실행된 코드 라인, 분기, 메소드 등을 측정한다.리포트 생성: HTML, XML, CSV 형식으로 커버리지 리포트를 생성하여 시각화된 데이터를 제공한다.검증 규칙 설정: 특정 커버리지 목표를 설정하고 이를 충족하는지 확인할 수 있다...

JVM 2024.07.27

리듀서 활용하기

리듀서 합치기combineReducerscombineReducers() 함수는 여러 리듀서를 통합하여 새로운 리듀서를 만들어 준다. 이 함수는 ReducerMapObject 타입을 매개변수로 받는다. 여기서 타입변수 S는 상태(AppState)를 의미한다.// combineReducers 함수 선언문export function combineReducer(reducers: ReducersMapObject):Reducer>// ReducersMapObject 타입 선언문export type ReducersMapObject = { [Key in keyof State]: Reducer} AppState.ts4개의 멤버 상태로 구성했으므로 각각 처리하는 4개의 리듀서가  필요하다.import * as Clo..

Javascript/React 2024.07.22

파티셔닝과 샤딩

테이블을 파티션이라는 작은 단위로 나누어 관리하는 기법을 파티셔닝(Partitioning)이라고 한다.장점특정 파티션만 조회하면 되기 때문에 검색 속도가 빨라진다.인덱스 크기가 작아져 효율이 증가한다.데이터 양이 증가해도 파티션을 추가하여 쉽게 확장할 수 있다.백업과 복구 작업이 간편해진다. 예를 들어, 특정 파티션만 백업할 수 있다.특정 파티션만 유지보수하면 되므로 관리 부담이 줄어든다.한 파티션에 문제가 생겨도 다른 파티션은 영향을 받지 않으므로 시스템의 가용성이 높아진다.table의 partition 단위로 Disk I/O을 분산하여 경합을 줄이기 때문에 UPDATE 성능을 향상시킨다.단점설계 및 관리가 복잡해질 수 있다.적절한 파티셔닝 키를 선택하는 것이 어려울 수 있다.테이블 간 JOIN에 대한..

Database 2024.07.22

StringBuffer vs StringBuilder

StringBuffer와 StringBuilder는 둘 다 문자열을 다루기 위해 자바에서 제공하는 클래스이다. 하지만 몇 가지 중요한 차이점이 있다.공통점:가변성 (Mutability): 둘 다 문자열을 변경할 수 있다. String은 불변(immutable)이지만, StringBuffer와 StringBuilder는 변경 가능한 문자열을 다룬다.메서드: 대부분의 메서드가 동일하다. 예를 들어, append(), insert(), delete(), reverse() 등.차이점:동기화 (Synchronization):StringBuffer는 모든 메서드가 동기화(synchronized)되어 있다. 즉, 멀티쓰레드 환경에서 안전하다(thread-safe).StringBuilder는 동기화가 되어 있지 않다...

JVM 2024.07.22

순수 함수

순수 함수(Pure Function)는 주어진 입력에 대해 항상 동일한 출력을 반환하고, 함수 외부의 상태를 변경하지 않는 함수이다. 순수함수는 함수형 프로그래밍의 핵심으로, 코드의 예측 가능성과 안정성을 높여준다.순수 함수의 특징동일한 입력에 대해 동일한 출력: 함수가 동일한 입력값을 받으면 항상 동일한 출력을 반환해야 한다.부작용 없음: 함수는 외부 상태를 변경하지 않는다. 함수 내부에서만 상태가 변경되고, 함수가 종료되면 외부 상태는 그대로 유지된.예시를 통한 이해예시 1: 기본적인 순수 함수function multiply(a, b) { return a * b;}console.log(multiply(2, 3)); // 항상 6을 반환console.log(multiply(2, 3)); // 항상..

Javascript 2024.07.22
728x90