시작하기 전에 계층형 아키텍처에서 개발을 진행할 때 우리는 보통 Controller, Service, Repository 이렇게 3개의 계층의 구조로 짜게 된다. 이 3개의 계층은 Controller에서 Service로, Service에서 Repository로 의존성이 흐르는데, 이 중에서도 Repository 부분을 보통 JpaRepository나 Mybatis mapper 같은 클래스로 직접 의존성으로 사용하는 경우가 많다. 하지만 Service 계층에서 바로 이런 클래스들에 의존하게 될 경우 몇 가지 문제가 생기게 된다. 이 글에서는 쉬운 예제 작성을 위해 JpaRepository를 사용하겠다. Service에서 바로 JpaRepository를 의존할 때 생기는 문제 Service 계층이 세부 사항..
시작에 앞서 시대의 흐름은 변화무쌍하여, Javascript의 생태계를 엄청나게 바꾸어놓은 ES6(ECMA2015) 스펙이 출몰한지 이제 8년이 되었다. 여러 회사들이 프론트엔드 채용 공고에 이제는 React를 올려놓고 있으며, 신입 채용에서 우대사항이었던 Typescript는 이제 슬슬 자격 요건으로까지 내려오고 있다. 하지만 그럼에도, 세상의 어떤 곳에는 아직도 ES5 이하 버전으로 개발하며, jQuery를 사용하는 회사들이 우리와 함께 숨쉬고 있다. 이런 이야기를 남들에게 하면 한숨을 쉬며 얼른 다른 회사로 이직을 하라는 조언의 목소리를 보내겠지만, 그럼에도 회사가 굴러가기 위해서는 누군가는 이런 작업을 해내야 한다. 그렇다면 우리 회사는 애초부터 안 좋은 스택을 쓰고 있었으니.. 하며 그저 손 놓..
문제 상황 네이버페이 결제 시스템을 구현을 하는데, 네이버페이 결제창을 호출하기 위해서는 자기들의 js 파일을 script 태그를 이용해서 불러와야 했다. 네이버페이 개발자센터 응답 예 Response HTTP/1.1 200 OK { "code": "Success", "message": "", "body": { "businessNo": "2208162517", "differenceResults": [{ "differenceRequestId": "DR201810300000008013", "payHistId": "20181113NP1000488732", "orderNo": "TEST001", "sequence": "00" developer.pay.naver.com npm을 통한 설치 방식이나, js파일을 직..
기존에 테스트 코드를 열심히 짜던 환경도 아니었기도 하고, 프론트엔드 환경에서의 테스트 코드 작성은 처음이다보니 이것저것 어려운 점이 많았다. 문제를 해결해 나가면서 사용한 방법들을 정리해 보았습니다. process.env 모킹하기 운영과 개발 환경을 분기 처리를 하기 위해서는, 다음과 같이 process.env에 의존하게 되는 코드를 짜게 될 때가 많다. export const siteURL = process.env.REACT_APP_ENV === 'production' ? 'https://naver.com' : 'http://localhost:3000'; 이 때 아래 처럼 코드를 짜게 될 경우 예상한대로 동작하지 않는다. it('production일 때 도메인 주소로 설정된다', () => { pro..
테스트 주도 개발 | 켄트 벡 - 교보문고 테스트 주도 개발 | 테스트 주도 개발은 테스트가 개발을 주도하는 방법이다. 테스트가 개발을 주도한다는 것은 테스트가 코딩의 방향을 이끌어 간다는 말이다. 테스트를 실패하는 코드가 없으 product.kyobobook.co.kr 들어가기 앞서 켄트 벡의 유명한 저서, 테스트 주도 개발을 읽었다. 평소에 테스트의 의미와 중요성에 대해서는 깊은 이해를 하고 있다고 생각했다. 그렇다면 TDD는 어떤 의미를 가지고 어떤 방식을 통해 구현되는 것일까? 항상 궁금증은 있었지만 궁금증을 해결해 볼 기회는 없었는데, 이번에 현 직장의 현 직원 분들과 전 직원 분(퇴사하신 분들.. ㅋㅋ)들 총 여섯 명이서 TDD에 대해 스터디를 모집하게 되어 공부해 볼 수 있게 되었다. 뜻깊은..
모든 행동은 증거가 확실해질 때까지 기다리면 늦다. 미용실 아주머니가 주식 얘기하면 팔라는 말이 있다. 웨비나 토커 본인의 이야기 독학vs 국비 vs 부트캠프 독학은 나를 안 믿음. 국비는 si 가서 착취당한다는 얘기 많고, 실제로 그렇다. 그래서 나는 부트캠프를 선택했다. 직장인으로써 고연봉이 되어도 생각보다 별거 없었음. 세금도 많이 떼이기도 하고.. 뭐 갑자기 포르쉐를 끈다던가 하는거 없었음. 그냥 밥 먹을 때 조금 더 여유로워진 정도. 그렇게 조금 살다보니 자본주의의 본질을 무언가 보았다. → 투자 + 창업이 진짜 돈을 많이 벌겠다 생각했음. 이런 큰 선택 직전에 있었던 고통의 원인은? 경로의존성: 한번 일정한 경로가 형성되고 의존하면 비효율적이어도 경로를 벗어나지 못하는 현상. 지금 괴롭다면 경..
💡 소개 이 세션에서는 가장 먼저 아키텍처를 구성할 때 가장 중요한 것이 무엇인지 돌이켜봅니다. 그리고 대부분의 개발자들에게 익숙한 계층형 아키텍처가 갖는 문제점은 무엇인지 이야기해 보고, 조금이나마 유지 보수하기 쉬운 아키텍처를 구성할 수 있는 방법에 대해 소개합니다. 아키텍처에서 중요한 것은 무엇인가? 프레임워크, DB, 테이블 설계, 캐시 등은 세부 사항이다. 중요한 것은 핵심 비즈니스 로직과 유스케이스이다. 핵심 비즈니스 로직: 사업적으로 의미 있는 규칙 또는 절차로써, 시스템의 유무와 상관없이 존재하는 것. ex) 대출을 해주고 이자를 받는 것은 은행이 돈을 버는 업무 규칙 핵심 비즈니스 데이터: 핵심 비즈니스 로직을 처리하기 위한 데이터 이를 가지고 도메인 엔티티를 뽑아낼 수 있음. (핵심 비..
2022년 회고. 사실 22년 8월 25일에 회고를 한번 했기 때문에.. 거기 써진 거 말고 나머지 것들을 대략 정리해보고자 한다. 👩🎓 공부의 시작 뭐, 그 전에도 공부를 해야겠다는 마음 가짐은 있었다. 하지만 좀 진짜 진지하게 공부를 시작한 건 아무래도 7월부터인 것 같다. 4 ~ 6월은 여기저기 놀러다니느라 바빴다. 그리고 7월부터 정말 이직을 상정한 공부가 필요하다고 크게 느꼈다. 그 때부터 굉장히 전투적으로 공부를 시작한 것 같다. 여기저기 돌아다녔다. 매일 Velog를 돌아다니며 트렌딩 게시글들을 전부 읽고, 개발자 뉴스레터들을 싹 정기구독하고, 인프런에서 강의도 찾아 듣고, 개발 서적 스터디도 시작했다. 신기하게도 공부를 하면 할 수록 내 실력에 대한 불안이 늘었다. 퇴근 후 집에 가만히 ..
배열의 원소들을 파라미터로 하는 Promise를 체이닝해야 하는 일이 있었다. 물론 async와 await을 활용하면 간단하게 구현할 수 있겠지만 함수 안에서 await을 사용할 경우 해당 함수가 async가 되어버리고 만다. 레거시 코드를 리팩토링하는 것이었기 때문에 이것이 어떤 영향을 끼칠지 무서워 다음과 같은 방식으로 작업하였다. function waitAndLog(data) { return new Promise((resolve) => { setTimeout(() => { console.log(data); resolve(); }, 2000); }); } const dataArray = ['hello', 'world', 'and', 'javascript']; function waitAndLogEver..
SELECT * FROM( SELECT ROUND(NVL((ELAPSED_TIME / DECODE(EXECUTIONS, 0, NULL, EXECUTIONS)/1000000 ), 0),3) AS ELAPSED_TIME , LAST_ACTIVE_TIME , HASH_VALUE , SQL_TEXT FROM V$SQL WHERE LAST_ACTIVE_TIME >= TO_DATE('20221125', 'YYYYMMDD') ) WHERE ELAPSED_TIME > 5 ORDER BY ELAPSED_TIME DESC;