분류 전체보기 (36) 썸네일형 리스트형 [Elasticsearch] 내부 동작 과정에 대해 알아보자 Elasticsearch 개념Elasticsearch란?elasticsearch는 오픈소스 검색엔진인 apache lucene을 기반으로 동작하며 restful 인터페이스를 통해 검색 서비스를 제공한다. 인덱스모든 데이터는 JSON 도큐먼트로 저장되는데 도큐먼트들의 논리적 집합을 인덱스라고 한다. 인덱스를 조회해보면 mappings, settings, aliases로 구성된다.mappings는 데이터가 어떻게 저장되고 검색될지에 관한 스키마이고settings는 데이터가 어떻게 물리적으로 저장되고 운영할지에 관한 설정이고aliases는 인덱스의 별칭이다.GET movies{ "alias": {}, "mappings": { "properties": { "make": { "tit.. [사례 분석] 카카오의 코드로 개발 환경과 절차 관리하기 코드로 관리해야 하는 이유팀원이 새로 들어온 경우 팀마다 개발하는 환경과 절차가 있기 때문에 이를 알려줘야 한다.수동가장 단순한 방법으로는 사람이 붙어서 알려주는 방식이 있다.이는 아래와 같은 단점이 있다.1. 시간과 인력의 비효율2. 누락과 실수에 취약 문서화다른 방법으로는 개발 환경과 절차를 문서로 관리하는 것이다.이는 아래와 같은 단점이 있다.1. 매번 전파 필요2. 동기화 보장 어려움3. 문서 오류에 취약 코드 관리다른 방법으로는 코드로 관리하는 것이다.보통 버전 관리 도구로 코드를 관리하기 때문에 다음과 같은 장점이 있다.1. 버전 관리 가능2. 자연스럽게 최신화3. 실수 여지 최소화4. 함수나 변수를 사용해서 재사용 가능 도구와 문법카카오에서는 코틀린과 스프링을 사용하고 있고 이와 관련된 도구.. [사례 분석] 인프런의 트래픽 비용과 아키텍처 개선 회사 상황인프런에서는 기존 레거시 시스템을 개선하는 과정에서기존 레거시 시스템을 팀마다 복제해서 가져가고각 팀의 목적에 맞게 점진적으로 개선해 가면서 신규 시스템과 통합했다고 한다. 하지만 현실에서는 팀마다 레거시 시스템을 개선하는 속도에서 차이가 났다고 한다.인프런은 총 4개의 팀이 있는데 2024년 내에 학습 서비스를 국제화한다는 목표를 가지고 있었기 때문에모든 팀이 학습 서비스를 국제화하는 프로젝트에 투입되었다고 한다.이로 인해 학습 서비스와 관련된 팀들이 다른 팀들에 비해 레거시 시스템을 개선하는 속도가 더 빨랐던 것이다. 인프런에서 국제화 서비스를 준비하면서 고려했던 점은 트래픽 비용이다.무료 강의를 만들어서 홍보하는 과정에서 높은 환율로 인해서 트래픽 비용이 과도하게 발생한다는 것이다.그래서.. [사례 분석] 강남언니의 SEO 전략 SEO 전략아래는 web funnel을 나타낸 것이다.funnel은 깔때기라는 뜻으로 사용자가 웹사이트에 방문해서 구매까지 가는 과정을 단계별로 나타내는 것을 뜻한다.발표에서는 검색 노출, 검색 유입, 앱 내 전환 와 같은 3가지 단계로 나타냈고 이에 따라 SEO 전략을 설정했다. 검색 노출 증가페이지가 노출이 되려면 봇이 페이지를 크롤링하고 인덱싱을 해야 한다. A Tag봇에게 페이지 노출이 안 되는 대표적인 케이스로링크를 통해 다른 페이지로 이동하는 기능에서 a tag를 사용하지 않고 button tag를 사용하는 경우이다.a tag를 사용해서 봇이 url을 수집하도록 할 수 있다. SSRCSR(Client Side Rendering)은 브라우저가 초기에 비어있는 html 파일을 받고 연결되어 .. [Ethereum] Uniswap V2에 대해 알아보자 Uniswap개념uniswap은 liquidity pool 프로토콜로 x*y=k 공식을 사용해서 2개의 ERC-20 토큰 간 교환비율을 자동으로 조정한다. liquidity pool에 자산을 예치하면 LP 토큰을 받게 되는데 LP 토큰을 사용해서 기존 자산을 상환받을 수 있다. Oracleoracle은 가격 정보를 보기 위해 사용하는 툴을 말한다. 대량의 자산을 넣어서 순간적으로 가격을 조작하는 것을 막기 위해 일정 시간동의 평균 가격인 TWAP (Time Weight Average Price)을 사용한다. ContractUniswapV2ERC20ERC-20과 비슷한데 EIP-2612에서 정의된 permit 함수가 추가되었다.오프체인 서명을 통해 approve를 할 수 있게 해서 approve와 tra.. [Ethereum] Upgradable Contract에 대해 알아보자 Upgradable Contract개념contract를 배포하고나서 contract의 로직을 업데이트할 수 있도록 설계된 계약을 말한다. 사용자와 상호작용하는 proxy contract와 실제 구현을 담고 있는 implementation contract로 구성된다.proxy contract는 데이터를 보관하고 있고 사용자의 요청이 오면 delegate call을 통해 implementation contract에게 위임한다.implementation contract는 함수를 보관하고 있고 새로운 로직이 필요하면 새로운 주소로 배포된다. OpenZeppelin ContractProxy사용자가 proxy contract에서 함수를 호출하면 실제 함수는 implementation contract에 있기 때문에 .. [Ethereum] Multisig에 대해 알아보자 Multisig개념보안을 강화하기 위해 여러 명의 서명을 통해 트랜잭션을 실행시키는 것을 mutisig 서명이라고 한다. Gnosis ContractMultisig Wallettransactions는 transactionId마다 구조체로 이루어진 transaction 정보를 저장한다.confirmations는 transactionId마다 owner들의 서명 유무를 저장한다.owners는 onwers들을 저장한다.required는 트랜잭션이 실행되기 위한 최소 서명 개수를 나타낸다.uint public constant MAX_OWNER_COUNT = 50;struct Transaction { address destination; uint value; bytes data; bool ex.. [Ethereum] ERC-721A에 대해 알아보자 ERC-721A개념ERC-721A는 IERC721의 구현체로 여러 개의 NFT를 하나의 NFT와 비슷한 gas 비용으로 minting할 수 있게 해준다. ERC-721 Enumerable과의 비교ERC-721 Enumerable은 IERC721과 IERC721Enumberable를 구현하고 있는 추상 contract로토큰 목록을 순회해서 조회하는 기능을 가지고 있다. 아래는 ERC-721 Enumerable과 ERC-721A의 성능을 비교한 자료이다.대량의 토큰을 miniting하는 상황에서 ERC-721A가 적합한 것을 확인할 수 있다. ERC-721A에서는 ERC-721 Enumerable과 비교했을 때 아래와 같은 부분을 최적화했다.1. 토큰의 metadata를 중복으로 저장하는 부분을 제거했다.2.. [기능 구현] AsyncLocalStorage를 사용해서 Transaction 기능을 구현해보자 Transactional DecoratorDecoratordecorator는 함수를 반환하는 표현식으로 class, method, property에 @로 시작하는 decorator를 붙여서 코드를 수정하거나 추가해 주는 문법이다.이를 통해 횡단 관심사를 분리해서 관점 지향 프로그래밍을 할 수 있다. 트랜잭션 로직이 필요한 메서드에 아래와 같은 decorator를 만들어서 적용할 수 있다.descriptor.value는 원본 함수이고 트랜잭션 로직으로 감싸서 바꿔치기 한걸 볼 수 있다. export function Transactional() { return function ( target: any, propertyKey: string, descriptor: PropertyDescript.. [일관성 보장] Outbox Pattern을 적용해보자 Outbox Pattern1. Outbox Pattern을 사용한 이유?아래는 trustline을 생성하는 비즈니스 로직으로 데이터베이스와 블록체인의 상태를 한번에 변경하고 있다.@Transactional()async createTrustLine(currency: string, userId: number) { const savedWallet = await this.prismaService.tx.wallet.findUnique({ where: { userId }, select: { id: true, seed: true }, }); if (!savedWallet) { throw new NotFoundException('존재하지 않는 지갑입니다.'); } .. 이전 1 2 3 4 다음