개발 33

[Java] Enum 클래스 실무 활용기 1 (with JavaScript)

Enum 클래스를 언제 사용해야하는지 예전에 고민이 많았었는데, 리팩토링을 하면서 활용할 곳들이 많이 보인다.      Enum 클래스를 활용하는 방법들을 하나씩 정리하려고 한다.      [게시판 CRUD]  게시판에서 CRUD 작업을 처리할 때 Enum을 활용할 수 있다.   1. CRUD 작업에 해당하는 값들인 CREATE, READ, UPDATE, DELETE를 Enum 클래스에 정의한다.public enum ActionType { CREATE("C"), READ("R"), UPDATE("U"), DELETE("D"); private String value; private ActionType(String value) { this.value = ..

API, 라이브러리, 프레임워크 차이점

처음 개발을 시작했을 때 API, 라이브러리, 프레임워크 개념이 와닿지가 않았다.이제 처음보다 많은 걸 접해봤으니, 이제 헷갈리지 않도록 예시를 통해 정리해두려고 한다.    1. API란?API는 Application Programming Interface의 약자이다. 즉, 요청과 응답을 사용하여 소프트웨어들이 통신하는 방법이다.두 개 이상의 소프트웨어 컴포넌트 사이에서 상호 작용 할 수 있도록 정의된 인터페이스를 뜻한다.URL을 통해 서버에 접속해서 필요한 부분을 요청하여 응답을 받으며 이용할 수 있다.예시 - JPA(Java와 DB 사이에서 연결해주는 매개체), Google Maps API더보기API를 사용하는 이유 1. 서버와 DB에 직접적인 접근 방지2. 표준화된 요청만 받을 수 있도록   2...

개발/개발노트 2024.08.13

[Timescaledb] Materialized View로 통계 조회 속도 개선 방법

Timescaledb를 적용하면서 1분, 1시간, 1일 통계 데이터 조회를 어떻게 해야 성능이 좋을지 고민을 했다.  첫 번째는 1분, 1시간, 1일 통계 데이터를 내서 별도의 테이블에 insert를 하는 방법이다. 이전에 사용하던 방식이라 로직을 크게 수정할 필요는 없었다. 하지만 수집되는 데이터 양이 많아서 동시에 같은 테이블을 insert를 하고 web에서는 select를 하게 되면 속도가 엄청 느려졌다.   두 번째 방법으로는 Materialized view를 활용하는 것이다. 통계 데이터 조회 속도를 높이기 위해 time_bucket을 사용해 Materialized View를 생성한다.    View는 알고 있었지만 Materialized View를 처음 알게 돼서 정리해보려고 한다. (이 포스..

개발/DB 2024.07.26

[DB] Timescaledb에서 PK와 Unique index 차이점

일반 테이블에서 hyper table로 만들 때, 평소에 사용했던 PK를 사용하지 않아 unique index를 사용했다.  PK와 unique index를 비슷한 느낌으로만 알고, 정확한 개념을 몰라서 정리해보려고 한다. CREATE TABLE h_user_access_data ( user_part varchar(100) NOT NULL, user_id varchar(100) NOT NULL, user_nm varchar(250) NOT NULL, access_date timestamp NOT null);CREATE UNIQUE INDEX idx_h_user_access_data ON public.h_user_access_data USING btree (user_id, user_part, access..

개발/DB 2024.07.16

[Timescaledb] Function, Procedure Job 스케줄러 등록 및 확인 방법

1. Function, Procedure 생성시 파라미터로 반드시 job_id int, config jsonb 추가해준다.CREATE OR REPLACE PROCEDURE public.test_procedure(job_id int, config jsonb) LANGUAGE plpgsqlAS $function$declarebegin insert into user_access(id, name, time) select id, name, now() from user_info; END;$function$;    2. job을 추가해준다. select add_job( function/procedure 이름, schedule_interval => 스케줄러 주기, initial_start => 시..

개발/DB 2024.07.03

[Postgresql] function return 값을 table로 보내기

[상황]sub_function에서 쿼리를 조회해서 record 형식으로 넘기고 main_function에서 record로 받았더니, record가 문자로 받아지는 현상이 있었다. -- sub_function 정의CREATE OR REPLACE FUNCTION sub_function()RETURNS record LANGUAGE plpgsqlAS $function$DECLARE sub_rec RECORD;BEGIN SELECT id, name into sub_rec FROM user_info; return sub_rec;END;$function$;-- main_function 정의CREATE OR REPLACE FUNCTION main_function()RETURNS VOID L..

개발/DB 2024.07.03

[Spring] 스프링 트랜잭션 전파-10분 테코톡

위 영상을 보고 정리한 글입니다.     [용어 정리] 1. 트랜잭션 전파 속성과 타입 트랜잭션 전파는 트랜잭션 전파 속성으로 결정이 된다. 트랜잭션 전파 속성은 트랜잭션이 진행 중일 때 추가 트랜잭션 진행을 어떻게 할지 결정하는 것을 말한다.  //default는 Propagation.REQUIRED 이다.@Transactional(propagation = Propagation.전파타입)   트랜잭션 전파 타입타입\실행 중인 트랜잭션있음없음REQUIRED기존 트랜잭션 참여새 트랜잭션 생성MANDATORY기존 트랜잭션 참여예외 발생REQUIRES_NEW트랜잭션 보류, 새 트랜잭션 생성새 트랜잭션 생성SUPPORTS기존 트랜잭션 참여트랜잭션 없이 진행NOT_SUPPORTED기존 트랜잭션 참여트랜잭션 없이 ..

개발/Spring 2024.05.21

[Network] 내부IP와 외부IP는 왜 따로 있을까?

sql 파일을 psql 명령어로 실행시키기 위해 DB가 있는 IP주소로 실행을 시켰더니 실행이 안됬었다. 그 삽질한 결과는 내부 IP에서 외부 IP로 계속 접근을 시도했기 때문이었다. 외부 IP를 내부 IP로 변경하는 순간 sql 파일이 잘 실행이 됐었다.     IP주소는 컴퓨터, 모바일 기기에 할당된 고유한 주소이다. 내부 IP는 보안을 위해 망 내부에서 사용하기 위해서이고, 외부 IP는 외부에서 내부에 접근하기 위함이라고 이론적인 부분만 알고 있었다. 이번 포스팅으로 왜 내부 IP와 외부 IP를 구분 지어 사용하는지, 자세하게 알아보려고 한다.    [외부 IP와 내부 IP]   Public IP - 외부 IP(공인 IP) 통신회사(SKT, KT, LG U+)에서 집이나 사무실로 인터넷 회선 1개가..

[Spring] try-catch에서 @Transactional이 안되는 이유 및 해결

[문제] 사용자가 발생한 경고 알람을 확인하면서 조치사항을 등록한다. 이때, Agent에 REST로 알람 해제 데이터를 보내줘야 하는데 Httpclienterrorexception이 발생하는 상황이다. Exception이 발생했을 경우 DB에 "알람 해제"를 commit이 되면 안 되고 rollback이 되어야 한다. [문제 코드] 문제는 try-catch로 직접 예외처리를 할 경우 @Transactional(rollback=Httpclienterrorexception.class)가 작동되지 않는다. @Transactional(rollbackFor="HttpClientErrorException.class") public ResultBean alarmSolve(){ ... try{ ... RestTempl..