목록Language (38)
나의 개발일지
🚀개요[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로 나눈 것이다.버킷 : 해시 테이블에 할당된 공간의 총 개수를 의미합니다.로드 팩터란 리사이징이 필요한 시점을 정의한 것이다.해시 테이블에 차곡차곡 데이터를 쌓아가다보면 필연적으로 충돌이 발생하게 된다. 이때 충돌한 값들이 쌓일 수록 성능이 하락하거나 가용량을 벗어날 수 있다.이를..
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 ..
기존 코드의 리팩토링을 진행하던 과정에서 좋은 방법을 찾아냈습니다.Querydsl 의 활용법 중 Projections을 활용할 경우JPAQueryFactory에서 엔티티나 Tuple을 가져온 후 따로 DTO로 정제하는 과정을 거치는 방식이 아니라JPAQueryFactory에서 바로 임의의 DTO를 반환하도록 할 수 있다고 합니다.초보 개발자로서, 혹은 개발의 초기 단계에 Querydsl 내에서 Tuple을 사용할 일은 잘 없을 것이라고 생각합니다.Tuple의 경우 보통 JPAQueryFactory에서 엔티티나 한 변수 형태의 리스트 값을 받는 경우가 아니라 원하는 컬럼만을 지정해서 가져오는 경우에 사용됩니다.가령 회원이라는 엔티티가 있을 경우, 아이디, 비밀번호, 전화번호 중 아이디와 전화번호만 필요할 ..
프로젝트가 끝나고 다들 바쁜 시기입니다. 6 개월이라는 긴 수료기간에 지친 마음을 요양하는 시간을 가지는 분들도 있고, 취업 준비에 여념이 없는 분들도 있네요. 마음 같아선 좀 더 고도화를 진행해보고 싶지만 이러한 사정들로 어려워 보이기 때문에 개인적인 리펙토링만을 수행하고 있습니다. 리펙토링만 하는 것도 좋지만 재미가 없을 것 같더라구요. 테스트도 같이 진행해 보기로 했습니다. 통합 테스트와 단위 테스트 중 하나를 선택해야 하는 입장에 있어 팀원들과 진행할 수 없는 상황인 저에게는 다른 코드와의 의존성을 차단한 채로 순수하게 해당 기능만을 테스트해 볼 수 있는 단위 테스트를 선택했습니다. 저희는 Exception을 따로 정의하는 방식으로 사용하고 있습니다. RuntimeException을 상속받는 Ex..
백엔드 스쿨이 끝이 났습니다. 이제 모든 공부를 혼자서 진행해야 한다고 생각하니 낯섭니다. 옆에서 같이 공부하고 있는 사람도 없어 마음이 헤이해질까봐 두렵네요. 마음을 다잡기 위해서, 그리고 코드 복기를 위해서 테스트 코드를 작성 중에 있습니다. GetMapping 엔드 포인트들의 대한 테스트를 작성하는 과정에서 여러가지 오류가 많았습니다. AOP 허용 설정을 따로 해줘야 된다는 것은 꽤 충격적이었죠. 본 개발 환경에서는 기본 설정이라 필요 없지만 테스트 환경을 위해 Application 클래스 위에 @EnableAspectJAutoProxy(proxyTargetClass = true) 를 입력해줘야 한다니 주객이 전도된 기분입니다. 그리고 또 문제가 발생했습니다. 문제 기존의 401 는 권한이 없음을 ..
HotShare 프로젝트도 막바지에 다다랐습니다. 새로운 기능을 개발하기엔 애매한 시간입니다. 1차 프로젝트 때도 괜히 막바지에 무리를 해서 기능들을 우겨넣었다가 장애가 잔뜩 생겨서 제때 마감을 못할 뻔 했기에 조심스러워졌습니다. 그래서 테스트 코드를 작성해보기로 했습니다. 다른 팀원분들 또한 저와 같은 계획을 가지신 터라 이미 서비스 클래스들에 대한 테스트 코드를 작성하고 계시더라구요. 저는 대신 컨트롤러 클래스를 진행하기로 했습니다. 문제 @WebMvcTest(CashLogController.class) @MockBean(JpaMetamodelMappingContext.class) public class CashLogControllerTest { @Autowired private MockMvc moc..
문자열 클래스 자바에서는 대표적인 문자열을 다루는 자료형 클래스로 String, StringBuffer, StringBuilder라는 3가지 자료형을 지원합니다. 연산이 많지 않을 때는 어떤 클래스를 사용하더라도 차이가 없지만 연산 횟수가 많아지거나 멀티쓰레드 환경에서 사용될 경우 각각의 특징에 맞는 적절한 클래스를 사용하는 것이 중요합니다. 불변과 가변 String : 불변 자바에서 String 객체의 값은 변경할 수 없습니다. 한번 할당된 공간이 변하지 않는다고 해서 '불변 자료형'이라고도 불립니다. 그래서 초기 공간과 다른 값에 대한 연산에서 많은 시간과 자원을 사용하게 된다는 특징이 있습니다. String 객체 내의 내부 구성 요소를 보면 다음과 같습니다. 인스턴스 생성 시 생성자의..