[react/useRef] ref 를 배열로 관리하는 샘플

By | 3월 4, 2022

개요 가변적으로 row가 추가되는 동적 UI에서 각 컴포넌트의 데이터 초기화, focus 등을 수행하기 위해 ref 가 필요한 사례가 있었음. (ref 배열, array) 소스 const testRefs = useRef<any>([]); … <Input ref={ (el) => (testRefs.current[idx] = el) } … /> … const ref = testRefs.current[idx]; …

moment.js 에서 timezone 을 적용한 date 객체 다루는 샘플

By | 3월 4, 2022

환경 react 17.0.2 moment-timezone 0.5.34 소스 import moment from 'moment-timezone'; // tz 를 사용하려면 이걸로 import 해야 함. // 기본 timezone 지정 const DEFAULT_TIMEZONE = 'Asia/Seoul'; // const DEFAULT_TIMEZONE = 'America/New_York'; // 날짜 기간 검색시 기본 기간 export const DEFAULT_SEARCH_PERIOD_DAYS = 7; const cur = moment.tz(new Date(), DEFAULT_TIMEZONE); const start = cur.clone().add((-1 * DEFAULT_SEARCH_PERIOD_DAYS), 'days');… Read More »

[python] 모델(VO) 클래스 정의 샘플

By | 3월 4, 2022

환경 python 3.9 pydantic 1.9.0 sqlalchemy 1.4.31 fastapi 0.73.0 소스 # 리스트 내 요소 모델 class Prod(BaseModel): field1: Optional[str] field2: Optional[int] field3: Optional[Union[str, List[str]]] # 두 가지 타입을 받을 수 있도록 Union 처리 # 리스트 모델 class TestModel(BaseModel): site_id: Optional[int] update_time: Optional[datetime] alias: Optional[str] path: Optional[str] prod_list: Optional[List[Prod]] # 목록(리스트,List)형 파라미터 consume # DB 모델… Read More »

[python] hex encode/decode 유틸 샘플

By | 3월 4, 2022

환경 python 3.9 소스 """ 평문을 인수로 받아서 hex encoded string을 리턴한다. """ @staticmethod def encode_hex(src: str): if not src: return '' return src.encode('utf-8').hex() """ hex encoded string을 인수로 받아서 평문을 리턴한다. """ @staticmethod def decode_hex(enc: str): if not enc: return '' return bytearray.decode(bytearray.fromhex(enc))

에러 메시지 피드백(alert, toast 유형)에 lodash debounce 적용 사례

By | 5월 10, 2022

개요 react axios 공통화 작업(interceptor 등)을 하던 중, 에러 메시지 알림에 debounce 처리를 해야 하는 요건이 발생. 소스 axios-settings.ts (커스텀 파일) /** * axios 기본설정 */ const axiosOpts = { // timeout: 5000, // headers: { // "Content-Type": "application/json", // }, }; // export const ax = Axios.create(axiosOpts); // /** * axios response interceptor */… Read More »

[Python] FastAPI, pydantic 환경에서 api response 수정하는 샘플 (MySql datetime 의 utc 정보 포함한 json encode)

By | 2월 18, 2022

환경 python 3.9 fastapi 0.73.0 pydantic 1.9.0 (VO객체 validtion, json encode/decode 등에 관여하는 라이브러리로 보임) 이슈 MySql에서 select한 datetime 컬럼을 별도의 형식 변환 없이 React client에 전달하고, React에서는 dayjs 를 사용하여 포맷팅/출력 해 주고 싶다. 현재는 api response에 타임존(timezone) 정보가 없기 때문에 국제화 출력이 불가한 상태 현재 DB의 timezone은 KST가 아닌 UTC라고 가정한다. 해결 기본적으로… Read More »

IntelliJ 다중 모듈 프로젝트(multi module project) 셋팅 관련

By | 2월 11, 2022

요건 A가 api 프로젝트고 B가 lib 프로젝트라고 했을 때, A가 컴파일시 B를 참조하는데, B의 수정사항을 즉시(B의 maven install을 거치지 않고 컴파일 만으로) A가 사용할 수 있게 하고 싶다. 프로젝트 구성 A의 pom.xml 에는 maven install 된 B.jar가 하나의 dependency 로 들어가 있다. 문제상황 B에 신규 메서드를 추가하고 컴파일 한 후, A에서 B의 신규 메서드를 사용하려고… Read More »

JEUS 에서 MultipartFile 저장시, 서버 루트 경로(/) 가 아닌 JEUS 어플리케이션 배포 경로를 기준으로 파일을 기록하려 시도하는 경우

By | 12월 22, 2021

진짜 JEUS는 알면 알수록, 겪으면 겪을수록 짜증이 난다. 톰캣에서는 잘 도는 것들이 왜 이리 안되는 것들이 많은지. 기존 오류 발생 코드 (MultipartFile => File) 이렇게 할 경우, targetFile의 위치가 엄연히 /로 시작하는 서버 루트에서부터의 경로임에도 불구하고, JEUS application 배포 경로부터 시작하는 긴 경로에서 파일을 찾아 기록하려고 하다가 에러를 발생시킨다. mFile.transferTo(targetFile); 수정한 코드 (MultipartFile => File)… Read More »

java.sql.SQLException: Protocol violation [ 0, ] … 사례

By | 12월 14, 2021

처음에는 오라클 db의 문제라고 생각했었으나, 로그를 거슬러 올라가니 OOME(GC overhead limit exceeded)가 원인임을 알게 되었다. 왜 OOME가 났는지 서버설정을 살펴보니, 누가 3기가로 설정해 놨던 heap memory를 1기가로 줄여놓았던 것이 원인이었다. 아놔..

org.apache.xerces.jaxp.SAXParserFactoryImpl cannot be cast to javax.xml.parsers.SAXParserFactory 오류 해결

By | 12월 10, 2021

환경 spring boot 1.5.22 (spring 4.3.25) JEUS 7 Fix#5 개요 잘 돌던 시스템이, apache poi를 pom에 추가한 시점부터 JEUS 서버 기동시 오류를 내뿜었다. (주로 logback.xml 을 읽지 못했다… 라는 내용의 로그였음) 해결 pom.xml > dependency > poi-ooxml 에 아래와 같이 exclusion 처리 추가 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> <exclusions> <exclusion> <groupId>xml-apis</groupId> <artifactId>xml-apis</artifactId> </exclusion> </exclusions> </dependency> 출처… Read More »

[React] SWR 조회시 무한루프에 걸렸던 사례 (useSWR, infinite loop)

By | 11월 4, 2021

모듈 상단에서 아래의 swr함수를 호출하는데, useMemo()가 불필요하다고 생각되어 제거했더니 무한루프가 걸렸었음. swr의 args로 들어가는 url string이 함수 내부에서 생성되어 계속 변경이 되니 무한루프가 발생했던 것이었음. 결국 useMemo()를 다시 사용하여 해결 function useSWR(type: string, query?: any) { const url = useMemo(() => { switch(type){ case '1': return '/board/01'; case '2': return '/board/02'; default: return null; }… Read More »