Solutions
[SQL Server] 암호화 된 View 다루기
[SQL Server] 암호화 된 View 다루기
2025.01.03뷰는 쿼리 결과 집합을 논리적으로 나타낸 결과물으로 가상 테이블처럼 사용하는 경우가 많다. 자주 사용되는 복잡한 쿼리가 있을 때 뷰로 추상화해서 간단한 SELECT 구문으로 복잡한 쿼리를 쉽게 사용하거나, 특정 테이블에서 민감한 정보를 제외하고 뷰를 만들어 특정 컬럼만 노출시킬 때 사용하는데.. 예전에 경험한 프로젝트에서는 개발자가 이메일, 전화번호, 카드번호 등 고객의 민감한 정보가 담긴 테이블에 직접 접근하는 대신 민감한 정보가 암호화된 뷰를 통해 우회적으로 접근하는 경우도 있었다. exec sp_helptext 'VIEW_NAME'; SQL Server에서는 해당 프로시저를 사용해 뷰가 어떤 쿼리로 정의되어있는지 확인할 수 있는데.. CREATE VIEW VIEW_NAMEWITH ENCRYPTI..
[MySQL] WITH RECURSIVE 계층 쿼리
[MySQL] WITH RECURSIVE 계층 쿼리
2024.12.13Oracle에서는 트리 형태의 계층 구조를 가진 데이터를 쿼리로 뽑아낼 때 CONNECT BY / START WITH 구문으로 쉽게 작성할 수 있는데.. MySQL에서는 전용 구문을 제공하지 않아 백엔드 레벨에서 데이터를 가공하거나 여러 집계 쿼리를 사용해 우회해서 쿼리를 작성해야 됐다. MySQL 8.0 버전부터는 Common Table Expression을 지원하고, 이 구문을 활용해 CONNECT BY / START WITH 구문 없이 재귀적 계층 쿼리를 작성할 수 있다. WITH RECURSIVE 구문으로 임시테이블을 정의하고 해당 테이블을 스스로 다시 참조하는 방식이다. WITH RECURSIVE TEMP_TABLE AS ( -- 시작점 (앵커 쿼리) SELECT ... F..
[Nginx] 리버스 프록시 서버 구축
[Nginx] 리버스 프록시 서버 구축
2024.11.13Nginx는 프론트엔드의 정적 리소스를 서빙하는 웹서버 역할도 수행할 수 있지만, 클라이언트의 요청을 받아서 Tomcat 같은 WAS로 요청을 넘겨주는 리버스 프록시 서버 역할도 수행할 수 있다. 리버스 프록시로 동작하는 Nginx 서버를 구축해보자. # 사용하는 CPU 수worker_processes 1;# 로그 기록 위치와 로그 수준error_log logs/error.log info;# 재시작시 사용되는 pid 저장 경로pid pid/nginx.pid;# worker 프로세스당 4096개 연결 처리events { worker_connections 4096;}http { # nginx 버전 숨기기 server_tokens off; # MIME 정의 파일 ..
[Tomcat] 네트워크 드라이브 권한 관련 오류
[Tomcat] 네트워크 드라이브 권한 관련 오류
2024.11.09윈도우 환경에서 외장 Tomcat으로 스프링부트 애플리케이션을 WAR로 패키징해서 배포할 때, 스프링부트의 내장 Tomcat을 사용할 때는 잘 접속되던 네트워크 드라이브에 접속이 안 되는 오류가 발생했다. 테스트 해 보니, 외장 Tomcat을 사용해서 startup.bat 스크립트를 직접 실행할 때도 네트워크 드라이브에 제대로 접속됐다.아마 Tomcat을 서비스로 등록해서 실행했던 부분에서 문제가 발생한 것 같은데.. 가장 먼저 계정을 확인해보자. Tomcat GUI 에서도 접근하려는 네트워크 드라이브에 대한 권한이 있는 계정을 설정하고, 서비스 콘솔에서도 적절한 계정을 설정해주자. 기본적으로 서비스로 등록된 Tomcat은 로컬 시스템 계정으로 실행되고, startup.bat 으로 Tomc..
[PDF.js] PDF.js 완벽 가이드
[PDF.js] PDF.js 완벽 가이드
2024.11.07PDF.js는 웹에서 PDF 를 다룰 때 필요한 거의 모든 기능을 제공하는 라이브러리로 몇십년 전 부터 현재까지 꾸준히 업데이트 되고 있다. 처음 라이브러리를 사용했던건 3년 전 정도인데.. 그때와 현재를 비교해도 정말 많은 기능이 추가됐다.뭔가 PDF 관련 기능을 만들어야 할 때 개발하기 전 PDF.js 라이브러리가 제공하는 기능인지 먼저 확인하자. (https://github.com/mozilla/pdf.js) npm을 통한 설치 / cdn을 사용해 script 태그로 추가 / 깃허브나 공식사이트에서 다운로드 크게 세 가지 방법으로 초기 세팅을 마치고 필요한 기능이나 디자인을 추가하거나 수정하자. 개발하면서 겪었던 몇 가지 이슈사항을 정리한다. 1. 한글 폰트 관련 문제 PDF.js 는 cma..
[Spring Batch] 메타데이터 테이블과 시퀀스
[Spring Batch] 메타데이터 테이블과 시퀀스
2024.11.05org.springframework.dao.DataAccessResourceFailureException: Could not obtain sequence value 스프링배치로 애플리케이션을 만들고 실행할 때 실행 관련 상태를 저장하는 메타데이터 테이블을 관리하게 된다. 시스템에서 SQL Server를 사용하는 경우 메타데이터 테이블에 값을 넣을 때 시퀀스 객체를 사용하는데.. 해당 DBMS에서 시퀀스 객체를 지원하지 않는 경우 위와 같은 오류가 발생한다. 소스코드를 까보면 DefaultDataFieldMaxValueIncrementerFactory 클래스를 확인할 수 있다. public class DefaultDataFieldMaxValueIncrementerFactory implements Dat..
[Spring Security] 인증 실패 오류 다루기
[Spring Security] 인증 실패 오류 다루기
2024.06.20스프링 시큐리티에서는 인증 관련 예외가 발생한 경우 AbstractUserDetailsAuthenticationProvider 가 클래스 내부의 hideUserNotFountExceptions 변수를 확인하고 발생한 예외를 BadCredentialsException 예외로 변환해 어떤 예외가 종류의 예외가 발생했는지 감춘다. // AbstractUserDetailsAuthenticationProvider.class@Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { Assert.isInstanceOf(UsernamePasswordAuthenticationToken..
[SQL Server] 지원하지 않는 TLS 버전 설정
[SQL Server] 지원하지 않는 TLS 버전 설정
2024.06.05jdk17 버전을 사용하면서 SQL Server 2005 데이터베이스와 통신하려 할 때 오류가 발생했다. Caused by: cohttp://m.microsoft.sqlserver.jdbc.SQLServerException: "encrypt" 속성이 "false"(으)로 설정되고 "trustServerCertificate" 속성이 "true"(으)로 설정되었지만 드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Server에 대한 보안 연결을 설정할 수 없습니다. 오류: The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]. ClientConnection..
대용량 파일 업로드 처리 (30GB)
대용량 파일 업로드 처리 (30GB)
2023.12.03FastAPI에서 대용량 파일 업로드 기능을 구현해보자. 프론트엔드에서 백엔드로 요청을 보낼 때는 axios를 사용하고, FastAPI의 웹서버 구현체로는 uvicorn을 사용한다. 1. 타임아웃 설정 용량이 크다 보니 데이터를 주고받는데 시간이 많이 소요될 수 있다.uvicorn과 axios 부분을 조작해 타임아웃 기간을 늘리자. uvicorn app:app --timeout-keep-alive 1200 우선 uvicorn에서는 --timeout-keep-alive 속성값으로 uvicorn 서버가 클라이언트와의 비활성 HTTP 연결을 얼마나 오래 유지할 지 설정할 수 있다. 예시는 1200초동안 연결이 비활성화 상태로 유지되면 자동으로 닫히도록 설정한다. upload_axios_timeout: ..
[JavaScript] Shadow DOM 다루기
[JavaScript] Shadow DOM 다루기
2023.11.22다른 사람이 만든 자바스크립트 라이브러리를 사용해 원하는 기능을 구현하고, CSS를 적용할 때 렌더링된 결과를 개발자 도구를 통해 살펴보면 #shadow-root 라는 부분이 나타날 때가 있다. #shadow-root는 웹 컴포넌트의 Shadow DOM을 나타내는 용어로, 스타일과 마크업을 실제 DOM에서 격리시켜 컴포넌트의 내부 구현을 캡슐화하는 도구로 사용된다. Shadow DOM 내부의 스타일은 해당 DOM에만 적용돼 격리된 UI 컴포넌트를 만들 때 사용할 때 사용된다. Vue에서는 DOM을 추상화한 Virtual DOM을 사용해 실제 DOM에 접근하고 조작하는 비용을 최소화하고, Shadow DOM은 웹 컴포넌트의 캡슐화와 스타일 격리를 위해 사용된다. 이전에 wav파일을 시각화하는 자바스크립..
[Vue] map 함수와 Vue3의 반응형 시스템
[Vue] map 함수와 Vue3의 반응형 시스템
2023.11.16서버에서 데이터를 받아오고, 받아온 데이터를 v-for 반복문을 사용해서 렌더링한다고 생각해보자. {{ subject.subject_no }} 성별 여성 남성 연령(개월) {{ subject.age_month }} --> ..
[Git] Git 협업 시 충돌 해결
[Git] Git 협업 시 충돌 해결
2023.11.14A와 B 두 명이서 협업을 하고 있다고 하자. A는 101까지 작업을 진행하고 커밋 및 원격 저장소에 push 했고, B는 101까지 진행된 작업을 pull 받아서 이어서 작업을 진행했다.이후 A와 B는 각각 이어서 작업을 진행해 102A - 103A / 102B - 103B 까지 작업했고, B는 103B 까지 작업한 내용을 커밋 후 원격 저장소에 push 했다. 이후 A가 103A까지 작업한 내용을 커밋 후 원격 저장소에 반영하려면 원격 저장소의 최신 변경사항 (103B) 을 로컬 저장소로 가져온 후 103A 관련 작업을 커밋해야 한다. git pull origin master 명령어를 통해 원격 저장소의 변경 사항을 가져올 수 있는데...A와 B가 동일한 파일의 같은 부분을 수정하고 각각 커밋했다면 ..