목록분류 전체보기 (57)
독도갈매기의 개발 블로그
Test Double 의미는? 테스트를 진행하기 어려운 경우 이를 대신해 테스트를 진행할 수 있도록 만들어주는 객체. → Mock 객체 의미로 잘못 알고 있던 것이 사실 Test Double을 의미하는 것이었음. 그렇다면 Mock 객체는 뭐였을까? Mock Object 는 단순히 Test Double의 종류였을 뿐이다. 종류 Dummy 기본적인 테스트 더블. 인스턴스화 된 객체가 필요하지만 기능은 필요하지 않은 경우 사용. 때문에, Dummy 객체의 메서드가 호출되었을 때 정상 동작은 보장 ❌ Fake 복잡한 로직이나 객체 내부에서 필요로 하는 다른 외부 객체들의 동작을 단순화하여 구현한 객체 동작의 구현을 가지고 있지만, 실 Production에는 적합 ❌ Stub Dummy 객체가 실제로 동작하는 것..
와... 이 정도면 모든 경우의 수를 생각했다. 테스트만 하면 되겠는걸? 너무 멍청하게도, 미련하게도 이런 생각을 하며 개발을 했던 개발자가 한 명 있다. 그 개발자는 바로 나다. 오늘의 이야기는 최근에 진행했던 같은 회사 내 다른 개발 팀과 진행한 협업에 대한 회고를 담고 있다. 협업한 개발 내용은 솔루션끼리 한 번의 로그인으로 오고 가는 것을 구현한 SSO 개발이었다. SSO 로그인에 대한 흥미 평소 Kakao, Facebook, Google 에서 지원하는 통합로그인에 대해서 관심이 있었지만, 토이 프로젝트로 구현하려 해도 결국 솔루션이 2개 이상 있어야 모든 경우를 고려할 수 있다는 긁지 못하는 공간이 있어 구현해 볼 생각조차 하지 않았던 분야였다. 그렇기에 더더욱 이번 개발 건은 구미가 안 당길래..
평소 학교 생활 중 누누히 강연가가 꿈이라는 말을 이야기 한 덕분에 감사하게도 졸업한 고등학교에서 한번 씩 방과후 강사로 초청 받아 수업을 진행하곤 하는데, 그 때 있었던 이야기 중 하나로 오늘의 이야기를 시작해보려 한다. 나는 수업을 진행할 때 템포를 학생들의 수준에 맞추기 위해 과제를 내주기도 하는데, 과제를 못해온 학생의 말 중 가장 혐오 하는 말이 있다. 그것은 다름 아닌, '몰라서 못했습니다.'라는 말인데 아무런 설명 없이 '몰라서 못했습니다.' 라는 말을 듣기 싫다고 한다면 교육자(강연가)가 목표인 나는 자격이 없을 수도 있다. 나는 '몰라서 못했습니다.'라는 말이 단순히 싫다는 것이 아닌, 그 말을 하는 사람의 책임감을 질책하는 것이다. '수..
코드 컴퓨터가 알아들을 수 있는 언어를 일컫는 말. 혹은, 컴퓨터도 알아들을 수 있을 만큼 알고리즘을 논리적으로 작성한 것을 말한다. 누군가 "코드" 에 대해 검색한다면, 한번 쯤 봤을 수도 있는 내용이다. 그러나, 나는 위 정의에 대해 동의하지 않는다. 오늘은 이에 대한 주관적인 이야기를 해보려 한다. (이는 매우 주관적인 이야기이기 때문에, 근거 있는 반론이라면 항상 환영입니다. ) 코드는 컴퓨터가 주체가 되어서는 안된다. 코드는 개발자가 작성하며, 오로지 개발자를 위해 존재하는 것이 코드이다. 우리는 무엇을 위해 코드를 작성하는가? '개발자는 코드를 컴퓨터에 내가 원하는 것 or 고객이 원하는 것을 구현하기 위해 코드를 작성하곤 한다.' 여기서 주체는 무엇인가? 많이들 여기서 생각하는 것은 "원하는..
3-Way Merge Commit History master Branch의 포인터는 C2 Commit에 있습니다. 이후 우리는 login 기능에 이슈가 발생했다는 말을 들어 iss53 Branch를 생성합니다. 갑자기 급히 고쳐야 하는 버그가 발생해 hotfix Branch를 생성 해 버그를 고쳐야 합니다. success HotFix hotfix에서 무사히 버그를 해결하여 Fast-Forward하여 master의 포인터는 C4 Commit으로 향하게 됩니다.이후 hotfix는 끝났기 때문에 hotfix branch는 삭제합니다. C2가 부모 Commit인 iss53은 계속 로그인 관련 이슈를 해결합니다. Difference Parent Commit 로그인 관련 이슈를 해결한 iss53 Branch는 ma..
정적 타입 언어로서의 장점 Spring Framework 외에도 node.js의 Express, Python의 Django, Flask가 있는데 왜 굳이 복잡하게 느껴지는 Spring을 사용해야 할까요? 그리고 왜 Java는 복잡하다고 느껴질까요? 대표적인 이유를 뽑자면 JS는 동적 타입 언어이기 때문입니다. const arr1 = [1, 2, 3]; const arr2 = ['1', '2', '3', '4']; const reduceArr = arr => arr.reduce((l, r) => l + r); reduceArr(arr1); // 6 reduceArr(arr2); // '123' 우리는 숫자를 모두 더 한 값을 retur..
Spring? 간단히 설명했을 때 Spring은 Java 오픈소스 애플리케이션 프레임워크입니다. 엔터프라이즈( Enterprise : 대규모 사업, 기업 )급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션입니다. 즉, 대규모 데이터 처리와 트랜잭션이 동시에 여러 사용자로부터 행해지는 매우 큰 규모의 환경을 개발할 수 있도록 형성된 프레임 워크입니다. 그리고 가장 큰 특징 중 하나인 경량 컨테이너로 자바 객체를 담고 직접 관리하고, 객체의 생성 및 소멸 그리고 라이프 사이클을 관리하는 등의 기능으로 IoC 기반의 프레임워크임을 알 수 있습니다. Spring이 흥하게 된 계기 이전에 Java EE라는 서버 개발 플랫폼을 알아야 합니다. → 플랫폼 : 일반적으로 플랫폼은 컴퓨터의..
Fast-Forward Commit History master Branch의 포인터는 C2 Commit에 있습니다. 이후 우리는 login 기능에 이슈가 발생했다는 말을 들어 iss53 Branch를 생성합니다. New Branch Point 이후 진행 하게 되면서 Commit 하여 C3으로 iss53 Branch가 진행된다. new Commit C3 이후 Merge 하게 된다면 단순히 master Branch의 포인터가 C3으로 옮겨가게 되면서 Fast-Forward가 발생합니다. → 이와 같은 상황은 아래 조건이 성립되어야만 합니다. A와 B branch가 있다. A → B를 Merge하려 한다. B가 A 이후의 Commit을 가리키고 있다. ( B의 부모 Commit이 A이다. ) A는 단순히 B와..
Interceptor 인터셉터( Interceptor )란? 컨트롤러( Controller )의 핸들러( Handler )를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 일종의 필터 // Node.js app.get('/', (req, res) => { res.send('Hello World!'); // Controller Handler console.log('me too!'); // Controller Hanlder }); 핸들러( Handler )란? 사용자가 요청한 url에 따라 실행되어야 할 메서드( Method ), 함수( Function ) Ex) res.send(), console.log(), etc... 왜 사용 해야 하는가? 특정..
IoC ( Inversion of Control : 제어권 역전 ) 일반적인 의존성에 대한 제어권 : 개발자가 직접 의존성을 만든다. 의존성 ( 코드 적인 의미 ) 어떤 객체가 사용해야 할 객체라고 할 수 있고, 더 쉽게 말하자면 직접 new 등을 써서 만들어 쓰면 의존성을 자기가 직접 만들어 쓴다고 할 수 있습니다. 제어권 역전이 일어나지 않는 코드 public class TestRepository {...} public class TestController { // 직접 TestRepository를 생성하여 사용. private TestRepository testController = new TestRepository(); } 제어권 역전 IoC는 전통적인 방식에 반대되는 흐름으로 코드가 진행되는 것..