Programming 318

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

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

Oracle ROWNUM, ROW_NUMBER() 사용하기 (MySQL LIMIT와 차이점)

Oracle ROWNUM, ROW_NUMBER() 사용하기MySQL에서는 SELECT 문에서 'LIMIT'를 통해 조회할 데이터 결과 값의 로우를 제한할 수 있습니다.반면 Oracle에서는 'LIMIT'가 없기 때문에 결과 값의 로우를 제한하기 위해 'ROWNUM' 또는 'ROW_NUMBER()'를 사용하는데요. 해당 포스팅은 Oracle에서 'ROWNUM' 및 'ROW_NUMBER()'를 사용하는 방법과 MySQL(및 PostgreSQL)의 'LIMIT'와의 차이점을 살펴보겠습니다. MySQL LIMIT, Oracle ROWNUM 사용 방법 비교id (BIGINT or NUMBER)name (VARCHAR)state (VARCHAR)1김학생NORMAL2이학생NORMAL3최학생WITHDRAWAL4박학생N..

Programming/Oracle 2023.12.23

(Oracle) TO_CHAR, TO_NUMBER, TO_DATE 함수 정리

오라클(Oracle) TO_CHAR, TO_NUMBER, TO_DATE 함수 정리 최근에 오라클을 조금 사용해 보게 되면서 그 과정에서 알게 된 'TO_CHAR', 'TO_NUMBER', 'TO_DATE' 함수에 대해 정리한 내용입니다.TO_CHAR먼저 'TO_CHAR' 함수는 날짜, 숫자 등의 값을 문자열로 변환하는 함수입니다.해당 함수의 다양한 변환 방법의 예시는 아래와 같습니다. 1. 날짜 관련-- 날짜 포맷 변경1SELECT TO_CHAR(SYSDATE, 'YYYYMMDD') -- 20231216 , TO_CHAR(SYSDATE, 'YYYY/MM/DD') -- 2023/12/16 , TO_CHAR(SYSDATE, 'YYYY-MM-DD') ..

Programming/Oracle 2023.12.16

Spring Boot 다중 데이터베이스 구성하는 방법

Spring Boot 다중 데이터베이스(Multi Datasource) 구성하는 방법 해당 포스팅은 '스프링 부트 환경에서 다중 데이버테이스 연결을 구성하는 방법'에 대한 내용입니다. 단순히 다중 데이터베이스 연결을 구성하는 방법은 어렵지 않지만 구성 후 다중 데이버테이스에 대한 트랜잭션 처리 등 함께 공부할만한 내용이 있어 정리하게 되었으며, TransactionManager가 여러 개일 때 트랜잭션 처리에 대해서는 해당 포스팅이 아닌 이어지는 포스팅에서 다룰 예정이니 참고 부탁드리겠습니다. Multi Datasource (application.yml) 다중 데이터베이스를 연결하여 사용하는 방법의 가장 핵심은 '각각의 데이터베이스에 대한 Datasource를 구성하는 것'인데요. 먼저 applicati..

(Spring Data JPA) 데이터베이스 View, Entity 매핑하기

(Spring Data JPA) 데이터베이스 View, Entity 매핑하기 해당 포스팅은 '데이터베이스 가상 테이블인 View를 Entity에 매핑하는 방법'을 정리한 내용입니다. 먼저 데이터베이스에서 View란 무엇인지를 간단하게 살펴보고, 이어서 '1. 생성된 View에 Entity를 매핑하는 방법'과 '2. View가 생성되지 않은 상태에서 Entity에 매핑하는 방법'에 대해서 살펴보겠습니다. View란? 뷰(View)란 데이터베이스에 존재하는 가상의 테이블입니다. 가상의 테이블이라는 이름처럼 실제로는 데이터를 가지고 있지 않은데요. View는 데이터가 아닌 SQL을 저장하여 보여주는 것만을 목적으로 하는 테이블입니다. 이처럼 View는 SQL을 저장하기 때문에 '1. 여러 테이블을 조인하는 복..

BeanUtils.copyProperties를 사용한 객체 필드값 복사

BeanUtils.copyProperties를 사용한 객체 필드값 복사 프로젝트를 진행하다 보면 Dto -> Entity 또는 Entity -> Dto 변환하는 과정이 필요한데요. (그 외에도 객체 간의 필드 값을 복사해야 하는 경우) 개인적으로는 지금까지 Entity 또는 Dto에서 builder를 통해 변환된 객체를 반환하는 method를 만들어 사용했으며, 동료 분의 코드에서 'BeanUtils.copyProperties' 기능을 사용하시는 것을 보고 해당 기능에 대해 알아보게 되었습니다. (데이터 복사에는 BeanUtils 외에도 ModelMapper, MapStruct 등의 라이브러리를 사용할 수 있으며, 관련된 부분도 아래 내용을 통해 언급됩니다.) *** 아래 내용에서는 'Entity와 Dt..

도커 이미지와 컨테이너(docker images, containers)란?

도커 이미지와 컨테이너(docker images, containers) 최근 컨테이너 기술인 'docker'를 사용하면서 관련된 공부를 하게 되었는데요. 공부하는 과정에서 '도커 이미지와 컨테이너(docker image, docker container)'에 대한 개념을 잘 알아두어야겠다고 생각되어 정리한 내용입니다. (짧게) Docker란? 도커 이미지, 컨테이너, 컴포즈 등과 같은 용어들로 인해 처음에는 뭔가 엄청나 보이고 어려워 보였지만, 결국 도커는 '컨테이너를 생성하고 관리하기 위한 도구'인데요. 아래 이미지와 컨테이너에 대한 내용을 통해 도커가 생성하는 컨테이너는 무엇이고 어떤 기능을 하는지 살펴보겠습니다. Docker Image 도커 이미지는 '컨테이너를 만드는 데 사용되는 읽기 전용(Read..

Programming 2023.11.21

@AuthenticationPrincipal 동작 원리와 사용 예시

Spring Security @AuthenticationPrincipal 동작 원리와 사용 예시 해당 포스팅은 스프링 시큐리티 환경에서 인증 후 로그인 객체를 가져오는 방법 중 '@AuthenticationPrincipal 어노테이션을 사용하는 방법과 동작 원리, 사용 예시'를 중점으로 정리한 내용입니다. (코드가 너무 긴 부분은 내용상 필요한 부분만 올려놓았으며, 전체가 궁금하신 경우 포스팅 맨 하단 github 소스코드를 참고하시면 좋을 것 같습니다.) 인증 후 로그인 객체를 가져오는 방법 1. SecurityContextHolder에서 직접 가져오는 방법 Object principal = SecurityContextHolder.getContext().getAuthentication().getPrin..

repository, repositoryCustom, repositoryImpl 구조를 사용하자

jpa 공식 같은 repository, repositoryCustom, repositoryImpl 구조 해당 포스팅에서는 하나의 Repository를 통해 JpaRepository의 기능과 Querydsl의 기능을 사용하는 CustomRepository를 모두 사용할 수 있는, 일종의 공식처럼 쓰이는 'repository, repositoryCustom, repositoryImpl 구조'에 대해서 살펴보겠습니다. repository 상속 구조 해당 구조를 코드로 보면 아래와 같은데요. 크게 JpaRepository를 extends 하는 Repository 인터페이스에 CustomRepository 인터페이스를 추가로 extends 하는데, CustomRepository 인터페이스는 Querydsl의 기능..

@SpringBootTest 스프링 부트 통합 테스트 개념과 예시 코드

@SpringBootTest를 사용한 스프링 부트 통합 테스트 개념과 예시 코드 Spring Boot 프로젝트의 테스트 코드 작성 방법에 대해 찾아보면서, 테스트 방식이 크게 '@SpringBootTest를 사용하는 통합 테스트'와 '@WebMvcTest, @DataJpaTest 등의 어노테이션을 사용하는 슬라이스 테스트'로 나뉜다는 것을 알게 되었습니다. (슬라이스 테스트에 사용되는 어노테이션 @WebMvcTest, @WebFluxTest, @DataJpaTest, @JsonTest, @RestClientTest 등) 해당 포스팅에서는 '@SpringBootTest를 사용하는 통합 테스트의 개념과 장단점, 예시 코드'에 대해서 살펴보겠습니다. * 전체 코드는 포스팅 맨 하단에 링크해 두었으니 필요하신 ..