전체

작성 계기 지난 리팩토링 프로젝트에서 Spring Boot 3로 업그레이드 하면서 JDK 17로 바꾸게 됐는데, 이에 따라 여러 Dependencies를 고치게 되었다. 이에 따라 다양한 이슈가 발생했었는데, 가장 기억에 남았던 이슈라 글로 정리 해 본다. 이슈 사항 Kotlin Entity 에서 @OneToMany List fundImageList 형식으로 사용하는 곳에서 RuntimeExecption 발생 MutableList로 고치니 잘 동작 => 이대로 끝나면 발전 가능성이 없는 것이다. 무엇이 문제였을까? 공변성과 반공변성 Effective Java와 Kotlin In Action에서 공변 / 반공변에 대해 학습했었는데 와닿지 못 했었던 내용이라 그냥 달달 외웠었다. 지금 이슈가 발생했던 부분은..
· 인프라
1. 작성 계기 백엔드 서버 개발을 진행하면서 젠킨스를 사용하긴 하지만 직접적인 구축에 대해서는 블랙 박스였기 때문에 장애 처리에 대한 미흡한 점이 많았다. 백엔드 개발자에 대한 내 개인적인 수준은 인프라적인 부분까지 어느정도 구축할줄 알아야한다고 생각했다. 기존에 Kubernetes & Jenkins 구축을 Vagrant 환경에서 해봤는데, 맥 & 로컬에서 스터디하기 너무 까다로워서 Docker Desctop 기반으로 쉽게 스터디할 수 있는 방안을 모색했었고, 이슈없이 한 번에 구축할 수 있도록 정리했다. 2. Kubernetes 환경 구성 로컬에서 개인저인 학습을 위해 Docker Desctop 위에 Kubernetes 환경을 구축했다. Docker Desctop의 설정 메뉴에서 아래 사진에 보이는 ..
작성 계기 Web3를 통한 프로젝트의 경우 truffle / hardhat 등의 Smart Contract을 위한 대중성있는 블록체인 프레임워크가 존재한다. Java에서도 Web3j 모듈에서 다양하게 지원하긴 하지만, Web3 프로젝트에 비해 그 과정이 상당히 복잡하고 러닝커브가 높다. Web3에 비해 커뮤니티 풀이 생각 외로 적고, 프로젝트 전체 플로우에 대해 참조할만한 블로그도 없어서 직접 작성하게 됐다. 사용 스택 Spring Boot 2.7 & Gradle 7.0 JDK 11 Solidity 0.8.19 위 기술 스택으로 사용한 이유 Gradle 8.0 이상의 프로젝트 (JDK 17 / Spring Boot 3.0)에서는 아직 지원이 안 되는듯하여 이슈로 올라와있다. Solidity 0.8.20 ..
Solidity를 사용하면서 겪었던 스토리지 충돌 관련 이슈 정리 Proxy - delegateCall()호출 시, 스토리지 충돌 문제 컨트랙의 변경을 위해(Smart Contract는 원칙상 변경이 불가하다) Proxy를 만들 수 있는 방법을 찾다가 delegateCall() 발견 데이터 로직을 담당하는 컨트랙(A)에서 데이터 저장소를 담당하는 컨트랙(B)에 접근할 때 delegateCall() 사용 이슈 발생 delegateCall()은 현재 컨트랙의 컨텍스트에서 사용하고자 하는 컨트랙의 함수에 접근하여 사용 가능 (msg.sender가 동일하기 때문에 프록시로 사용하기 유용하다) 문제는 Solidity에서 Storage 변수를 다룰 때, Slot이라는 저장소에 변수를 선언 된 순서대로 저장하게 되는..
Gas Cost를 왜 책정해야할까? Gas 비용이 없다면, 공격자의 Ddos 공격에 취약해진다. 따라서 컨트랙트 함수를 호출할 때마다 비용을 지불하는 방식으로 공격자에게 부담을 지워지게 하는 용도가 가장 큰듯하다. Gast Cost는 어떻게 책정되는가? 1 Ether = 10^9 Gwei = 10^18 wei Gas 비용은 개발자가 어떻게 컨트랙트를 작성하냐에 따라 상대적으로 많아질수도, 적어질수도 있다. Gas 책정 방식은 EVM opcode 참고 https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash Smart Contract를 구현할 때의 유의점 EVM opcode를 하나하나 찾아보고 컨트랙의 ..
간단한 Rest Docs 작성 예시 [build.graddle.kt] plugin { id("com.epages.restdocs-api-spec") version "0.17.1" } configure { setServer("http://localhost:9999") title = "Rest API 문서" description = "Rest API 문서" version = "0.1.0" format = "yaml" outputDirectory = "build/docs" outputFileNamePrefix = "rest_docs" } val asciidoctorExtensions: Configuration by configurations.creating dependencies { testImplementa..
Spring Unit Test에서 컨트롤러 테스트와 Rest Docs 결합 시, 빌드 시간이 오래 걸리는 문제점에 대한 해결 방안 작성 현재 개발 상황 각각의 테스트 클래스에서 @WebMvcTest 사용 => 테스트마다 Spring Context를 다시 띄우게 된다. 이 문제점을 해결하기 위해 팩토리 패턴으로 하나의 추상 클래스에서 다음과 같이 작성하여 빌드 시간 단축 현재 구조의 문제점 @MockBean은 @SpyBean과 함께 Mockito가 아닌, Spring-test에서 제공되는 어노테이션이다 @MockBean을 사용하는 테스트 클래스마다 Spring Context가 새로 띄워진다. @MockBean을 사용하는 테스트 클래스가 많아지는만큼 빌드 속도가 느려지게 된다. 컨트롤러 테스트에서 Sprin..
· CS/리눅스
apt 명령어를 통해 패키지를 받으면서 문득 apt 명령어에는 무엇이 있고, 어디에, 어떻게 저장이 되는지 궁금하여 짧게 조사한 내용이다. apt란, Advanced Packaging Tool의 약자로 데비안 계열(우분투 등)에서 자주 쓰이는 패키지 관련 명령어 명령어 종류 apt apt-get 정의 apt install apt-get install 패키지 설치 apt remove apt-get remove 패키지 제거 (설정 파일은 지우지 않음) apt purge apt-get purge 패키지 관련 설정 제거 apt update apt-get update /etc/apt/sources.list에 저장된 인덱스 정보를 업데이트 apt autoremove apt-get autoremove 불필요한 패키지..
iron_jin
'분류 전체보기' 카테고리의 글 목록 (8 Page)