Dev 88

Cherry-pick과 Rebase, Fast-forward - 병합커밋 없이 git history 깔끔하게 하는 방법

Cherry-pick과 Rebase의 공통점 cherry-pick과 rebase는 목적은 다르지만 동작하는 방법이 거의 비슷하다.  두 작업 모두 병렬적으로 작업된 목록을 하나로 합친다는 공통점이 있다. cherr-pick, rebase를 이해하기 위해서는 우선 git이 소스를 합치는 방식인 3 way merge에 대한 이해가 필요하다.  Cherry Pick 이란?cherry-pick은, 병렬적으로 작업된 내용에서 특정 commit을 선택하여 새로운 버전을 만들어 내는 방법이다.  이때 새로운 버전을 만들기 위해 3 way merge를 수행한다. Rebase 란?rebase라는 단어 뜻 그대로, base(각 브랜치들의 공통 조상 commit)를 옮긴다는 뜻이다.  다음 예제를 보자.git checkou..

Dev/Git 2024.11.24

3 way merge 란?

3 Way Merge 의 동작 방식  프로젝트를 진행하는 과정에서 git을 사용하여 버전 관리를 할 때, 일반적으로 기능별로 feature branch를 나누고 작업을 하게 된다.  기능구현의 리뷰가 완료 되면  feature branch를 main branch (혹은 develop)에 merge하게 될 것이다. 이 때 git이 제공하는 병합 방법중에 3 way merge가 있다. 3 way merge는 다음과 같은 세가지 요소를 가진다. 병합대상 브랜치  (A)Base (A,B 브랜치가 공통으로 가지고 있는 마지막 commit)병합 브랜치 (B)만약 내가  어떠한 base 브랜치로 부터 feature/A-branch와 feature/B-branch 생성했고,   A-branch를  B-branch에 m..

Dev/Git 2024.11.24

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - Junit5 확장 모델

Junit5 확장 모델 살펴보기Junit5 확장 모델은 Extension API라는 단일 개념으로 설명할 수 있다. Extension자체는 내부에 필드나 메서드가 없는 인터페이스인 마커인터페이스일 뿐으로, 해당 인터페이스를 구현하는 클래스에 특별한 의미나 기능을 부여하기 위해 사용한다. 마커 인터페이스 (태그 인터페이스, 토큰 인터페이스)마커 인터페이스는 구현 메서드가 따로 없는 인터페이스로, 해당 인터페이스를 구현하는 클래스에 특별한 의미나 기능을 부여하기 위해 사용한다. 대표적인 사례로는 Serailizable과 Cloneable인터페이스가 있다.  public interface MyMarkerInterface { // No methods }  테스트가 생애 주기를 타는 중에 사전에 정의한 확장 지점..

Dev/TDD 2024.10.20

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - Gradle, IntelliJ 와 함께하는 Junit5

들어가기전에책에는 빌드 도구로 Gradle 뿐만 아니라 Maven,  IDE는 Eclipse 및 NetBeans 등이 추가로 기술되어 있었지만 책이 집필된 시점과 현재를 비교했을 때 사용률이 월등히 다르기도하고 내가 Gradle, Intellij, Jenkins를 실무에서 쓰고 있기 때문에 나머지 내용은 스킵했다.  이번 장에선 Junit5의 사용법보다는, 각 build Tool 과 IDE를 쓰면 얻을 수 있는 장점정도를 간략하게 정리하려고 한다.  GradleGradle은 프로젝트 설정 파일을 Groovy(그루비:JVM에서 실행될 수 있고 자바 언어와 호환 가능한 객체 지향 프로그래밍 언어)를 기반으로한 DSL로 작성한다. 여기서 DSL이란 Domain Specific language의 준말이다. 번역..

Dev/TDD 2024.10.09

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - 모의 객체로 테스트 하기 (Mock) (2/2)

개발환경IDE :  intelliJ FrameWork : springboot 3.xLaunguage : java 17TestTool : Junit5    예제 소스 링크 모의 객체 프레임워크 사용해 보기이전 게시글에서 모의 객체를 밑바닥부터 구현했다. 프레임워크를 사용하면 프로젝트에서 이렇게 모의 객체를 하나하나 새로 생성할 필요 없이 더 쉽게 만들 수 있다. 일반적으로 많이 사용하는 테스트를 위한 프레임워크는 EasyMock, JMock, Mockito 에 대해 간략히 정리하려고 한다.   EasyMockEasyMock은 모의 객체를 사용하기 위한 유용한 클래스를 제공하는 오픈 소스 프레임워크다. 이전 게시글에서 작성한 예제를 EasyMock 프레임워크를 사용해서 리팩터링 해보자. 책에서는 maven ..

Dev/TDD 2024.09.24

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - 모의 객체로 테스트 하기 (Mock) (1/2)

간단한 스텁과 모의 객체  리뷰Stub은 특정 상황에서 "결과만" 중요할 때 사용 →  Stub은 메서드가 무엇을 반환하는지에만 집중Mock은 "행위"가 중요할 때 사용 → 특정 메서드가 호출되었는지, 호출 횟수는 몇 번인지 등을 검증할 때 사용스텁을 활용하면 소스코드를 웹 서버, 파일 시스템, 데이터베이스 등의 환경에서 격리하여 단위 테스트를 수행할 수 있다. 그러나 메서드 호출을 다른 클래스로부터 격리하는 것과 같은 세밀한 격리를 위한 테스트는 모의객체(Mock)을 활용하여 효과적으로 수행할 수 있다. 즉, 각 메서드별로 개별적인 단위 테스트를 만들어 개발하는 것이 가능해진다.   모의 객체란?메서드에 집중하는 테스트를 만들 수 있다 → 대상 메서드가 다른 객체를 호출해서 발생하는 부수 효과가 생길일..

Dev/TDD 2024.08.27

abstract class VS interface

들어가기 전에회사를 그만두고 있었던 공백기간에 주로 코드 리팩터링, 내가 지향하는 클린코드의 기준을 만들기 위해 노력했다. 사실 사용자 입장에서는 똑같은 기능이겠지만 뭐랄까... 리팩터링(혹은 최적화가)이 성공적으로 완료되어 내가 원하는 대로 애플리케이션이 실행될 때의 그 쾌감은 동종 업계 사람들이라면 다 공감하지 않을까?  이번 주제는 리팩터링하면서 오래간만에 기초부터 다시 다듬게 된 abstract과 interface다.     추상 클래스(abstract class) 클래스를 일반 설계도라고 한다면, 추상 클래스는 미완성 설계도에 비유할 수 있다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스는 생성할 수 없다. 추상클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다...

Dev/Java 2024.07.15

Jenkins, Ansible로 CI/CD 구축하기 (3/3)

이전 포스팅은 여기로 2024.07.02 - [Dev/CI&CD] - Jenkins, Ansible로 CI/CD 구축하기 (2/3) Jenkins, Ansible로 CI/CD 구축하기 (2/3)이전 포스팅은 여기로 2024.07.01 - [Dev/CI&CD] - Jenkins, Ansible로 CI/CD 구축하기 (1/2) Jenkins, Ansible로 CI/CD 구축하기 (1/2)들어가기 전에사실 CI/CD는 전부터 사용하고 있었는데, 뭔가 A to Z로 구축하는 가이zigo-autumn.tistory.com   들어가기 전에 이번 글에서는 Ansible의 보다 자세한 개념과 Jenkins + Ansible을 통해 배포 파이프라인을 구축하는 방법을 정리했다. 글에서 언급되는 Agent는 hosts설정..

Dev/CI&CD 2024.07.15

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - 큰 단위의 테스트를 위한 스텁(Stub)

스텁(Stub)과 모의 객체(Mock)의 필요성애플리케이션을 개발하다 보면 몇몇 코드 혹은 클래스들은 필수불가결하게 다른 클래스 혹은 특정환경에 의존한다.  특정 런타임 환경에 의존하는 애플리케이션을 위한 단위 테스트를 작성하는 것은 매우 어렵다. 테스트는 안정적이어야 하며 반복적으로 수행하더라도 같은 결과가 나와야 하기 때문이다. 예를 들어, 작성중인 애플리케이션이 타사에서 제공하는 웹 서버에 HTTP통신을 해야 하는 경우, 개발 환경에서는 그런 서버 통신을 하는 것이 사실상 불가능하다. ( 이것은 생각보다 실무에서 빈번하게 발생하는 문제이기도 하다. 개발 환경에 필요한 필수적인 인프라 스트럭처가 구체화되지 않았는데 개발자는 기능 구현을 할 수 있어야 한다. 😳 ) 그러므로 실제 장비 지원 없이도 소..

Dev/TDD 2024.07.14

Jenkins, Ansible로 CI/CD 구축하기 (2/3)

이전 포스팅은 여기로 2024.07.01 - [Dev/CI&CD] - Jenkins, Ansible로 CI/CD 구축하기 (1/2) Jenkins, Ansible로 CI/CD 구축하기 (1/2)들어가기 전에사실 CI/CD는 전부터 사용하고 있었는데, 뭔가 A to Z로 구축하는 가이드를 작성해두고 싶어서 강의를 듣고 이것저것 시도(라고 하고 삽질이라고 읽는다) 해보다가 드디어 글을 쓸 결zigo-autumn.tistory.com  들어가기 전에이전 게시글에서는 CI/CD의 등장배경과 실습에 사용할 Jenkins, Ansible에 대한 내용을 간략히 정리했다. 이번 글에서는 실제로 Jenkins를 구축하는 방법에 대해 기술하려고 한다. 기본적인 가상환경 컨테이너의 개념과 서버 간 통신 방식을 알고 있음을 ..

Dev/CI&CD 2024.07.02