서버가 이상하다?! 최근에 만든 토이 프로젝트를 외부에서 접속해 보고 싶어서 스마트폰에서 접속을 시도했다. 화면을 제대로 나왔지만 서버에서 데이터를 제대로 가져오지 못 하는 것 같았다. 이 때까지만 해도 오라클 프리티어 인스턴스에 젠킨스 + 서버 + DB가 동시에 실행 중인 상태라 리소스 부족으로 DB가 비정상 종료 됐다고 생각했다. 해킹을 당했구나!! 예상대로 DB는 inactive 상태였다. DB를 다시 켰지만 데이터가 제대로 나오지 않았다. DB에 직접 접속해서 DB를 열어 보았다. 내가 만든 DB는 없어지고 RESTORE_DATA_...의 DB가 생성되어 있었다. 내용을 조회해 보니 대략 "데이터를 복구하고 싶으면 0.08 BTC를 달라"는 내용의 글이 들어 있었다. 구축한지 며칠도 되지 않아서 ..
리액트도 Spring Boot의 application-dev.properties, application-prod.properties 처럼 각각 실행 환경에서 다른 설정을 사용하고 싶을 때 하는 설정 방법이 있다. development 환경에서 http://localhost:8080을 production 환경에서 https://api.seogineer.com를 사용해서 동적으로 각 profile 마다 다른 URL을 사용하고 싶었다. 프로젝트의 root 경로에 .env.development, .env.production 파일을 생성하고 각 profile에 맞는 URL을 입력한다. 이때, 호출할 때 사용하는 이름은 접두사 REACT_APP_로 시작하여야 한다.# .env.developmentREACT_APP..
CORS 문제Access to XMLHttpRequest at 'http://localhost:8080/example' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. 리액트에서 API 서버로 요청을 보냈더니 위와 같은 메세지를 받았다.보안상 서로 다른 도메인이 서버 자원에 접근하려 하는 경우 이를 막는 것이다. CORS 설정을 통해 이 문제를 해결할 수 있다. @Configurationclass WebConfig { @Bean fun corsConfigurer(): WebMvcCo..
문제오라클 클라우드 인스턴스의 수신 규칙을 설정 했음에도 접속이 불가능한 상황이 발생했다. 원인클라우드의 수신 규칙뿐만 아니라 우분투 리눅스의 방화벽 설정이 존재했다. 해결환경: Oracle Cloud, Ubuntu 24.04 아래 명령어로 방화벽 상태를 조회할 수 있다.sudo iptables -L --line Chain INPUT - target - REJECT가 된 부분을 아래 명령어로 찾아서 제거했다.sudo iptables -D INPUT 6# num이 6이었기 때문에 명령어에 6을 사용함. 그리고 아래 명령어로 방화벽 설정에 포트를 추가했다.sudo iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPTsudo iptables -..
문제 상황JPA의 saveAll()을 이용하여 600건의 데이터를 저장하는 기능을 만들었다. 실제 결과는 300건만 저장되고 있었다. 원인JDBC 기본 배치 크기는 따로 설정하지 않은 경우 한번에 처리될 수 있는 개수가 제한되어 있음 해결방법1 - 배치 크기 설정application.properties에 설정을 통해 배치 크기를 조정할 수 있다.단, 키 생성 전략으로 IDENTITY 방식을 사용하면 사용할 수 없다. 영속성 컨텍스트 내부에서 엔티티 식별을 위해 PK값을 사용하는데 IDENTITY 방식은 DB에 INSERT한 후에 PK 확인이 가능하기 때문이다.spring.jpa.properties.hibernate.jdbc.batch_size=2000spring.jpa.properties.hibernat..
Spring Boot 3.2.3.RELEASE가 아니라 Spring Framework 3.2.3.RELEASE로 개발된 프로젝트에서 개발 및 유지보수를 하면서 아래와 같은 코드를 반복적으로 보았다.TransactionStatus status = this.transactionManager_iqis.getTransaction(new DefaultTransactionDefinition());try{ //do something transactionManager_iqis.commit(status);} catch (Exception e) { transactionManager_iqis.rollback(status);} 주로 @Transactional로 사용하는 기능을 코드로 사용하고 있었다. 스프링 ..
토이 프로젝트를 위해 서버를 여러 대 만들어 사용하다 보니 키페어도 여러 개가 생겼다. id_rsa1, id_rsa2 같은 방식으로 여러 개를 만들어 사용했더니 시간이 지나면서 어느 서버에 접속하는 키인지 잊어버리게 되었다. 다른 사람들은 어떻게 여러 개의 키 페어를 관리하는지 찾아봤다. 키 페어란?보안 목적으로 사용되는 두 개의 암호화 키, 즉 공개 키(public key)와 비밀 키(private key)를 의미합니다.키 페어의 구성 요소는 공개키와 비밀키가 있으며, 공개키는 클라우드 인스턴스에 업로드 되고, 비밀키는 로컬에 안전하게 보관하고, 접근 권한을 제한해야 합니다. 일반적으로 .pem, .key와 같은 확장자를 가진 파일에 저장된다. config 파일에 별명-키로 관리 하기1. ~/.ssh ..
Redis에 데이터를 직렬화/역직렬화 처리할 때 SerializationException이 발생 아래와 같이 직렬화, 역직렬화 대상이 되는 클래스에 LocalDateTimeSerializer, LocalDateTimeDeserializer를 각각 지정해서 직렬화, 역직렬화에 사용한다. @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) private LocalDateTime createdDate; @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateT..
장점 실제 Apache Tomcat을 이용해서 테스트한다. 전 구간을 테스트한다. 내부 구현이나 기술을 검증하기 보다 시나리오를 기반으로 검증한다. 단점 아래와 같은 구성이 필요하며 MockMvc와 비교해서 속도가 느리다. @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class AcceptanceTest { @LocalServerPort int port; @BeforeEach public void setUp() { RestAssured.port = port; } ... } 사용 방법 GET 요청 예) private ExtractableResponse 지하철_노선_목록_조회_요청() { return Re..
패키지 사이에 의존성을 낮추는 방법 절차지향 로직 사용할 패키지에 인터페이스를 만들고 구현은 도메인에 해당하는 패키지에서 구현 도메인 이벤트 퍼블리싱 도메인 이벤트 퍼블리싱이란? 패키지 사이에 결합도를 낮추기 위해 사용 도메인이 이벤트를 생성하면 이벤트 디스패처가 리스너에게 전달 어떤 동작 이후에 연관된 동작을 요청할 때 사용 ex) 식사를 마친 테이블에 계산이 끝나면 테이블 상태를 변경한다. 구현 방법 Spring Framework에서 제공하는 기능으로 구현하는 방법 Spring Data JPA에서 제공하는 기능으로 구현하는 방법 Spring Data JPA의 이벤트 구현 예제 & 전체 소스 Publisher // 이벤트로 전달할 형식 public class SpringEventPublisher { p..