분류 전체보기 174

GitLab CI/CD 캐시, 왜 내 코드가 안 바뀔까?

GitLab CI/CD를 사용할 때, 캐시(cache) 정책 설정이 제대로 되어 있지 않으면 코드 변경이 제대로 반영되지 않는 문제가 발생할 수 있습니다. (나도 가끔 겪었는데 👀) policy: pull 설정 때문에 기존 캐시가 유지되면서 새로운 코드가 반영되지 않는 일이 있습니다.이번 글에서는 GitLab CI/CD의 캐시 개념과 policy 설정의 차이를 살펴보고, 내가 겪었던 문제를 정리해보려고 합니다! 🗒️ GitLab CI/CD cache란?GitLab CI/CD에서 캐시(cache)는 빌드 테스트 속도를 향상시키기 위해 특정 파일이나 디렉터리를 저장하는 기능입니다.캐시는 다음 실행에서 다시 사용될 수 있어 다운로드 시간을 줄이는 데 도움이 됩니다!✅ 캐시와 아티팩트의 차이구분CacheA..

Infra/Git 2025.02.28

[만들면서 배우는 클린 아키텍처] 10 아키텍처 경계 강제하기

'만들면서 배우는 클린 아키텍처' 책을 정리한 내용입니다. 지금까지 아키텍처에 대해서 많은 이야기를 나눴다. 코드를 어떻게 작성하고 어디에 위치시킬지 결정하는 데 있어 우리를 안내해 줄 목표 아키텍처를 가지게 돼서 기쁘다. 하지만 일정 규모 이상의 모든 프로젝트에서는 시간이 지나면서 아키텍처가 서서히 무너지게 된다. 계층 간의 경계가 약화되고, 코드는 점점 더 테스트하기 어려워지고, 새로운 기능을 구현하는데 점점 더 많은 시간이 든다. 이번 글에서는 아키텍처 내의 경계를 강제하는 방법과 함께 아키텍처 붕괴에 맞서 싸우기 위해 취할 수 있는 몇 가지 조치를 살펴보겠다. 경계와 의존성아키텍처 경계를 강제하는 여러 가지 방법에 대해 이야기하기에 앞서 아키텍처의 어디에 경계가 있고, '경계를 강제한다'는 것이 ..

[만들면서 배우는 클린 아키텍처] 09 애플리케이션 조립하기

'만들면서 배우는 클린 아키텍처' 책을 정리한 내용입니다.  유스케이스, 웹 어댑터, 영속성 어댑터를 구현해 봤으니, 이제 이것들을 동작하는 애플리케이션으로 조립할 차례다.3장에서 이야기했듯이 애플리케이션이 시작될 때 클래스를 인스턴스화하고 묶기 위해서 의존성 주입 메커니즘을 이용한다.이번 글에서는 평범한 자바로 이를 어떻게 하는지, 그리고 스프링, 스프링 부트 프레임워크에서는 이를 각각 어떻게 하는지 살펴보겠다. 왜 조립까지 신경 써야 할까?왜 유스케이스와 어댑터를 그냥 필요할 때 인스턴스화하면 안 되는 걸까? 그것은 코드 의존성이 올바른 방향을 가리키게 하기 위해서다. 모든 의존성은 안쪽으로, 애플리케이션의 도메인 코드 방향으로 향해야 도메인 코드가 바깥 계층의 변경으로부터 안전하다는 점을 기억하자...

[만들면서 배우는 클린 아키텍처] 08 경계 간 매핑하기

'만들면서 배우는 클린 아키텍처' 책을 정리한 내용입니다. 이 책의 전반부에서는 웹, 애플리케이션, 도메인, 영속성 계층이 무엇이고, 하나의 유스케이스를 구현하기 위해 각 계층이 어떤 역할을 하는지에 대해 다뤘다. 그런데 늘 겪는 문제인 각 계층의 모델을 매핑하는 것에 대해서는 거의 다루지 않았다. 여러분도 매퍼 구현을 피하기 위해 두 계층에서 같은 모델을 사용하는 것에 대해 논의해 본 적이 있을 것이다. 아마 논쟁은 이런 식으로 진행됐을 것이다.매핑에 찬성하는 개발자:두 계층 간에 매핑을 하지 않으면 양 계층에서 같은 모델을 사용해야 하는데 이렇게 하면 두 계층이 강하게 결합됩니다.매핑에 반대하는 개발자:하지만 두 계층 간에 매핑을 하게 되면 보일러플레이트 코드를 너무 많이 만들게 돼요. 많은 유스케이..

[만들면서 배우는 클린 아키텍처] 07 아키텍처 요소 테스트하기

'만들면서 배우는 클린 아키텍처' 책을 정리한 내용입니다.  내가 목격한 많은 프로젝트에서 자동화된 테스트는 미스터리였다. 모두가 위키에 적혀 있는 따분한 규칙에 따라 테스트를 작성했지만 팀의 테스트 전략을 물었을 때 제대로 답변하는 이는 아무도 없었다. 이번 글에서는 육각형 아키텍처에서의 테스트 전략에 대해 이야기한다. 아키텍처의 각 요소들을 테스트할 수 있는 테스트 유형에 대해 논의할 것이다. 테스트 피라미드아래의 그림의 테스트 피라미드에 따라 테스트에 관한 이야기를 시작해 보자(테스트 피라미드는 마이크 콘의 책 (인사이트, 2012)에서 확인할 수 있다). 아래의 그림은 몇 개의 테스트와 어떤 종류의 테스트를 목표로 해야 하는지 결정하는 데 도움을 준다.기본 전제는 만드는 비용이 적고, 유지보수하기..

[만들면서 배우는 클린 아키텍처] 06 영속성 어댑터 구현하기

'만들면서 배우는 클린 아키텍처' 책을 정리한 내용입니다.  첫 번째 글(계층형 아키텍처의 문제는 무엇일까?)에서 계층형 아키텍처에 대해 부정적으로 이야기하면서 이 아키텍처에서는 결국 모든 것이 영속성 계층에 의존하게 되어 '데이터베이스 주도 설계'가 된다고 이야기했다. 이번 글에서는 이러한 의존성을 역전시키기 위해 영속성 계층을 애플리케이션 계층의 플러그인으로 만드는 방법을 살펴보겠다. 의존성 역전영속성 계층 대신 애플리케이션 서비스에 영속성 기능을 제공하는 영속성 어댑터에 대해 이야기하겠다. 아래의 그림은 영속성 어댑터가 애플리케이션 서비스에 영속성 기능을 제공하기 위해 어떻게 의존성 역전 원칙을 적용할 수 있을지 보여준다.애플리케이션 서비스에서는 영속성 기능을 사용하기 위해 포트 인터페이스를 호출한..

JUnit4와 JUnit5의 차이

Java 애플리케이션의 단위 테스트에서 널리 사용되는 JUnit은 개발자에게 필수적인 도구입니다. 🛠️저는 평소 JUnit5를 사용해 왔지만, 최근에 JUnit4를 사용해 볼 기회가 생겼습니다.처음에는 익숙하지 않은 버전이라 조금 낯설었지만, 이를 통해 두 버전의 차이를 직접 체감하며 JUnit의 발전을 이해할 수 있었습니다.이 글에서는 JUnit4와 JUnit5의 차이점, 장단점, 그리고 제가 사용하면서 느낀 점을 정리해 보았습니다.👩🏻‍💻 JUnit4의 특징JUnit4는 간단하고 직관적인 테스트 프레임워크로, 다음과 같은 어노테이션을 제공합니다. @Test: 테스트 메서드 표시.@Before / @After: 테스트 전/후에 실행되는 메서드 지정.@Ignore: 특정 테스트를 비활성화.@Ru..

Backend/TestCode 2025.01.27

JDK 23: 자바 핵심 변경점 정리

JDK 23은 자바 언어와 플랫폼의 최신 개선 사항을 포함하여 개발자 생산성과 애플리케이션 성능을 향상시키는 다양한 기능을 도입했습니다. 주요 변경 사항에 대해 알아보겠습니다.👀  1. 프리미티브 타입에 대한 패턴 매칭 및 switch 문 확장 (JEP 455)1-1. 패턴 매칭의 확장기존에는 instanceof 연산자가 참조 타입에서만 동작했지만, JDK 23부터는 프리미티브 타입에서도 사용할 수 있습니다.int value = 10;if (value instanceof int i && i > 5) { System.out.println("Value는 5보다 큰 정수입니다: " + i);}위 코드는 instanceof 연산자로 프리미티브 타입 int를 확인하고, 조건을 추가적으로 결합하여 안전하고 ..

Backend/Java 2025.01.15

리눅스 크론탭(Linux crontab)으로 자동화 작업

리눅스 환경에서는 주기적인 작업을 자동으로 실행할 필요가 있을 때, `crontab`을 사용하여 이를 간편하게 설정할 수 있습니다.이 글에서는 리눅스에서 `crontab`을 설정하고 사용하는 방법을 정리해 보도록 하겠습니다. 👩🏻‍💻 crontab 이란 ⁉️crontab은 리눅스와 유닉스 시스템에서 특정 주기로 명령어를 실행할 수 있는 시스템 도구입니다.예를 들어, 매일 백업을 수행하거나, 정해진 시간에 로그 파일을 관리하는 등의 작업을 자동으로 처리할 수 있습니다.주요 사용 예시매일 새벽 2시에 서버 백업매주 월요일 오전 9시에 서버 리소스 모니터링매일 밤 11시에 로그 파일을 정리 crontab 기본 사용법 crontab은 5개의 필드로 구성된 설정 파일입니다. 각각의 필드는 어떤 작업을 언제 ..

Infra/Linux 2025.01.11

[만들면서 배우는 클린 아키텍처] 05 웹 어댑터 구현하기

'만들면서 배우는 클린 아키텍처' 책을 정리한 내용입니다.  오늘날의 애플리케이션은 대부분 웹 인터페이스 같은 것을 제공한다. 웹 브라우저를 통해 상호작용할 수 있는 UI나 다른 시스템에서 우리 애플리케이션으로 호출하는 방식으로 상호작용하는 HTTP API가 여기에 해당한다.우리가 목표로 하는 아키텍처에서 외부 세계와의 모든 커뮤니케이션은 어댑터를 통해 이뤄진다. 따라서 이번에는 웹 인터페이스를 제공하는 어댑터의 구현 방법을 살펴보자. 의존성 역전웹 어댑터와 관련된 아키텍처 요소(어댑터 자체와 애플리케이션 코어와 상호작용하는 포트)에 조금 더 초점을 맞춘 그림이다.웹 어댑터는 '주도하는 ' 혹은 '인커밍' 어댑터다. 외부로부터 요청을 받아 애플리케이션 코어를 호출하고 무슨 일을 해야 할지 알려준다. 이때..