[Java/Spring Boot] AWS 환경에서 DB 직접 접근이 어려운 경우: Java 애플리케이션에서 SQL 파일을 실행하여 데이터 삽입하기
·
개발 (Development)/Java
회사 프로젝트 중 AWS에 배포된 서비스 환경에서는 보안상의 이유로 데이터베이스에 직접 접근할 수 없었습니다. 운영 서버에서 PostgreSQL DB를 직접 수정하거나 삽입 쿼리를 실행하는 것이 제한되었고, SSH나 DB 툴 접속도 허용되지 않았습니다.이러한 제약을 해결하기 위해, Java 애플리케이션 내부에 SQL 파일을 포함시키고 애플리케이션 실행 시 이를 실행하도록 구성하는 방식을 선택했습니다. 과정 중 삽입 대상 데이터에 문자열로 포함된 세미콜론(;) 때문에 실행 오류가 발생하는 중요한 시행착오도 있었기에, 그 내용을 중심으로 아래와 같이 단계별로 정리합니다.1. Python으로 CSV 파일을 읽어 INSERT SQL 생성우선 삽입할 데이터는 CSV 형태로 정리되어 있었습니다. 이를 기반으로 Py..
[Java] Java jar 파일에서 리소스 파일 경로 사용하는 법
·
개발 (Development)/Java
Java 프로젝트를 jar 파일로 패키징한 뒤 실행할 경우, 개발 중에는 문제없던 리소스 파일 경로에서 오류가 발생하는 경우가 많습니다. 특히 설정 파일, 쿼리 템플릿 등 리소스 파일을 다룰 때 자주 마주치는 문제입니다. 그 원인과 해결 방법을 단계적으로 정리해보았습니다.1. 개발 중엔 되는데, 배포 후 오류?개발 환경에서는 다음과 같은 코드로 파일을 불러와도 문제가 없습니다.File file = new File("src/main/resources/config/config.json");하지만 jar 파일로 패키징한 후 실행하면 FileNotFoundException이 발생합니다. 이는 jar 내부에 있는 리소스는 실제 파일이 아니라 classpath 내에 존재하기 때문입니다.2. jar 내부 리소스는 C..
[Java/Spring Boot] Spring Boot + MyBatis 환경에서 쿼리 조회용 API를 만들기 전에 꼭 고려해야 할 5가지
·
개발 (Development)/Java
회사 내부 시스템에서 데이터를 빠르게 조회하기 위한 목적으로 Spring Boot + MyBatis + PostgreSQL 기반 백엔드 앱에 간단한 쿼리 조회용 API를 추가하고자 했습니다.하지만 단순히 API를 만드는 것만으로 끝나지 않고, 실무에서는 몇 가지 중요한 점들을 반드시 고려해야 한다는 사실을 알게 되었습니다. 이 글에서는 조회용 API를 만들기 전 꼭 고민해야 할 사항들을 정리해봅니다.1. 보안 이슈가장 주의해야 할 부분입니다.조회 전용이라고 해도 다음과 같은 보안 취약점에 노출될 수 있습니다.SQL 인젝션 위험: 입력받은 쿼리를 그대로 실행하면 악의적인 요청이 DB를 손상시킬 수 있습니다.인증/인가 없이 데이터 노출: 내부용이라도 인증 없이 공개되면 사용자 정보, 로그 등 민감한 데이터가..
[Java] 사내망에서 Gradle 빌드 시 PKIX 인증서 오류 해결기 (feat. 프록시 & 인증서 등록)
·
개발 (Development)/Java
최근 사내 개발 환경에서 Gradle 기반의 Spring Boot 프로젝트를 빌드하는 과정에서 아래와 같은 에러를 겪었다.Could not resolve org.springframework.boot:spring-boot-gradle-plugin:2.7.14PKIX path building failed: unable to find valid certification path to requested target처음에는 단순히 버전 오류나 저장소 설정 문제인 줄 알고 build.gradle과 settings.gradle을 점검했지만, 문제는 훨씬 더 깊은 곳에 있었다. 아래는 내가 이 문제를 해결해 나갔던 순차적인 과정이다.1. Gradle 설정 점검부터 시작// settings.gradlepluginMana..
[Java/MyBatis] MyBatis <foreach>에서 #{}와 ${} 차이, 그리고 item 두 번 쓰기
·
개발 (Development)/Java
MyBatis에서 는 IN 조건이나 다중 INSERT와 같이 반복적인 SQL을 작성할 때 아주 유용하게 쓰입니다. 하지만 이 안에서 item을 여러 번 참조하거나, #{}와 ${} 중 어떤 걸 써야 하는지 헷갈릴 수 있습니다. 이 글에서는 그 차이점과 실전에서 어떻게 써야 안전하고 효율적인지 정리해보겠습니다.#{} vs ${} 차이점구분#{}${}방식PreparedStatement 방식문자열 치환 방식용도값 바인딩 (WHERE, VALUES 등)컬럼명, 테이블명 등 SQL 조각 삽입장점SQL 인젝션 방지, 자동 타입 변환, 성능 최적화동적인 SQL 문 구조 만들기 가능단점컬럼명/테이블명 등 SQL 구조에는 사용 불가SQL 인젝션 위험 있음, 성능 저하 가능보안안전검증 없으면 매우 위험예시 비교 #{id..