목록전체 글 (263)
나의 개발일지
최근 AWS의 Lambda 환경에서 FFmpeg 를 구동시키는 방식의 아키텍처 구조를 설계하고 있습니다. 가상 서버 환경에 FFmpeg를 직접 업로드하여 사용해도 작동하겠지만, 제가 서버 코드 내에서 해당 작업을 하는게 아닌 별도의 환경으로 구성한 이유는 아래와 같습니다.FFmpeg의 운영체제 호환성 문제로 일관된 환경을 구성할 수 없습니다.FFmpeg의 용량이 높아 dockerizing을 할 때 빌드 시간이 크게 증가합니다. 원활한 배포 환경 구성이 어렵습니다.적용이 게시물은 독자가 이미 FFmpeg를 AWS Lambda의 레이어로 추가하고 활용할 수 있음을 전제로 합니다.스택오버플로우 질문의 답변에서 결정적인 도움을 받았습니다.https://stackoverflow.com/questions/46486..
🚀개요[Java] Gdal 라이브러리 사용하기 - 1. InputStream to TempFile 변환 및 후처리위의 포스트에서 java.io.InputStream을 javo.io.File로 변환하여 임의로 정의한 TempFile 클래스의 객체로 생성하는 방법을 다뤘습니다. 이번 포스트에서는 TempFile 객체를 gdal의 Dataset 객체로 변환 후 COG(Cloud Optimized GeoTIFF 형식으로 변환하는 과정을 다룹니다.🔥발단위성 사진 파일을 COG 형식으로 변환해야 합니다. 저는 Gdal이라는 라이브러리를 사용할 것 입니다. Gdal 라이브러리를 통해 변환을 하기 위해서는 아래의 네가지 과정을 거쳐야 합니다.gdal.Open(String name) 메소드를 통해 Dataset 객체..
개요InputStream으로 받은 파일은 보통 디스크에 저장하지 않고 그대로 활용하는 것이 속도 측면에서 좋습니다. 하지만 사용하고자 하는 라이브러리에서 InputStream을 받지 않는 경우에는 디스크에 저장할 수 밖에 없습니다. 이 글은 디스크에 저장한 InputStream을 통해 저장한 임시 파일을 안정적으로 삭제까지 하는 방법을 기록합니다.발단최근 이력서를 넣은 한 회사에서 과제를 주었습니다. 파일을 Gdal이라는 라이브러리로 변환하는 것이 주요 골자입니다. 이번 글의 핵심은 Gdal의 API 중 하나인 gdal.Open 메소드에 있습니다.public class gdal { // name(=path)의 위치에 있는 파일을 Gdal에서 정의한 파일 형식인 Dataset 객체로 불러옵니다. ..
개요리트코드의 706번 문항인 Design HashMap 을 풀어보았다.문제의 난이도 자체는 Easy 로 책정되어있는 것으로 보아 시간 복잡도는 크게 고려하지 않아도 되는 문제이며 실제로 대강 풀어도 깰 수 있다.하지만 나는 최근 파이썬 알고리즘 책을 통해 알게 된 로드 팩터나 개별 체이닝과 같은 개념들이 흥미롭게 느껴져서 실제로 구현해보고자 한다.로드 팩터란?로드 팩터란 해시 테이블에 저장된 데이터 개수 n을 버킷의 개수 k로 나눈 것이다.버킷 : 해시 테이블에 할당된 공간의 총 개수를 의미합니다.로드 팩터란 리사이징이 필요한 시점을 정의한 것이다.해시 테이블에 차곡차곡 데이터를 쌓아가다보면 필연적으로 충돌이 발생하게 된다. 이때 충돌한 값들이 쌓일 수록 성능이 하락하거나 가용량을 벗어날 수 있다.이를..
미션 설명 1@Mock, @MockBean, @Spy, @SpyBean, @InjectMocks 의 차이를 한번 정리해 봅시다.나의 답@Mock행위에 대한 기대를 명세하고, 그에 따라 동작하는 객체를 생성합니다테스트하기 어려운 외부 의존성을 대체하기 위해 사용된다@MockBean@Mock과 같은 기능을 하지만 스프링 컨테이너 아래에서 동작한다대상 객체의 Mock 객체를 대신 컨테이너에 올린다@SpyStub 이면서 호출된 내용을 기록하여 보여줄 수 있는 객체실제 객체처럼 동작하고 일부만 Stubbing 할 수 있다@SpyBean@Spy와 같은 기능을 하지만 스프링 컨테이너 아래에서 동작한다대상 객체의 Spy 객체를 대신 컨테이너에 올린다@InjectMocks@Mock 과 @Spy 로 생성한 Stub 객체를..
미션 설명Layered Architecture 구조의 레이어별 테스트 작성법을 알아보았습니다.레이어별로 1) 어떤 특징이 있고, 2) 어떻게 테스트를 하면 좋을지, 자기만의 언어로 다시 한번 정리해 볼까요?나의 답Persistence Layer특징DB 데이터에 직접 접근하는 역할을 가진다데이터 제공 외의 역할을 해선 안된다 (비즈니스 가공 로직은 포함해선 안된다)데이터에 대한 CRUD에 집중한 레이어다테스트 코드 작성법DB 접근을 통해 수행하는 CRUD 작업이 정상적으로 수행됐는지 검증한다DataJpaTest 어노테이션을 활용하여 좀 더 가벼운(더 빠른) 테스트 코드 작성이 가능하다Persistence Layer와 관련된 빈들만을 스프링 컨테이너에 올린다테스트 시 사용하는 DB는 실제 배포 환경에서 사용..
미션 설명1. 아래 코드와 설명을 보고, [섹션 3. 논리, 사고의 흐름]에서 이야기하는 내용을 중심으로 읽기 좋은 코드로 리팩토링해 봅시다.public boolean validateOrder(Order order) { if (order.getItems().size() == 0) { log.info("주문 항목이 없습니다."); return false; } else { if (order.getTotalPrice() > 0) { if (!order.hasCustomerInfo()) { log.info("사용자 정보가 없습니다."); return false; } els..
미션 설명"추상과 구체" 강의를 듣고, 생각나는 추상과 구체의 예시가 있다면 한번 3~5문장 정도로 적어봅시다. 일상 생활, 자연 현상, 혹은 알고 있는 개발 지식 등 어느 것이든 상관 없습니다.추상에서 구체로, 또는 구체에서 추상으로 방향은 상관 없으나, 어떤 것이 추상이고 어떤 것이 구체 레벨인지 잘 드러나게 작성해 보아요 :)나의 답1추상코드를 꼽는다구체기기에 연결되어있는 코드를 콘센트의 두 구멍에 맞춰 연결함으로써 전력을 공급한다.2추상커피를 마신다구체커피가 담긴 컵을 손으로 잡아 고정시킨 상태에서 컵의 각도를 조절하여 커피를 입에 주입한다.3추상지하철을 탄다구체지하철 역사의 입구를 찾아 들어간 후 전철에 탑승하여 원하는 정거장에서 하차한다한마디SOLID의 주요 법칙 중 하나인 추상화는 자주 거론..
AlembicAlembic 은 경량 데이터베이스 마이그레이션 툴입니다. SQLAlchemy 에 호환되는 툴로서 자바 진영의 flyway와 비슷한 기능을 한다고 보시면 됩니다.사용법초기 설정pip install alembic우선 alembic 라이브러리를 설치해줍니다.alembic init 임의파일명# exalembic init alembicinit을 해줍니다.인자로 alembic 과 관련된 파일들을 저장할 폴더명을 받습니다. 저의 경우 alembic 을 폴더명으로 사용했습니다.새로운 폴더 하나와 파일 하나가 생깁니다.여기서 sqlalchemy.url의 값으로 데이터베이스 주소를 입력해줘야 합니다.ini 파일이기 때문에 정적 문자열만 입력해줄 수 있습니다.만약 .env 파일에 저장해둔 내용을 불러오고 싶다..
파이썬을 배우고 있습니다.확실히 만만치가 않네요.언어 자체는 자바에 비하면 크게 어려운 편은 아니지만 새로운 것을 배운다는 것은 쉽지 않더라구요.문제잔재미코딩이라는 강사님의 강의를 통해 학습을 하고 있습니다.잔재미코딩님의 강의는 전반적으로 섬세하고 디테일한 설명이 강점이라고 생각합니다.강의의 내용 하나하나가 유익하지만 개인적으로 커스터마이징을 하고 싶은 욕심이 생겨버렸습니다.가령 pymysql을 활용한 db와의 통신 부분을 변형하고 싶었습니다.우선 강사님의 코드는 아래와 같습니다.@staticmethoddef get(user_id): mysql_db = conn_mysqldb() db_cursor = mysql_db.cursor() sql = "SELECT * FROM user_info ..