💬 들어가기 전에작년 6월 첫 번째 Spring 프로젝트를 진행하며 처음 CORS 오류를 마주했고, WebMvcConfigurer 설정을 통해 해결했다. 이후 프로젝트를 진행하며 Jwt 토큰을 도입하게 되어 토큰 인증용 Interceptor를 만들게 되었다.그런데 이때 preflight 요청이 제대로 처리가 되지 않아 CORS 오류가 또 터져버렸다. preflight 요청은 WebMvcConfigurer가 처리해준다고 생각했는데,Interceptor를 만들었다고 preflight 요청이 처리가 되지 않는 것이 이상했다. 당시에는 엉뚱한 곳에서 원인을 찾고 있었던 것 같고, 엉뚱한 내용을 블로그에 작성했다.(지금 보니까 내용이 아주 엉망이다.)[Spring] filter 기능 구현 후 CORS 에러가 발..
💻 프로그래밍
💬 들어가기 전에그동안 on-premise 환경에서 개발하다가 처음으로 AWS에 배포를 하게 되었다.서버 구성은 흔히 볼 수 있는 Spring 서버 앞단에 Nginx가 있는 구조다. 그런데 배포가 무사히(?) 되고 이런저런 테스트를 하다가 이상한 부분을 발견했다. 갑자기 유효하지 않은 엔드포인트로 요청을 보내면 어떻게 될까 궁금해서 포스트맨으로 API 요청을 날려봤는데내가 생각했던 Spring MVC 요청 흐름과 달랐다. 🌎 내가 인지하고 있던 Spring MVC 요청 흐름일단 흐름을 크게 정리하면 다음과 같은 흐름으로 처리되는 것으로 알고 있었다.Filter → DispatcherServlet → Interceptor → Controller 관련해서 구글링 해보면 내가 보았던 수많은 블로그들도 똑같..
(24.09.08 추가)작성 후 문제의 원인을 알게되어 별도의 글에 정리했다.[SpringBoot] WebMvcConfiguration의 동작 원리 💬 프로젝트 상황현재 개발중인 프로젝트의 환경은 다음과 같다.SpringBoot3JDK 21Spring Security 사용하지 않음그런데 서버 첫 배포 후, 분명 다음과 같이 WebMvcConfigurer를 통해 설정을 추가해주었는데도프론트와 연동하는 과정 중에 CORS 에러가 발생했다. 설정 코드CorsConfig.java@Configurationpublic class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry regist..
💬 들어가며최근 프로젝트를 하며 json 데이터를 DB 컬럼에 그대로 저장해야 할 상황이 많았다.그동안 Nest.js TypeORM으로 json 데이터 타입을 다루는데 큰 문제가 없었는데multipart/form-data로 넘어오는 json 데이터를 저장하며 문제가 발생했다. 개발 환경은 다음과 같다.Nest.js + TypescriptTypeORMPostgreSQL 🔥 문제DB에 저장할 때 이런식으로 \n, \와 같은 개행문자가 들어가 있었다."[\n {\n \"index\": \"1\", ...생략]"조회할 때도 정의된 Json 형식으로 매핑이 안되고 저 데이터 자체가 스트링으로 인식되어 통으로 매핑되었다. 쿼리 매핑 결과{ "data": "[{\"index\": 1}, {..
💬 들어가기 전에현재 개발중인 프로젝트의 환경은 다음과 같다.SpringBoot3JDK 21Postgresql, Redis Cluster그리고 각 서비스를 모듈화하여 멀티 모듈 구조로 개발중에 있다.테스트 환경은 테스트 컨테이너로 구성하였는데,이번에 Redis를 연동하면서 테스트 환경을 구성하는데에 어려움을 겪게 되어 그 과정을 기록하고자 한다. ⚙️ 기존 테스트 환경 설정우선 기존 PostgreSQL만 사용했을 때 설정해두었던 것들은 다음과 같다. TestContainers 클래스에 테스트 컨테이너 관련 설정들을 하고,RestAssuredTest 클래스가 TestContainers를 상속받아 테스트 관련 설정을 했다. 이후 실제 테스트 코드를 작성하는 클래스는 RestAssuredTest를 상속받아 ..
이번주는 가상 함수와 오버라이딩에 대해 공부하는 주차였는데, 포인터에 대한 개념이 확실히 잡혀 있지 않다 보니 이해하기가 조금 어려웠다. C++은 포인터 개념이 이해가 안되면 다음 진도 나갔을 때 확실히 힘겨운 부분이 있는 것 같다. 회사를 다니면서 학교 공부를 따라가야 되다보니 진도에 내가 딸려(?) 가고 있는데,어떻게든 시간을 내서 포인터를 다시 공부해야 겠다는 생각이 들었다. 1. 용어 virtual 키워드: 동적 바인딩 지시어, 컴파일러에게 함수에 대한 호출 바인딩을 실행 시간까지 미루도록 지시함 동적 바인딩: 파생 클래스에 대해 기본 클래스에 대한 포인터로 가상 함수를 호출하는 경우, 객체 내에 오버라이딩한 파생 클래스의 함수를 찾아 실행 = 실행 시간에 바인딩이 일어난다 정도로 이해 2. 오버..
1. 용어 지시자(specifier): 값을 어떻게 출력할 것인지 지정해주는 역할 2. printf() 값을 다른 형식으로 출력하고 싶을 때 printf() 사용 printf()는 지시자를 통해 변수의 값을 여러 가지 형식으로 변환하여 출력하는 기능 출력하려는 값이 n개 이상도 가능하며, 출력될 값과 지시자의 순서가 일치해야 함 2-1. 작성 예시 // int 타입의 변수 age 값이 26일 때 System.out.printf("age:%d", age); // 화면에 "age:26" 출력 System.out.printf("age:%d", 26); // 화면에 "age:26" 출력 System.out.printf("age:26"); // 화면에 "age:26" 출력 💡 println()과 달리 printf..
1. 용어 기본형에는 8개의 타입(자료형)이 있으며, 크게 논리형, 문자형, 정수형, 실수형으로 구분 논리형: boolean - 논리값을 저장, true/false 중 하나를 값으로 갖음 문자형: char - 문자를 저장, 변수에 하나의 문자만 저장 가능 정수형: byte, short, int, long - 정수를 저장, 주로 int를 사용 실수형: float, double - 실수를 저장, 주로 double을 사용 ※ 참고: 문자형 char는 문자를 유니코드(정수)로 저장하기 때문에 boolean을 제외한 다른 기본형과 연산과 변환이 가능함 2. 변수 종류와 크기 정수형의 경우, 각 타입마다 저장할 수 있는 값의 범위가 달라 범위에 맞는 타입을 선택하면 됨 일반적으로는 CPU가 가장 효율적으로 처리할 ..