Backend

    spring boot mongo DB LocalDateTime UTC -> KST 한국 시간 전환하기

    서론 spring에서 mongo DB에 Document의 LocalDateTime 필드를 저장하면 UTC의 시간으로 변환되어 들어간다. 아마 팀 컨벤션에 따라 다를 것 같은데, 우리는 mongo DB에서도 KST 한국 시간으로 보고 싶었다. 따라서 covnerter를 만들기로 했다. 기본적인 베이스는 spring이 제공하는 Spring Data MongoDB에 커스텀 컨버터를 추가하는 것이다. https://docs.spring.io/spring-data/mongodb/reference/mongodb/mapping/custom-conversions.html Custom Conversions :: Spring Data MongoDB Generally, we inspect the Converter imple..

    CompositeCacheManager의 배치 시간 소요 문제 - CacheManager는 꼭 전부 Bean 등록하자

    CompositeCacheManager의 배치 시간 소요 문제 - CacheManager는 꼭 전부 Bean 등록하자

    문제 얼마전 회사에서 local cache와 redis를 같이 쓰도록 바뀌었는데, 이 때 CompositeCacheManager를 사용했다. @Bean fun cacheManager(): CacheManager = CompositeCacheManager().apply{ setCacheManagers(listOf(getCaffeineCacheManager(), getRedisCacheManager)) } fun getCaffeineCacheManager(): SimpleCacheManager = SimpleCacheManager().apply{ setCaches(...) } fun getRedisCacheManager(): RedisCacheManager = RedisCacheManager.builder(..

    Redis Jackson @JsonUnwrapped Unwrapped property requires use of type information 이슈

    이슈 코틀린을 사용하면서 Redis에서 value에 직렬화/역직렬화 클래스를 설정할 일이 있어 해당 구현체로 Jackson을 사용하기로했다. 그래서 ObjectMapper를 커스텀해서 사용하던 도중 어느 한 dto data class를 직렬화할때 에러가 났다. Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Unwrapped property requires use of type information: cannot serialize without disabling `SerializationFeature.FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS` 해당 dto의 프로퍼티는 클래스였고, @JsonUnwrap..

    oracle insert all vs insert into ~ union all 왜 union all이 빠른가

    oracle insert all vs insert into ~ union all 왜 union all이 빠른가

    insert all vs insert into ~ union all oracle에서 많은 양의 row을 한 번에 입력할 일이 있어서 처음에 insert all을 사용했다. insert all을 사용하는 문장은 다음과 같다. insert all into dummy(id, col1, col2, col3) values (1001,'30841','30842','30843') into dummy(...) values (...) ... select * from dual; 처음엔 이 문장이 mysql의 insert into values()... 와 비슷하게 생겼길래 그냥 갖다썼다. 근데 알고보니 성능이 떨어진다고 한다. union all 을 이용한 insert into가 훨씬 더 빠르다는 것이다. union all을..

    MySQL varchar(255)를 사용하는 이유?

    이유 MySQL에서 테이블을 만들 때 varchar(255)를 자주 사용했다. varchar가 가변길이 타입으로 char에 비해 실제 저장한 데이터의 크기만큼 저장한다고 알고 있었다. 그런데 왜 하필 255인지는 생각해본 적이 없어 알아보았다. MySQL 8.0의 공식 문서를 보면 다음과 같이 적혀있다. Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535. The effective maximum length of a VARCHAR is subject to the maximum row size (65,535 bytes, which is shared among a..

    read commited와 repeatable read 차이점

    헷갈리는 차이점 두 격리 수준에 대해 헷갈렸는데 정리해보고자 한다. BEGIN TRANSACTION; SELECT * FROM T; WAITFOR DELAY '00:01:00' SELECT * FROM T; COMMIT; 한 트랜잭션이 위 쿼리문을 실행한다고 하자. SELECT * FROM T; 를 실행하고 1분 후 다시 SELECT * FROM T; 를 실행하는 쿼리다. read commited에서는 커밋된 어떤 데이터든 볼 수 있다. 첫 번째 SELECT * FROM T; 이후에 기다리던 1분 동안 동시에 실행되던 다른 트랜잭션들이 해당 테이블의 데이터를 추가, 수정, 삭제하고 커밋한다면 해당 내용이 반영된다. 따라서 두 번째 SELECT * FROM T;를 실행했을 때 첫 번째와 결과가 달라질 수 ..

    aws lambda에서 pandas 사용하기

    aws lambda에서 pandas 사용하기

    pandas를 위해 필요한 것 pandas는 기본적으로 하나의 모듈이 아니라, pandas를 사용하기 위해 여러 모듈들을 같이 설치하는 구조로 되어있다. 따라서 pip로 설치해보면 pandas만 깔리는 것이 아니라 여러 모듈들도 같이 깔린다. 그 중에 제일 중요한게 numpy인데, 실제로 pandas 모듈만 따로 레이어에 업로드해보면, 작동하지 않는다. aws-lambda는 amazon linux에서 돌아가는데, amazon linux는 PyPi나 conda-forge에서 설치하는 보통 numpy를 사용할 수 없다고 한다. 방법 사실 방법은 두 가지 정도가 존재하는데, 첫 번째 방법은 pandas와 그에 필요한 pytz 딱 두 개를 다운 받아서 레이어에 업로드하고 부차적으로 필요한 numpy나 scipy..

    aws lambda에서 파이썬 selenium 동작하게 하기

    aws lambda에서 파이썬 selenium 동작하게 하기

    이번에 챗봇 프로젝트를 진행하면서 웹 페이지에서 생성되는 파일 이름을 읽어올 필요가 있었다. 처음에는 requests를 이용하려 했으나, 그것이 동적으로 생성되는 데이터임으로 깨닫고.. selenium으로 변경했다. 그리고 이것을 실행할 환경인 aws lambda에서 돌아가게할 필요가 있었다. selenium 모듈 파일부터 구해야.. aws-lambda에서는 라이브러리를 따로 레이어 계층이란 곳에 추가시켜줘야 사용할 수 있다. 이 때 레이어는 파이썬 모듈 파일들을 zip로 압축한 파일들을 말하며, 이런 레이어들을 각 함수에서 추가시켜주면 된다. 우선 selenium을 aws-lambda에서 동작시키는데에는 3가지가 필요하다. chromedriver, headless-chromium, selenium이다...

    학교 외박 신청 어플 - 리팩토링

    학교 외박 신청 어플 - 리팩토링

    시작하며 벌써 외박신청 어플을 만든지 약 7개월이 지났다. 현재(2022/04/24)에 내가 작년에 작성했던 후기를 읽어봤는데 조금 부끄럽기도 하고, 뿌듯하기도 하다. 작년 9월부터 현재 4월까지 함수 호출 횟수다. 출시일이 제일 피크고 이후로는 평범한 수를 유지하고 있다. 이번 3월에 홍보를 한번 더 해서인지 횟수가 조금 올라왔다. 에러는 거의 없지만(보통 에러가 나는 경우는 비밀번호를 틀리는 경우다) 3월에 엄청난 에러가 찍혔는데, 이는 교명 변경으로 인해 도메인이 바뀌어서이다. 해당 사항을 인지하자마자 업데이트를 진행해서 다행히 괜찮았다. 다른 함수들을 두고, 로그인 함수만 본 그래프다. 보통 어플을 키면 먼저 로그인을 하기 때문에 로그인 수와 하루 이용자 수는 비슷하다. 물론 똑같다고는 말할 수 ..

    MySQL 로그인 (window)

    MySQL 로그인 (window)

    로그인 먼저 mysql이 깔린 곳으로 이동 나의 경로는 C:\Program Files\MySQL\MySQL Server 8.0\bin mysql -u root -p 이동 후 위 커맨드를 쳐서 비밀번호 입력 후 root에 로그인하기 ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (10061) 위와 같은 오류가 뜬다면 mysql 서버가 실행중이 아닌 것이다. 윈도우 서비스 항목(검색하면 나온다)에 들어가서 Mysql80을 서비스 시작한다. C:\Program Files\MySQL\MySQL Server 8.0\bin>mysql -u root -p Enter password: ******** Welcome to the MySQL m..