Spring Data JPA를 사용하면 ddl-auto=update 옵션 하나로 엔티티 변경 사항을 데이터베이스에 쉽게 반영할 수 있습니다. 하지만 서비스가 점차 커지고 실제 운영 환경(Production)에 가까워질수록 이 자동 기능만으로는 한계에 부딪히게 됩니다.단순한 컬럼 추가가 아니라 기존 데이터의 값을 보정해야 하거나, 복잡한 제약조건(Constraint)을 변경해야 할 때 개발자는 딜레마에 빠집니다.이때 활용할 수 있는 강력하고 직관적인 방법이 바로 ApplicationRunner와 JdbcTemplate을 활용한 커스텀 스키마 마이그레이션(Schema Migration) 설정입니다.1. 이 파일(SchemaCompatibilityConfig)의 진짜 용도는 무엇일까요?이 설정 파일은 "스프링..
Spring Data JPA를 처음 접하고 @Query를 작성하다 보면, 기존에 알던 SQL과 쿼리 구조가 달라서 당황하는 순간이 옵니다. 특히 아래와 같은 코드를 마주했을 때 말이죠.@Query("SELECT r FROM Region r WHERE r.name = :name AND r.parent.name = :parentName")Optional findByNameAndParentName( @Param("name") String name, @Param("parentName") String parentName); SELECT * FROM 테이블이 아니라 SELECT r FROM Region r이라고요? 대체 r은 무엇이고, 빈 클래스에 데이터는 어떻게 담겨 오는 걸까요? 오늘은..
웹 서비스에서 잘 작동하던 소셜 로그인을 iOS나 Android 앱에 붙이려다 보면 생각지 못한 리다이렉트(Redirect) 문제에 직면하곤 합니다. 특히 클라이언트가 카카오/네이버 SDK를 직접 사용하는 것이 아니라, 백엔드에서 인증을 처리하고 클라이언트로 결과를 돌려주는 구조라면 더욱 그렇습니다.오늘은 기존 웹 환경에 맞춰진 소셜 로그인 흐름을 앱(iOS) 환경에 맞게 개선하며 겪은 문제와 그 해결 과정을 정리해 보았습니다.1. 기존 웹 기반 소셜 로그인 흐름과 문제점일반적인 웹 환경에서의 소셜 로그인 흐름은 다음과 같습니다.앱(클라이언트)이 "카카오 로그인 화면 열어줘"라고 백엔드에 요청합니다.백엔드는 카카오 로그인 URL을 클라이언트에 반환합니다.iOS 앱이 해당 URL을 브라우저처럼 띄웁니다.사..
https://jwinjection.tistory.com/5 주차감면 키오스크(PyQT,Selenium)| 주차감면 키오스크내가 오자 마자 맡았던 업무 주차권 교부처음에는 주차권에 도장찍어서 교부하는 방식이었는데 그런데 몇달 지나서야주차권 없어지고 사이트를 하나 만들어서 온라인jwinjection.tistory.com사회복무요원 당시 주차감면 키오스크에 이어...| 식권관리시스템우리회사는 식권을 수기로 관리한다... 했다식권관리사이트를 하나 만들어야겠다 생각이 들었다.스프링 부트로 웹을 만들어 아이패드에서 접속했다.골때리는게 아이패드미니 1세대는 JS가 es5 까지밖에 안돼서 api요청시 xhr을 사용해야했다.이번에 회사에서 준 2025년 다이어리의 포장박스와 2024년도 국민은행 달력을 좀 곁들여서 ..
| 주차감면 키오스크내가 오자 마자 맡았던 업무 주차권 교부처음에는 주차권에 도장찍어서 교부하는 방식이었는데 그런데 몇달 지나서야주차권 없어지고 사이트를 하나 만들어서 온라인으로 할수있게 바꾼다고 했다좀 편해지는건가 싶었다.하지만옆자리 다른 공익형이 맘에 안드셨던 담당자는 나랑 그형의 업무를 바꾸셨고 나는 그렇게 등기를 맡게 됐다 그런데 종종 그형은 병가를 아끼지 말아야 한다며 연가 병가를 자주 쓰셨고 안오는날 마다 나 혼자 주차감면도 하고 등기 접수도 받고 바쁜날이 많았다. 온라인으로 시스템이 바꼈다지만 도장찍는 게 그냥 컴퓨터로 옮겨간 느낌이다 사람이 오면 내가 직접 주차관리서버에 들어가 감면신청을 눌러줘야했기때문이다 그리고 주차감면을 받으로 오는 사람들에 대한 코로나 감염위험도 있었기에 직접 키..
내가 복무중인 곳에서 이전 까지의 사회복무요원들은 일일이 수작업으로 업무를 해왔다 나는 이게 너무 시간이 아깝다는 생각이 들었다. 이 프로그램을 통해 매일 아침 데이터를 불러와서 엑셀로 열기를 누르고 이렇게 원본폴더에 저장하고 저 엑셀에 각각의 열을 하나하나 복사해서 이 양식에다가 하나씩 붙여놓고 수령대장이라는 폴더에 오늘날짜로 이름변경해서 저장한 후 수취인명에 있는 이름을 교직원한글파일에서 검색해 학과명을 찾아내서 해당 학과명으로 변경하고 확인이 끝난 행은 저렇게 ㅇ 동그라미를 넣어준후 학과를 그룹으로 노란색 그룹서식을 일일이 넣어주고 복사해주면 끝이다 등기가 2~30개면 할만했는데 입시기간이나 자격증신청기간 뭐 별별 이유로 100~200개가 들어온다..... 점심까지는 그냥 등기만 하다가 끝난다 이당..
1. 멜론어플과 작별인사를 한다 2. 원하는 노래를 재생목록에 저장한다 재생목록 없으면 새로하나 만든다. 3. 내 채널 - 재생목록에 들어간다 4. 재생목록의 제목을 눌러서 재생목록 페이지로 들어간다 5.이게 재생목목록 페이지이다 6.재생목록페이지의 링크를 복사한다 링크형식은 https://www.youtube.com/playlist?list=playlist?list=샬라샬라샬라샬라 이런식으로 되어있다 복사한후 파이썬을 켜주자 7.pip install pytube 로 pytube라이브러리를 설치한다 pip install pyautogui pip install moviepy 등등 필요한거 설치해준다 8. Playlist안에 복사했던 재생목록링크를 넣고 DOWNLOAD\_FOLDER 에는 노래를 저장할 폴더..
지금까지 등기번호 뒤에 4자리 혹은 6자리로 검색해서 체크를 했는데 이게 등기가 많을때에는 다른 등기번호의 중간부분과 겹치는 경우도 있어서 찾기를 여러번 눌러야 제대로 찾는 경우가 있었다 그리고 무엇보다 등기번호보고 숫자 키보드로 검색하는게 은근 귀찮고 비효율적이다 마침 안쓰는 웹캠이 생겨서 모든 등기우편에는 등기번호바코드가 존재한다! 그래서 웹캠을 바코드리더기로 사용하면 매우 편할것같았다 playsound는 에러가 계속떠서 그냥 winsound 이용했다 그리고 웹캠이 연결되어있지 않으면 실행이 되지 않는다 import cv2 import pyzbar.pyzbar as pyzbar import clipboard import pyautogui import winsound as ws #from playsou..
덤프 뜨는법 Format: Custom ✅Do not backup privileges ✅Discard objects owner ✅Add drop database ❌Add create database ❌파일 확장자 .dump ✅ 만약 postgresql 버전 에러가 난다면 해당 db에 맞는 postgresql 을설치하는데 db 서버 까진 설치하지말고command line tools 만 체크하고 설치한다. 그다음 백업(덤프) 팝업창 하단 local client 를 눌러서위에서 설치한 postgresql 버전의 bin 폴더경로를 아래와 같이 적어준다.start누르면 dump 파일 생성 덤프 불러오기Format: Custom ✅Clean(drop) database objects before recreating..
Spring Data JPA를 사용하면 ddl-auto=update 옵션 하나로 엔티티 변경 사항을 데이터베이스에 쉽게 반영할 수 있습니다. 하지만 서비스가 점차 커지고 실제 운영 환경(Production)에 가까워질수록 이 자동 기능만으로는 한계에 부딪히게 됩니다.단순한 컬럼 추가가 아니라 기존 데이터의 값을 보정해야 하거나, 복잡한 제약조건(Constraint)을 변경해야 할 때 개발자는 딜레마에 빠집니다.이때 활용할 수 있는 강력하고 직관적인 방법이 바로 ApplicationRunner와 JdbcTemplate을 활용한 커스텀 스키마 마이그레이션(Schema Migration) 설정입니다.1. 이 파일(SchemaCompatibilityConfig)의 진짜 용도는 무엇일까요?이 설정 파일은 "스프링..
Spring Data JPA를 처음 접하고 @Query를 작성하다 보면, 기존에 알던 SQL과 쿼리 구조가 달라서 당황하는 순간이 옵니다. 특히 아래와 같은 코드를 마주했을 때 말이죠.@Query("SELECT r FROM Region r WHERE r.name = :name AND r.parent.name = :parentName")Optional findByNameAndParentName( @Param("name") String name, @Param("parentName") String parentName); SELECT * FROM 테이블이 아니라 SELECT r FROM Region r이라고요? 대체 r은 무엇이고, 빈 클래스에 데이터는 어떻게 담겨 오는 걸까요? 오늘은..