전체 글 376

(Oracle) 계층형 쿼리 START WITH CONNECT BY PRIOR

Oracle 계층형 쿼리 START WITH CONNECT BY PRIOR오라클 쿼리 분석 과정에서 'START WITH ~ CONNECT BY PRIOR (+ ORDER SIBLINGS BY)'라는 계층형 쿼리 구문을 발견하여 관련 내용을 정리해 보았습니다.  계층형 쿼리란?데이터베이스에서 계층적인 구조를 가진 데이터를 조회하거나 조작하기 위해 사용되는 쿼리입니다.대표적으로 '기업의 조직도', '제품 카테고리', '게시글 및 댓글' 같은 데이터 유형이 계층 구조를 가질 수 있으며, 이러한 데이터를 효율적으로 다루기 위해 계층형 쿼리를 사용합니다. START WITH ~ CONNECT BY PRIOR'START WITH ~ CONNECT BY PRIOR' 구문은 오라클에서 계층형 쿼리를 위해 지원되는 기..

Programming/Oracle 2024.02.18

mac Oracle 설치 및 SQL Developer 연결

macOS Oracle 설치 및 SQL Developer 연결하는 과정 해당 포스팅에서는 'macOS(Intel)에서 Oracle 설치 및 SQL Developer를 연결하는 과정'을 정리하였습니다. Oracle이 macOS를 정식 지원하지 않기 때문에 docker를 통해 오라클 데이터베이스를 실행하고 연결하는 방식을 사용하였으며, docker 설치 및 로그인은 되어 있다는 가정 하에 이후 과정에 대한 설명이라는 점 참고 부탁드립니다. docker를 통한 oracle 실행 -- 이미지 검색하기 docker search oracle-xe -- 이미지 가져오기(다운로드) docker pull oracleinanutshell/oracle-xe-11g 'search' 명령어를 통해 docker image를 검색..

Programming/MacOS 2024.02.17

Java 운영체제(윈도우, 리눅스) 프로세스 상태 확인하는 방법

Java 운영체제 프로세스 상태 확인 방법(Process, ProcessBuilder) 최근 Java 코드를 사용하여 서버의 특정 포트를 사용하는 프로세스의 상태를 확인하는 기능이 필요했는데요. 'java.lang.Process', 'java.lang.ProcessBuilder' 클래스를 사용하여 '운영체제(windows, linux)에 따른 프로세스 상태를 확인하는 방법'에 대해 정리해 보았습니다. 내용의 핵심은 'Process', 'ProcessBuilder'이며, Process는 Java 외부 프로세스를 실행하고 제어할 수 있기 때문에 해당 클래스를 활용하면 프로세스의 상태를 확인하는 기능뿐만 아니라 프로세스와 관련된 다양한 기능들을 구현할 수 있다는 것입니다. Process Class 'java...

Programming/Java 2024.02.11

스프링 부트 내장 톰캣 제거 방법 (exclude embedded tomcat)

Spring Boot 내장 톰캣 제거 방법 (exclude embedded tomcat) 'spring-boot-starter-web' 의존성에는 기본적으로 톰캣 라이브러리가 내장되어 있으며, 애플리케이션 실행 시 내장 서블릿 컨테이너인 톰캣(tomcat)이 자동으로 설정되어 동작합니다. 하지만 스프링 부트 프로젝트를 외부 WAS에서 동작해야 하는 경우나, 내장 서블릿 컨테이너를 톰캣이 아니나 다른 것으로 사용하고 싶은 경우, 배치 프로세스나 백그라운드 작업처럼 웹 서버가 필요하지 않은 경우 Spring Boot 내장 톰캣을 제거해야 할 수 있는데요. 아래 내용은 'Spring Boot 프로젝트에서 내장 톰캣을 제거하는 방법 및 내장 서블릿 컨테이너를 톰캣이 아닌 다른 것으로 바꾸는 방법'을 정리하였습니..

스프링부트 내장 톰캣(서블릿 컨테이너) 실행되는 과정

Spring Boot 내장 서블릿 컨테이너가 실행되는 과정 최근 스프링부트 프로젝트의 내장 톰캣을 제거하는 과정에서 '내장 서블릿 컨테이너가 자동으로 실행되는 과정'이 궁금하여 관련 내용을 디버깅하며 정리해 보았습니다. SpringApplication.run() public ConfigurableApplicationContext run(String... args) { // ... ConfigurableApplicationContext context = null; try { // ... // 1. ApplicationContext 생성 context = createApplicationContext(); context.setApplicationStartup(this.applicationStartup); //..

CentOS MariaDB 오프라인 수동 설치 방법 (tar.gz 파일)

CentOS MariaDB 오프라인 수동 설치 방법 매번 인터넷이 되는 환경에서 apt(Advanced Package Tool)를 통해 mariadb, mysql 등의 DBMS를 설치하다가 이번에 CentOS 7 폐쇄망 환경에서 mariadb를 수동으로 설치해 보게 되었는데요. 생각보다 시간이 좀 걸리기도 했고 앞으로 종종 설치할 일이 있을 것 같아 내용을 정리하게 되었습니다. *** 우선 폐쇄망이라고 할지라도 서버 내에 설치에 필요한 파일을 옮길 수는 있어야 한다는 전제조건이 있습니다. (해당 예시에서도 서버에 'mariadb-10.10.7-linux-systemd-x86_64.tar.gz' 파일을 가지고 시작합니다.) https://mariadb.org/download 먼저 mariadb 다운로드 페..

Programming/Linux 2024.02.01

MySQL CTE란? (+ WITH RECURSIVE CTE)

MySQL CTE(Common Table Expression)란? 최근 SQL 문에서 'WITH RECURSIVE CTE'라는 구문이 사용되는 것을 보고 공식 문서를 참고하여 관련된 기본적인 내용을 정리하게 되었습니다. CTE란? 'CTE(Common Table Expression)'는 하나의 쿼리문 범위 내에서만 존재하며 여러 번 참조될 수 있는 이름이 지정된 일회성 테이블(정확하게는 결과 데이터)입니다. CTE에는 '비재귀적(Non-Recursive) CTE'와 '재귀적(Recursive) CTE' 두 가지가 있으며, 아래 내용을 통해 각각에 대해 예시를 포함하여 자세하게 살펴보도록 하겠습니다. * CTE는 MySQL 8.0.1 버전에서 도입되었으며, ANSI-SQL99 표준에서부터 나온 것이기 때문..

ThreadPoolTaskScheduler를 통해 스케줄러 동작 시간 동적으로 변경하기

ThreadPoolTaskScheduler를 통해 스프링 스케줄러 동작 시간 동적으로 변경하는 방법 기존에는 스케줄링 기능이 필요할 때 '@Scheduler' 어노테이션을 통해 간단하게 스케줄러 기능을 사용했었는데요. 이번에 외부에서 받은 값을 통해 스케줄링 시간을 동적으로 변경하는 기능이 필요하여 알아보던 중 'ThreadPoolTaskScheduler'를 알게 되어 관련 내용을 직접 테스트해 보며 정리한 내용입니다. ... (생략) (root-context.xml 파일 중 스케줄러 관련 task 설정이며, task 외 부분은 생략되었습니다.) 위 코드는 스프링에서 스케줄러를 사용하기 위해 root-context.xml 파일에 task 관련 설정을 추가한 내용입니다. ThreadPoolTaskSched..

Programming/Spring 2024.01.24

(spring) web.xml, root-context.xml, servlet-context.xml 각각의 역할과 차이점

web.xml, root-context.xml, servlet-context.xml 각각의 역할과 차이점 최근 선언적 트랜잭션을 사용하기 위한 설정을 하는 과정에서 'root-context.xml' 파일과 'servlet-context.xml' 파일, 'web.xml' 파일의 역할과 차이점에 대한 궁금증이 생겨 정리한 내용입니다. 본격적인 내용에 앞서 Spring 프로젝트에서 xml 파일은 1. 애플리케이션 컨텍스트를 설정하는 데 사용되거나, 2. 웹 애플리케이션의 구성을 지정하는 데 사용되는데요. 1. 애플리케이션 컨텍스트를 설정하는 xml 파일의 경우에는 빈(Bean)의 생성과 다른 빈에 대한 의존성, AOP 설정, 프로퍼티 설정 등을 포함합니다. (root-context.xml, servlet-co..

Programming/Spring 2024.01.16

mysql mybatis 다중 insert 처리 방법

MySQL MyBatis foreach를 사용한 다중 insert 처리 방법 해당 포스팅은 mysql + mybatis 환경에서 여러 건의 데이터를 insert 해야 할 때 mybatis에서 지원하는 foreach 문을 활용하여 효율성을 높이는 방법에 대한 내용입니다. (아래 예시를 통해 살펴보겠지만 자바 내부적으로 for 문을 사용하여 1건씩 insert 처리를 하는 것은 상당히 비효율적인 방식입니다.) * mysql의 경우 아래 예시 방식이 적용되지만 oracle 등 다른 RDBMS의 경우 방식이 다를 수 있습니다. for 문을 통한 방식의 비효율성 public void insertExample1() { List productList = createProduct(2); for (Map productM..

Programming/Spring 2024.01.14

Spring Legacy @Transactional 동작하지 않는 문제 (tx:annotation-driven)

Spring Legacy Project @Transactional 동작하지 않는 문제 해당 포스팅은 '스프링 프로젝트에서 @Tranactional 어노테이션이 동작하지 않는 문제를 해결'하며 정리한 내용입니다. 결론적으로 트랜잭션이 동작하지 않았던 원인은 'root-context.xml' 파일과 'servlet-context.xml' 파일에 대한 설정이 잘못되었기 때문이었는데요. * 그중에서도 '' 아래 내용을 통해 트랜잭션이 동작하지 않았을 때의 설정과 어떻게 수정하여 해결하였는지 살펴보겠습니다. 트랜잭션이 동작하지 않을 때 설정 (root-context.xml) Spring Proejct에서 트랜잭션을 사용하는 방법을 찾아보니 대부분 다음과 같이 root-context.xml 파일에 'transact..

Programming/Spring 2024.01.11

eclipse Spring Legacy Project 생성 과정에서 발생한 오류

eclipse Spring Legacy Project 생성 과정에서 발생한 오류 '이클립스 환경에서 Spring Legacy Project를 생성하는 과정에서 발생한 아래 두 가지 오류와 해결 방법'을 정리한 내용입니다. 관련 오류들이 발생하는 가장 주된 원인은 eclipse와 java 버전이 호환되지 않아 발생하는 것이며, sts 버전에 따라서도 원인과 해결 방법이 다를 수 있다는 점 참고 부탁드립니다. * 오류가 발생했던 작업 환경은 다음과 같습니다. macOS Monterey 12.5.1 버전 / eclipse 2022-03 (4.23.0) 버전 / Spring Tools 3 (Standard Edition) 3.9.14.RELEASE / Spring Tools 3 Add-On for Spring ..

Programming/Error 2024.01.07

Mac Java version(JDK 버전) 변경하는 방법

MacOS Java version(JDK 버전) 변경하는 방법 해당 포스팅은 'MacOS에서 설치된 Java 버전(Java 환경변수)을 변경하는 방법'에 대해 정리한 내용입니다. (Java 환경변수에 대해 일시적으로 설정을 바꾸는 방법이 아니라 'zshrc' 또는 'bash_profile'의 수정을 통해 영구적으로 바꾸는 것입니다.) zsh와 bash 차이점 'zsh'와 'bash'는 둘 다 리눅스 쉘(Shell)의 한 종류입니다. 쉘은 명령어와 프로그램을 실행할 때 사용하는 인터페이스로 커널(Kernel)과 사용자 간의 다리 역할을 하며, 사용자로부터 명령을 받아 그것을 해석하고 프로그램을 실행하는 역할을 하게 됩니다. 'bash'와 'zsh' 둘 다 'sh' 쉘을 기반으로 만들어졌으며, 쉽게 Unix..

Programming/MacOS 2024.01.07

(spring) 싱글톤 객체의 다중 요청 처리 방법

싱글톤 객체의 다중 요청 처리 방법에 대한 의문점 뜬금없이 RestTemplate은 싱글톤 형식의 스프링 빈으로 등록하여 사용되는데 RestTemplate의 특성(blocking + 동기) 상 먼저 들어온 요청에 대한 응답이 늦게 와서 그동안 물려있다면 다음 요청은 먼저 들어온 요청이 완료되고 수행되는 것인가? 라는 의문이 들었습니다. 그러면 RestTemplate 뿐만 아니라 스프링 빈으로 등록되는 Controller, Service 등의 객체 역시 싱글톤으로 생성되는데, '(멀티스레드 환경에서) 싱글톤 객체에 대해 다중 요청이 처리되는 방식은 무엇일까?'가 궁금하여 찾아본 내용입니다. 싱글톤(Singleton) 패턴과 사용하는 이유 먼저 '싱글톤 패턴(Singleton pattern)'과 싱글톤 패턴..

Programming/Spring 2024.01.03

Atomikos를 통한 Multi Datasource Transaction 처리 (전역 트랜잭션)

스프링 부트 다중 데이터베이스 트랜잭션 처리 (jta-atomikos) 해당 포스팅은 스프링부트 환경에서 다중 데이터베이스를 연결할 때 'multi datasource에 대한 트랜잭션 처리'에 대해 정리한 내용입니다. 내용은 크게 스프링에서 지원하는 'ChainedTransactionManager'와 Java에서 지원하는 'JTA(Java Transaction API)'에 대한 내용으로 나뉘며, ChainedTransactionManager의 경우에는 현재 deprecated 된 상태이기 때문에 세부적인 구현보다는 동작되는 방식과 deprecated 된 이유에 대해서만 살펴보고 JTA에 대해서는 Atomikos를 사용한 실제 구현 방식과 트랜잭션 테스트 결과까지 확인해 볼 예정입니다. PlatformTr..