본문 바로가기

프로그래밍

(91)
[데이터베이스/오라클] 대량 insert 속도 개선 요즘 푸시 발송 속도 개선을 하고 있는데, FCM 발송 후 결과 저장이나 잘못된 토큰 삭제 처리에서 병목이 생기는 것을 확인하였다. 그래서 사용자의 푸시 '알림함'에 대량 insert 하는 부분을 개선하고자 오라클 다중 insert 속도를 개선하는 방법을 찾아보았다. ### 기존 INSERT INTO SOME_TABLE (col1, col2 ..) VALUES (#{val1}, #{val2} ..); ### 1차 수정 하나의 commit으로 처리될 수 있도록 묶었다. (참고로 spring + mybatis 사용하여 처리 중) 로컬 디비로 1000건 insert 테스트 시 26초가 나왔다. BEGIN INSERT INTO SOME_TABLE (col1, col2 ..) VALUES (#{val1}, #{v..
[데이터베이스] FK 쓸까, 말까? 오늘 외래키를 삭제한 이유 완성된 프로그램 솔루션을 납품하는 일은 언제나 커스터마이징과의 싸움입니다. 이 부분을 얼마나 줄일수 있냐에 따라 수익성이 달려 있다고 해도 과언이 아닙니다. 아무것도 없는 허허벌판에 공사를 하는 것은 오히려 쉬울 수 있습니다. 하지만 이미 복잡한 시스템과 체계를 갖추어 놓은 고객사에 납품을 할 때는 생각보다 많은 난관에 봉착하게 됩니다. 오늘은 고객사에서 오라클 데이터베이스의 외래키(FK, Foreign Key)를 삭제해달라는 요구를 받아 검토를 해보았습니다. 이유는 마이그레이션 이유인데요, 외래키를 써야하는 경우와 쓸 수 없는 경우에 대해 정리해보았습니다. 관계형 데이터베이스에서 외래키를 쓰는 & 쓰지 않는 경우 데이터베이스에서 외래키(Foreign Key)는 다른 테이블의 기본키(Primary Key..
[오라클] 시퀀스, sysdate 등을 조회할 때 `FOM DUAL`을 쓰는 이유 오라클에서 시퀀스를 사용하거나 sysdate 따위를 조회할 때 FROM DUAL을 씁니다. 이런 식이죠. SELECT sysdate FROM dual; SELECT SOME_SEQUENCE.nextval FROM dual; 오늘은 협력사 기술지원팀의 신입 개발자 분이 이걸 왜 쓰는지 궁금해 하셨는데, 저도 학생 시절 공부할 때부터 무의식적으로 써오던 터라 명확하게 설명해줄 수가 없었습니다. 그래서 궁금해하실 분들을 위해 글로 정리해보았습니다. MySQL이나 Maria 등과 다르게 왜 오라클에서는 FORM DUAL을 요구할까요? 오라클에서 `FORM DUAL`을 사용하는 이유 Oracle에서 시퀀스나 SYSDATE와 같은 단일 값을 반환하는 함수를 조회할 때 "FROM DUAL" 구문을 사용하는 이유는 다..
특정 아이피의 VIP(Virtual IP) 여부를 확인하는 방법 시스템을 유지보수 하고 있는데, 유지보수를 위해 초기에 넘겨 받은 자료들 중에 인프라에 대한 내용이 조금 부실했습니다. 그래서 운용 도중에 VIP와 Real IP를 구분하지 못해서 인프라 팀에 잘못된 정보를 넘겨주는 등의 해프닝이 가끔 있었습니다. 그래서 VIP를 구분하는 방법에 대해 정리해보았습니다. 특정 IP 주소가 VIP (Virtual IP)인지 실제 IP (Real IP)인지 판별하는 방법은 다음과 같습니다. ARP 테이블 확인 VIP 주소는 여러 대의 서버가 공유하므로 ARP 테이블에서 해당 주소를 확인할 수 있습니다. 만약 VIP 주소가 ARP 테이블에 등록되어 있다면 해당 주소는 VIP 주소입니다. 네트워크 트래픽 분석 VIP 주소로 들어온 트래픽을 분석하여 VIP 주소로 접속한 클라이언트..
데이터베이스에 파일을 blob으로 저장하는 방법 파일을 서버 파일시스템에 저장할 것인지 데이터베이스에 저장할 것인지는 대개는 고려대상이 아닙니다. 데이터베이스는 서버 용량에 비해 매우 비싼 자원입니다. 그럼에도 불구하고 다양한 비즈니스 요구사항에 따라서 데이터베이스에 파일을 저장하는 것을 고려해보아야 하는 경우도 있습니다. 오늘은 다른 회사로 이직한 후배가, 이직한 회사에서는 데이터베이스에 Blob으로 파일을 저장한다며, 이렇게 만드는 경우도 있냐고 해서 관련 내용을 정리해보았습니다. 제가 취준생일 때 이런식으로 설계를 해본 경험이 있는데 여러모로 많은 번거로움에 비해 큰 이점은 느끼지 못했던 방법이었습니다. 제가 아직 그런 경우가 필요한 비즈니스 프로세스를 경험해보지 못했을 수도 있습니다. 데이터베이스에 파일을 Blob 저장할 때 장단점 파일을 데이..
[RESTful API] DELETE 요청에 Body를 사용하지 않는 이유 썰 API 서버에서 HMAC 검증을 추가했는데, 게 중에는 DELETE 메소드를 사용하는 API도 있다. 그런데 iOS 개발팀에서 DELETE 요청에 payload를 담을 수 없으니 이 API만 payload 대신 query string으로 생성한 HMAC으로 검증해달라는 요청을 했다. 이유를 들어보니, 그쪽 진영에서 가장 흔하게 사용하는 라이브러리에서는 DELETE 요청에 payload를 담을 수 없다는 것이다. 그래서 어차피 DELETE가 적합하지 않았던 API라 POST로 변경을 해주고, 관련 내용을 좀 찾아보았다. REST API URL 설계 지침 우선 API URL을 설계할 때에는 다음과 같은 지침을 따르는 것이 좋다. URL은 명사 형태로 작성하고, 동사는 HTTP Method로 나타낸다. U..
아이폰의 모든 브라우저는 사파리다 const isIosApp = window.webkit && window.webkit.messageHandlers; 나는 웹 기반으로 제작된 하이브리드 앱을 유지보수 하고 있다. iOS앱 내부에서 접속되었는지 위와 같은 Javascript 코드를 사용하여 판별했는데, 아이폰의 Chrome 브라우저에서 true가 리턴되는 것을 확인했다. 조금 서칭 해보니, 애플의 정책에 의해 앱스토어에 올라가는 앱들은 웹콘텐츠 로딩을 위해 WebKit 엔진을 사용한다는 내용을 찾을 수 있었다. However, there's one major thing that makes Chrome on iOS very different from all other Chrome platform implementations. Chrome o..
iCloud 파일 경로를 찾을 수 없을 때 웬만하면 작업실에서 모든 개발을 진행하는데, 가끔 집에서 급한 건을 처리해야할 경우가 있습니다. 이번 프로젝트에서는 프로젝트 외부에서 관리하는 프로퍼티 파일을 참조할 일이 있어서 JAVA 환경변수로 등록하여 실행하고 있는데, 프로퍼티를 동일하게 유지하기 위해 iCloud로 옮겼더니 파일을 찾을 수 없다는 오류가 발생했습니다. 톰캣 실행 옵션의 프로퍼티 경로를 확인해보았습니다. -Dconfig.path=/Users/myusername/Library/Mobile Documents/com~apple~CloudDocs/Works/foo.properties 해결 방법 -Dconfig.path=/Users/myusername/Library/Mobile\ Documents/com~apple~CloudDocs/Work..