SSH로 암호화된 안전한 터널을 통해 접속

로컬에서 개발DB서버로 테스트하기 (터널링) 1. vi ~/.ssh/config : 리눅스/Unix 계열 시스템에서 SSH 설정 파일을 편집하는 명령어 SSH 설정 파일을 수정할 수 있게 된다. 여기서 SSH 접속할 서버들의 정보(호스트명, 포트, 사용자 이름 등)를 설정. 마치 전화번호부처럼 자주 접속하는 서버들의 정보를 미리 저장해두는 파일이라고 생각 2. config파일에서 추가 Host dev-bastion : 이 설정을 적용할 호스트의 별칭을 "dev-bastion"으로 지정 HostName 211.254.215.xxx : 실제 연결할 서버의 IP 주소 User...

정적 팩토리 메서드와 빌더 패턴

정적 팩토리 메서드 조슈아 블로크의 저서 “이펙티브 자바”에서는 생성자 대신 정적 팩토리 메서드를 고려하라!라고 한다. 생성자와 정적 팩토리 메서드는 객체를 생성한다는 같은 역할을 하고 있지만 그 활용도는 엄연히 차이가 난다 웹 어플리케이션을 개발하다보면 계층 간에 데이터를 전송하기 위한 객체로 DTO(Data transfer object)를 정의해서 사용한다. public class CarDto { private String name; private int position; pulbic static CarDto from(Car car) { return new CarDto(car.getName(), car.getPosition()); }...

자주쓰는 명령어 정리

사용중인 플러그인 정리 IntellJ opt + cmd + T : Surround With opt + 위 -> ctrl + w 로 변경 : Extend Selection opt + cmd + / : Main Menu - Navigate - Go to Endpoint ctrl + t : Refactor this opt + shift + u : CamelCase 변환 (CamelCase 플러그인 설치 필요) shift + cmd + 위,아래 : 메서드 위치 변경...

방화벽 관련 명령어 정리

firewall-cmd --list-all 현재 활성화된 모든 방화벽 규칙을 보여줍니다 현재 열려있는 포트, 서비스, 규칙 등을 확인할 수 있습니다 firewall-cmd --permanent --add-port=8089/tcp 8089 TCP 포트를 영구적으로 방화벽에 추가합니다 --permanent 옵션은 재부팅 후에도 설정이 유지되도록 합니다 8089는 포트 번호이고, tcp는 프로토콜 타입입니다 firewall-cmd --reload 방화벽 설정을 다시 불러옵니다 변경된 설정을 적용하기 위해 필요한 명령어입니다 firewall-cmd --list-all 다시 한번 방화벽 규칙을 확인합니다 8089 포트가 정상적으로 추가되었는지 확인하기 위함입니다 명령어...

git global config setting

# repository 별 정의 ( --no-global 생략 가능) git config --no-global user.email dongjun6343@naver.com git config --no-global user.name dongjun.park git config --list | cat # 확인 # global 정의 git config --global user.email dongjun.park@abcd.com git config --global user.name dongjun.park git config --list --global | cat # 확인

CLOVA Speech API

CLOVA Speech 서비스의 장문 인식 개발 관련 내용 1. VPC > Object Storage > Bucket Management 메뉴 클릭 후 버킷 생성 2. VPC > CLOVA Speech > Domain 메뉴 클릭 후 장문 인식 도메인 생성 3. Storage 설정 > 1번에 생성한 버킷 경로 추가 4. Bucket Management - 음성 파일 업로드 build.gradle 추가 // CLOVA Speech implementation 'org.apache.httpcomponents:httpclient:4.5.12' implementation 'org.apache.httpcomponents:httpmime:4.3.1' implementation 'com.google.code.gson:gson:2.8.5' public class ClovaSpeechToTextAPI...

[AWS EC2] 서버 시간 동기화 및 타임존 설정

Amazon Linux2 OS는 기본적으로 Amazon Time Sync Service로 설정이 되어 있다. 즉, chrony로 시간을 동기화 하고 있고 chrony 설정이 Amazon Time Sync Service IP로 되어있다는 것이다. # System 직접 설정 방법 # 현재 시간 확인 [root@localhost ~] date Thu Sep 19 08:53:24 UTC 2024 # 시스템 전역 timezone은 /etc/sysconfig/clock 에 정의, 한국 기준으로 재설정하자. vim /etc/sysconfig/clock # 수정 전 ZONE="UTC" UTC=true # 수정 후 ZONE="Asia/Seoul"...

인덱스 정리

인덱스 확인 show index from DASHBOARD_JOB_CARD; 인덱스 생성 ALTER TABLE DASHBOARD_JOB_CARD ADD INDEX DASHBOARD_JOB_CARD_USER_ID_IDX (USER_ID); DASHBOARD_JOB_CARD_JOB_TABLE_IDX 이는 복합 인덱스(composite index)입니다. 컬럼 순서: (JOB_TABLE, USER_ID) 이 인덱스는 두 컬럼을 함께 사용하는 쿼리에 최적화되어 있습니다. DASHBOARD_JOB_CARD_USER_ID_IDX 이는 단일 컬럼 인덱스입니다. 컬럼: USER_ID 주요 차이점 - 용도 DASHBOARD_JOB_CARD_JOB_TABLE_IDX는 JOB_TABLE과 USER_ID를 함께 조회하는 쿼리에 유용합니다. DASHBOARD_JOB_CARD_USER_ID_IDX는 USER_ID만으로 조회하는 쿼리에 유용합니다.

마이크로미터, 프로메테우스, 그라파나

프로덕션 준비 기능 - 지표, 추적, 감사 - 모니터링 - 액추에이터는 프로덕션 준비 기능을 매우 편리하게 사용할 수 있도록 다양한 편의 기능 제공 => 마이크로미터, 프로메테우스, 그라파나 액츄에이터 관련 내용 localhost:8080/actuator localhost:8080/actuator/health management: endpoints: web: exposure: include: "*" 액츄에이터 endpoint. 1. 앤드포인트 활성화 2. 앤드포인트 노출 Http를 통해서 웹에 노출할지, jmx에 노출할지. 근데 jmx는 거의 안쓰므로 http에 노출할지말지 선택하면 된다. 엔드포인트 노출 management: endpoints: web:...

Redis 오류 (MISCONF Redis is configured to save RDB snapshots~~~) 에러 발생

Redis 오류 (MISCONF Redis is configured to save RDB snapshots~~~) 에러 발생 Redis는 특정시점에 데이터를 디스크로 저장하여 파일로 보관이 가능. 이러한 기능으로 장애발생시 복구가능하고 파일로 저장하는경우 RDB 파일로 저장한다. Redis 에서는 RDB 파일 저장 실패 시 Redis의 데이터 쓰기가 모두 불가능하게 되고 Redis를 이용하고 있는 서비스들은 심각한 장애가 발생 MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on...

Too many connections 오류 발생

최근 운영 서버에서 Too many connections 오류 발생 현재 운영하고 있는 DB(MySQL) 커넥션 수 확인 후 커넥션 수 조절하여 해결 //동시에 최대 접속(커넥션)했던 수 확인 SHOW STATUS LIKE 'Max_used_connections'; //최대 커넥션 수 확인 (=> DB는 커넥션 수를 최대 얼마나 허용하고 있는지 확인 ) SHOW VARIABLES LIKE '%max_connection%'; //현재 접속자 수(사용하고 있는 커넥션 수) 확인 SHOW STATUS LIKE 'Threads_connected'; //MySQL의 connection pool size를 1000으로 증가시키겠다. set...

@Configuration vs @Component

@Component public class MyService { // 이 클래스 자체가 빈으로 등록 } @Configuration public class AppConfig { @Bean public MyBean myBean() { return new MyBean(); // 이 메서드가 빈을 생성하고 구성 } ... } 상황에 따라 적절한 어노테이션을 선택하여 사용. 단순한 빈 등록은 @Component를, 복잡한 설정이나 여러 빈의 관계 설정은 @Configuration을 사용하는 것이 일반적. @Component: 목적: 개별 클래스를 Spring의 빈으로 등록하기 위해 사용 사용: 주로...

라눅스 서버 내부 방화벽 설정

kt cloud 접속, 방화벽 설정해도 서버 연결되지 않는 경우! 서버 내부 방화벽도 해제해줘야함! - `netstat -tuln` : 실행중인 포트 확인 - `firewall-cmd --list-ports` : 방화벽 해제 되어있는 포트 확인 - `firewall-cmd --zone=public --add-port=3006/tcp --permanent` : 3006 포트 방화벽 해제 - `firewall-cmd --reload` : 방화벽 재시작

QueryDsl 중급 문법

프로젝션(Projection) : select 대상 지정 프로젝션 대상이 하나면 하나의 타입을 명확하게 지정 가능 프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회 Tuple -> 서비스, 컨트롤러까지 넘어가면 좋지 않은 설계다. DTO로 변환해서 사용하자. 프로젝션과 결과 반환 : DTO 조회 결과를 DTO 반환할때 사용 총 3가지의 방법을 지원한다. 1. setter 접근(프로퍼티 접근) 방식 (주의 : 기본생성자가 있어야한다. -> @NoArgsConstructor) ... Projections.bean(MemberDto.class, member.username, member.age) 2. 필드 직접 접근 ......

CompletableFuture

비동기 처리 -> CompletableFuture<T> Future에서는 에러 핸들링을 할 수 없지만, java8 나온 CompletableFuture<T>을 사용하면 에러 핸들링이 가능하다! [기본적인 사용 방법] - runAsync 반환 값이 없는 경우 비동기 작업 실행 - supplyAsync 반환 값이 있는 경우 비동기 작업 실행 [작업 콜백] 비동기 실행이 끝난 후에 다음과 같이 체이닝 형태로 작성하여 전달 받은 작업 콜백을 실행시켜 준다. - thenApply 함수형 인터페이스 Function 타입을 파라미터로 받으며, 반환 값을...

Controller vs RestController

[@Controller 예제 코드] @Controller @RequiredArgsConstructor public class UserController { private final UserService userService; @GetMapping(value = "/users") public @ResponseBody ResponseEntity<User> findUser(@RequestParam("userName") String userName){ return ResponseEntity.ok(userService.findUser(user)); } } [@RestController] @RestController는 @Controller에 @ResponseBody가 추가! (Json 형태로 객체 데이터를 반환하는 것) [@RestController 예제 코드] @RestController @RequiredArgsConstructor public class UserController { private final UserService userService; @GetMapping(value = "/users") public ResponseEntity<User> findUserWithResponseEntity(@RequestParam("userName") String userName){ return ResponseEntity.ok(userService.findUser(user)); } }

JPA exists 쿼리 성능 및 queryDsl 구현

개발을 하다보면, 데이터가 유무를 판별하는 경우가 많다. 보통은 size(), count, exists 중에서 데이터의 유무를 판별하게 되는데, 어떤것을 사용하는게 성능이 더 좋을까??? size()는 모든 데이터를 select을 해야하는 부분이 있어서 성능이 안나온다고 생각했었다. 하지만, count vs exists는 크게 생각을 안해본거 같아서 정리해본다. count는 총 몇건인지 확인을 하기 위해 전체를 확인해봐야하고, exists는 첫번째 결과에서 바로 true를 리턴하게 된다. 'exists가 count보다 성능이 좋은 이유가 결국 전체를 조회하지 않고 첫번째...

@Async

'비동기 처리'란? 비동기 처리는 작업을 별도의 스레드에서 실행하고 결과를 나중에 처리하는 방식이다. 특정 로직의 실행이 끝날때까지 기다리지 않고 다음 코드를 실행할 수 있고, 결과가 있으면 이벤트를 받거나 콜백을 통해 처리한다. --- @Async 어노테이션은 메서드에 적용하여 해당 메서드를 비동기적으로 실행시킨다.

jpa 복합키 매핑하는 법

JPA는 영속성 컨텍스트에 엔티티를 보관 시, 식별자를 사용하고 이를 구분하기 위해 equals와 hashcode를 사용해 비교한다. 이때 식별자가 2개 이상이면 별도의 식별자 클래스를 만들고 그곳에 equals와 hashcode를 구현해야한다. JPA는 2가지 방법을 제공하고 있다. 1.1 @IdClass 1.2 @EmbeddedId 이번에 @EmbeddedId로 구현했다. -> 해당 방법이 좀 더 객체지향적이라고 생각! 필수 조건 @Embeddable 어노테이션 필수 Sericalizable 인터페이스를 구현 equals, hashcode를 구현 -> @EqualsAndHashCode 어노테이션 활용 기본 생성자가 있어야 한다...

queryDsl 사용시 주의사항

querydsl을 사용할 때는 다음과 같이 {Entity명}Repository, {Entity명}RepositoryCustom, {Entity명}RepositoryImpl의 구조로 인터페이스 및 클래스를 생성합니다. Custom 인터페이스의 경우 다른 이름이 되어도 상관이 없지만, 실제 해당 메서드가 구현되는 Impl 클래스의 경우 '{Entity명}RepositoryImpl' 이라는 이름으로 생성되어야 한다는 규칙이 있습니다. 오늘 오류가 발생했던 원인은 생성된 Impl 클래스의 이름이 엔티티명과 다르기 때문에 발생했습니다.