1. 저장 프로시저(Stored Procedure)란?복잡한 SQL 쿼리문들을 하나의 함수처럼 묶어서 데이터베이스에 미리 컴파일하여 저장해 둔 객체를 말한다. 필요할 때마다 긴 쿼리를 다시 짜는 게 아니라, 이름만 불러서 실행(EXEC 프로시저명)할 수 있다. 💡 함수(FUNCTION)와 다른 점FUNCTION(함수): 반드시 하나의 값을 반환해야 하며, SELECT나 WHERE 절 내부에서 호출된다. 오직 데이터를 읽고 계산하는 용도로만 쓰이며, 내부에서 INSERT/UPDATE 같은 데이터 변경이 엄격히 금지된다.PROCEDURE(프로시저): 독립적으로 EXEC 명령어로 실행되며, 반환값이 없어도 된다. 내부에서 데이터를 자유롭게 수정/삭제할 수 있고 복잡한 트랜잭션 제어가 가능하다.2. 현대 웹 ..
분류 전체보기
프로젝트에서 영수증(매출전표) 이미지를 분석해 상호명, 승인번호, 카드번호, 금액 등을 자동으로 구조화하는 OCR 기능을 검토하게 되었습니다. "비용을 들이지 않는 오픈소스 형태"라는 제약 조건 속에서, 인식률과 속도라는 두 마리 토끼를 잡기 위해 진행했던 최적화 과정을 기록으로 남겨봅니다. 1. 자바 내장 Tesseract의 한계처음에는 스프링 부트(Springboot) 내부에 Tess4J(Tesseract)를 직접 내장하여 OCR을 시도했습니다. 가장 간단하게 구현할 수 있는 선택지이기도 했고, 외부 서버와의 통신이 없기 때문에 아키텍처가 단순하다는 장점이 있었습니다. 직접 구현하여 테스트를 진행해 보니 매출전표나 영수증을 다운로드한 이미지는 꽤나 잘 인식을 했는데, 사용자가 직접 촬영한 영수증 이미..
이번 2024년도 1회 차 필기, 실기를 응시하고 자격을 취득했습니다. 제가 전공을 바꾸고 주변에서 가장 많이 들었던 말이 "개발자로 취업하는데 정보처리기사는 필요 없어."였습니다.그런 안일한 말만 듣고 준비하지 않고 있었고, 어느 순간 깨닫게 되었습니다.정보처리기사가 필요 없다는 말을 하는 사람들 중에 정보처리기사를 갖고 있지 않은 사람은 없었습니다. 그래서 정보처리기사는 일단 기본적으로 따야겠다는 생각으로 단기간 빠르게 준비했습니다. 1. 필기는 CBT, CBT, CBT 그리고 또 CBT저는 개정된 이후의 필기 교재를 구매해서 일단 1 회독을 시작했습니다.처음 목표는 사실 필기가 널널하니깐 실기까지 잡으면서 간다는 마인드로 공부를 시작했습니다.하지만 책에 나오는 모든 내용을 다 정독하면서 암기하기에는..
결론을 먼저 말해보면 둘 다 암호화 기법이지만, 해시(Hash)는 단방향 암호화 기법이며, 암호화(Encryption)는 양방향 암호화 기법이다. 즉, Hash는 평문 데이터를 암호화된 데이터로 바꿀 수 있는 단방향 암호화 기법이고, Encryption은 평문을 암호화된 데이터로 바꾸는 암호화와 암호화된 데이터를 평문 데이터로 바꿀 수 있는 복호화가 존재합니다. 1. Hash해시 알고리즘은 특정 입력 값에 대해서 항상 동일한 결과 값을 리턴하게 됩니다.해시 입력 값은 다르지만, 해시 결과 값은 동일할 수 있습니다. (여기서 중복이 적게 생길수록 좋은 해시 함수입니다.)해시만 적용하는 것으로 완벽한 보안이 될까?사실 어떻게 보안을 해도 어떤 천재 해커나 집요한 해커들에게 뚫릴 가능성이 Zero는 아니기..
비동기 구현을 하려는 이유프로젝트에서 서버에서 발생하는 5xx Exception을 모니터링하기 위해서 Slack WebHook을 사용해서 구현했습니다. 현재 로직은 5xx 예외가 발생 -> Slack 메시지 전송 -> 클라이언트에게 응답까지의 과정이 동기적으로 진행됩니다. 여기서 사용하고 있는 Slack 서버는 제가 제어할 수 없는 부분이기 때문에 만약 Slack 서버에 지연이 생겨 응답을 늦게 준다면 어떻게 될지 생각을 해봤습니다. Slack 메시지 전송이 지연되어 정작 더 중요한 다음 과정인 "클라이언트에게 응답"이 제대로 수행되지 않는다면... 끔찍한 상황이 벌어질 수도 있다고 생각했습니다. 실제로 Slack 메시지를 보내는 push() 메서드에서 5초의 지연 시간을 주고 테스트 해보니 클라이언트에..
이번에 시작한 프로젝트에서 Jenkins를 사용해서 CI/CD 파이프라인을 구성하고 있습니다. develop 브랜치에서 작업을 하고, push를 하면 Jenkins Pipeline이 동작하면서 자동화 배포 작업이 진행됩니다. 우리 프로젝트에서는 다음과 같은 Pipeline이 동작해서 배포를 진행합니다. Git Clone Github Repository의 develop 브랜치에 변화가 발생되면 Jenkins 동작이 시작됩니다. develop 브랜치를 Jenkins 서버로 clone 해서 가져옵니다. DEV-Build 이 과정에서 프로젝트의 Build와 Test를 진행합니다. Deploy Jenkins 서버에서 Develop 서버로 SSH 통신을 통해 배포 스크립트를 실행합니다. 이 글에서는 이 "Deplo..