본문 바로가기

ALL

(128)
Flyway를 활용한 DB Migration 자주 겪는 일 일반적으로 소스, 서버, DB 등 서비스 환경은 개발, 검증, 운영으로 나누어져 있다. 개발자들은 이렇게 나누어진 환경 때문에 번거로운 과정들을 거쳐야 한다. 프로젝트를 진행하다 보면 기존의 소스와 테이블을 바꾸어야 하는 경우가 자주 발생 한다. 실제로 이전에 진행했던 프로젝트에서는 기획 변경으로 인해 필요한 데이터가 바뀌면 1) 로컬의 소스와 DB를 수정하여 작업하고, 2) 개발계 DB 수정을 요청하고, 개발계에 소스를 올리고 배포한 후, 3) 검증, 운영계도 같은 과정을 수행하였다. 하지만 위와 같은 과정들은 번거로운 뿐더러 여러 문제를 발생시켰다. 담당자가 직접 DB를 수정하다보니 실수로 계획한 것과 다르게 반영되어 장애가 발생하거나, DB 담당자 부재시 소스 배포도 함께 불가능해지..
Jest와 React Jest란 가장 대표적인 JavaScript 테스트 프레임 워크이다. Jest 이전에는 JavaScript 테스트에 필요한 Test Runner(mocha), Test Matcher(sinon), Mocking(test mock) 라이브러리들을 조합하여 테스트를 진행해야 했다. 하지만 Jest는 All-in-one 테스트 프레임 워크로서 쉽게 구성하고 사용할 수 있다. CRA(Create React App)에서의 Jest Jest를 사용하기 위해서는 관련 라이브러리와 스크립트 설정등 화녕 구성이 필요하지만 CRA로 만들어진 react 앱에는 모든 내용이 포함되어있다. 그리고 App의 테스트 코드가 들어있는 App.test.ts까지 만들어져 있다. import React from 'react'; impor..
아이템 83: 지연 초기화는 신중히 사용하라 지연 초기화 public class FileUtil { private File oldfile = new File("oldfile"); ... } 여기 FileUtil 클래스가 있다. 이 클래스의 oldfile 필드가 프로그램이 100번 실행될 때 한 번 사용될 까 말까하는 필드라면 어떨까? 100번 실행되는 동안 사용하지도 않을 oldfile을 계속 불러와서 초기화 할 것이고 이는 명백한 리소스 낭비이다. 지연 초기화는 위와 같은 문제에 대한 해답이 될 수 있다. 자주 사용되지 않는 필드를 프로그램이 시작할 때가 아니라 비로소 사용될 때 초기화 하는 것이다. public class OldFileUtil { private File oldfile = null; ... public File getOldFile..
아이템 82: 스레드 안정성 수준을 문서화하라 스레드 안정성 문서화 클래스를 개발할 때, 해당 클래스를 사용할 클라이언트들을 위하여 필요한 정보들을 주석으로 작성하여 문서화 해야한다. 아무런 설명이 없다면 클라이언트는 추측과 가정을 통해 그 클래스를 사용하게 된다. 특히 스레드 안정성에 대한 정보는 설명이 필요한 중요한 정보 중 하나이다. 스레드 안정성이 잘못되면 프로그램에 심각한 오류가 발생할 것이다. 스레드 안정성 수준 불변(immutable): 이 클래스의 인스턴스는 마치 상수와 같아서 외부 동기화가 필요없다. 무조건적 스레드 안전(unconditionally thread-safe): 이 클래스의 인스턴스는 수정될 수 있으나, 내부에서 충실히 동기화하여 별도의 외부 동기화 없이 동시에 사용해도 안전하다. 조건부 스레드 안전(conditional..
아이템 81: 동시성 유틸리티를 애용하라 wait와 notify public class Main { public synchronized void waitMehod() throws InterruptedException { System.out.println(Thread.currentThread().getId() + " wait"); wait(); System.out.println(Thread.currentThread().getId() + " notified"); } public synchronized void notifyMethod() throws InterruptedException { System.out.println(Thread.currentThread().getId() + " notify all"); notifyAll(); } public ..
6. Git 브랜치2: 브랜치 관리, 리모트 브랜치, 리배이스 브랜치 관리 > git branch hotfix iss53 * master testing > git branch -v hotfix 4e14b5a fix newFunction iss53 3533c05 add newFunction * master 760e43a resolve conflict testing 7b0dbe6 fix newfile1 git branch 명령어를 통해 현재 저장소에 있는 브랜치들을 볼 수 있다. * 표시가 된 브랜치는 현재 작업대상이 브랜치라는 뜻이다. -v 옵션과 함께 하면 브랜치별 마지막 커밋 정보를 볼 수 있다. > git branch --merged hotfix iss53 * master > git branch --no-merged testing --merged와 --no-me..
5. Git 브랜치1 - 브랜치, 머지 브랜치란 개발을 하다보면 코드를 여러개로 분리하여 독립적으로 개발을 진행해야 하는 경우가 생긴다. 예를 들어 동일한 서비스라도 운영에서 배포되고 있는 코드가 있고 새로운 기능을 개발중인 코드가 있을 수 있다. Git의 브랜치는 이러한 코드의 분리와 독립적인 개발이 가능하게 해준다. > git branch *master Git 저장소를 처음 생성하면 자동적으로 master라는 브랜치가 생성된다. 그리고 새로운 커밋이 추가될때마다 master 브랜치의 포인터는 최신 커밋을 가르키도록 이동한다. > git branch testing > git branch *master testing git branch 명령어를 통해 새로운 브랜치를 생성할 수 있다. 하지만 새로운 브랜치를 추가할 뿐 여전히 작업중인 브랜치는 ..
4. Git 기초3 - 리모트 저장소, 태그 리모트 저장소 리모트 저장소란 네트워크상에 있는 저장소를 말한다. 일반적으로 프로젝트를 진행할때는 여러사람이 하나의 리모트 저장소를 기반으로 동시에 작업을 진행한다. 이번에는 이러한 리모트저장소를 관리하는 법을 알아보자. > git clone https://github.com/schacon/ticgit > cd ticgit > git remote origin > git remote -v originhttps://github.com/schacon/ticgit (fetch) originhttps://github.com/schacon/ticgit (push) ​ticgit라는 리모트 저장소를 불러왔다. 해당 폴더에 가서 git remote 명령어를 입력하면 하나의 리모트 저장소가 조회되는것을 볼 수 있다. >..