본문 바로가기

분류 전체보기

(34)
[사례 분석] 인프런의 트래픽 비용과 아키텍처 개선 회사 상황인프런에서는 기존 레거시 시스템을 개선하는 과정에서기존 레거시 시스템을 팀마다 복제해서 가져가고각 팀의 목적에 맞게 점진적으로 개선해 가면서 신규 시스템과 통합했다고 한다. 하지만 현실에서는 팀마다 레거시 시스템을 개선하는 속도에서 차이가 났다고 한다.인프런은 총 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('존재하지 않는 지갑입니다.'); } ..
[Ethereum] EIP-712에 대해 알아보자 EIP-712개념기존에는 왼쪽처럼 유저가 서명할 때 byte 문자열만 볼 수 있었다.오른쪽은 EIP-712 서명으로 구조화된 데이터를 통해 사용자가 무엇을 서명하는지 알아 볼 수 있다. EIP-712의 데이터는 domain 정보 영역와 서명 정보 영역 2가지로 나뉜다.domain 정보를 담는 구조체는 Eip721Domain으로 name, version, chainId, verifyingContract, salt와 같은 필드로 구성된다.해당 구조체는 hashStruct 함수를 통해 domainSeperator라는 해시값으로 사용된다.domainSeparator = hashStruct(eip712Domain) 서명 정보는 사용자가 구조체를 정의해서 사용할 수 있고마찬가지로 hashStruct 함수를 통해 해..
[Ethereum] ERC-1155에 대해 알아보자 ERC-1155개념ERC-20과 ERC-721을 동시에 사용하도록 고안된 멀티 토큰 표준이다. OpenZeppelin ContractERC-1155아래는 저장하고 있는 변수로 토큰 아이디와 토큰 소유자별 토큰이 얼마큼 있는지와대리자가 소유자의 모든 토큰을 대신 전송할 수 있는지 여부를 나타낸다.mapping(uint256 => mapping(address => uint256)) private _balances;mapping(address => mapping(address => bool)) private _operatorApprovals;string private _uri; 아래는 토큰을 대신 전송할 수 있는 권한을 주는 로직이다.function _setApprovalForAll( address ow..