전체 글 376

아이폰 푸시 알림 안 오는 경우 해결 방법(위치 및 개인 정보 보호 재설정)

아이폰 푸시 알림 안 오는 경우 해결 방법(위치 및 개인 정보 보호 재설정) 해당 포스팅은 '아이폰에서 푸시 알림이 오지 않는 문제'에 대한 해결 방법입니다. (해당 증상은 iPhone 12 mini 모델 및 소프트웨어 버전 15.6.1에서 발생했던 내용입니다.) 발생된 증상은 어느 날부터 갑자기 카톡 푸시 알림이 오지 않았고, 카톡 외에도 당근마켓, 네이버, pass 등 설치된 모든 애플리케이션의 푸시 알림이 오지 않았다는 것입니다. * 당시 알림 설정은 위 이미지와 같이 정상적으로 되어 있는 상태였습니다. 문제가 발생한 정확한 원인은 문제를 해결한 현재도 명확하게는 알 수 없지만, 대략적으로 어떠한 작업 중 아이폰의 위치 설정이 다른 나라로 바뀌면서 푸시가 오지 않았던 것으로 추측됩니다. 해결 방법 ..

IT Info 2023.12.23

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..

관심 종목 덴티움(145720), 임플란트 관련주, 고령화 관련주

임플란트 대장주, 고령화 관련주, 관심 종목 덴티움(145720) 관심 가는 종목 '덴티움(145720)'에 대한 내용 정리입니다. 인구 고령화에 따른 임플란트 수요가 증가하고 있으며, 올해 6월 28일 오스템임플란트가 한국거래소에 자진 상장폐지를 신청하며 기존에 2위 자리에 위치하고 있던 덴티움이 임플란트 대장주로 자리하였는데요. 주가는 올해 6월 최고가 185,000원까지 상승한 이후 계속 하락하고 있는데, 11월 3일 현재 기준 주가는 113,500원으로 고점 대비 약 38% 정도 하락한 수준에 있다는 점도 관심 요인 중 하나입니다. 덴티움 덴티움은 2000년 설립되어 임플란트 제품을 주력으로 치과용 의료기기 및 생체재료를 Total Solution으로 개발, 생산, 판매하고 있습니다. 임플란트 전..

Finance 2023.11.04

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를 사용하는 통합 테스트의 개념과 장단점, 예시 코드'에 대해서 살펴보겠습니다. * 전체 코드는 포스팅 맨 하단에 링크해 두었으니 필요하신 ..

(docker) maven:3.6.3-jdk-8: no match for platform in manifest

(docker) no match for platform in manifest 해당 에러는 Apple M1(Silicon) 환경에서 docker image를 build 하는 과정 중 발생한 문제입니다. M1 환경은 기본적으로 ARM 기반 아키텍처인데요. 때문에 해당 환경에서 도커 이미지를 빌드하면 platform이 'linux/arm64'로 생성됩니다. 발생한 에러 메시지인 'maven:3.6.3-jdk-8: no match for platform in manifest...'라는 문구를 통해 원인을 유추해 보면 'maven:3.6.3-jdk-8'을 사용하는데 platform이 맞지 않는다? 정도로 생각해 볼 수 있었는데요. 관련 정보를 찾아보던 중 일부 docker image에서 Apple M1 칩을 지원..

Programming/Error 2023.10.25

MySQL 중복 데이터 조회 및 삭제 방법(GROUP BY HAVING)

mysql 중복 데이터 조회(group by having) 및 삭제 방법 데이터를 관리하다 보면 중복된 데이터를 찾아야 하는 경우가 있는데요. 해당 포스팅은 MySQL에서 'GROUP BY HAVING'을 사용하여 중복 데이터를 조회하는 방법과 삭제하는 방법에 대해 정리한 내용입니다. CREATE TABLE `users` ( `idx` bigint NOT NULL AUTO_INCREMENT, `last_name` varchar(45) COLLATE utf8mb4_bin DEFAULT NULL, `first_name` varchar(45) COLLATE utf8mb4_bin DEFAULT NULL, `birth` varchar(45) COLLATE utf8mb4_bin DEFAULT NULL, PRIMAR..

Programming/MySQL 2023.10.21

(Linux) Too many open files 에러가 발생하는 경우

Too many open files 에러가 발생하는 경우 해당 포스팅은 Linux 서버에서 발생하는 'Too many open files' 에러에 대한 해결 방법과 해당 에러가 발생할 수 있는 상황에 대해서 살펴본 내용입니다. File Descriptor / open files Too many open files 에러에 대해 살펴보기 위해서는 먼저 '파일 디스크립터(File Descriptor / open files)'에 대해서 알아야 하는데요. Linux에서는 파일을 열면(open) 파일 디스크립터를 반환하며, 반환된 파일 디스크립터는 파일을 읽고 쓰는 데 사용됩니다. 문제는 리눅스 환경에서 Java의 소켓 통신(HTTP, API, JDBC 커넥션 등) 또한 파일로 취급된다는 것인데요. 때문에 소켓을 ..

Programming/Linux 2023.10.18

RabbitMQ 개념과 구조 정리 (Exchange Type, Dispatch 등)

RabbitMQ 개념과 구조 정리 RabbitMQ란? 'RabbitMQ'는 AMQP를 구현하여 메시지 생성자와 소비자 사이에서 메시지를 중계해 주는 '메시지 브로커'입니다. * AMQP(Advenced Message Queuing Protocol) 메시지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜 RabbitMQ는 메시지 지향 미들웨어(Message Oriented Middleware)에 속하는데요. 메시지 지향 미들웨어는 비동기 메시지를 사용하는 응용프로그램들 사이에서 데이터를 송수신하는 것을 의미하며, 이러한 시스템을 구현한 솔루션을 '메시지 큐(Message Queue)'라고 합니다. 그렇다면 메시지 큐를 사용하는 이유는 무엇일까요? 메시지 큐를 사용함으로써 얻을 수 있는 이점은 아래와 ..