본문 바로가기
728x90
반응형

Back Side52

관계형 데이터베이스의 중간 테이블 예를들어, 목표가 있다고 하자. 그 목표에는 이름도 있고 날짜도 있다. 그리고 태그도 있다. 여기에서 태그에는 라벨과 이모지가 데이터가 들어간다. 기존에 쓰던 MongoDB와 같은 문서 기반에서는 아래와 같이 쓴다.{ "name": "Spring 공부하기", "tags": [ { "label": "공부", "emoji": "📚" }, { "label": "개발", "emoji": "💻" } ]}이런 식으로 Goal 안에 tags를 박아버리면 끝이다. 하지만 관계형 데이터 베이스에선 그러면 안된다. 왜냐하면 Goal과 Tag가 다대다(N:N) 관계이기 때문이다. 예를들어 하나의 목표(=Spring 공부하기)에 여러 태그(=공부, 개발)가 있을 수 있다. 그리고 하나의 태그(=공부)가 여.. 2025. 4. 13.
[Spring Boot] Component Scan Spring Boot에서 Hello, World라는 글자를 브라우저에 띄우고 싶다고 하자. 그러면 우리는 어떻게 실행시켜줘야 할까? HelloController가 아닌 MySteplyApplication을 run 시켜줄거다. 왜? 왜 글자가 있는 HelloController가 아니라 MySteplyApplication을 실행시킬까? Spring Boot의 Component ScanSpring Boot는 @SpringBootApplication 어노테이션이 붙은 클래스 기준으로, 하위 패키지에 있는 모든 Bean들을 자동으로 찾아 등록해준다. 이때 @SpringBootApplication 안에는 @ComponentScan이 숨어 있다. @ComponentScan(basePackages = "com.exam.. 2025. 4. 13.
PostgreSQL GUI 프로그램 TablePlus 설치 운영체제에 맞는거 선택설치 후 실행하면 상단에 있는 + 클릭 후  PostgreSQL 선택user, password, database 입력 후 connect.굳. 2024. 11. 5.
[hono] npm install cors 할 필요없이 hono cors 사용하기 클라이언트에서 서버로 통신을 시도하니 cors 정책으로 차단되었다고 나왔다. 바로 bun add cors를 하던 중에 bun이나 hono에서 따로 제공해주는게 있지 않을까 싶어 공식문서를 뒤져보니 바로 나왔다. ㄱㅇㄷ 따로 라이브러리 설치할 필요 없이 cors()를 하면 알아서 import로 가져오니 완전 굳굳 👍 2024. 2. 4.
[node-cron] 메모리에 저장되는 스케줄러를 Redis에 저장해서 영구보관하자 문제 발생 수강생이 강의 신청을 하면 강의일로부터 하루 전에 예약 메시지를 보내야 한다. 수강생이 많을수록 예약 메시지도 많아진다. node-cron으로 스케줄러를 통해 강의일로부터 하루 전에 예약 메시지를 보내고 있었는데 애플리케이션 단에서 수정을 하게 됐다. 서버에서 도커로 돌아가던 애플리케이션을 다운시키고 이미지를 풀 받은 다음 다시 올렸다. 그러자 예약 메시지들이 오지 않는다. 왜일까? 그건 제목에도 적었듯이 node-cron이 메모리에 스케줄러를 저장시키기 때문이다. 즉, 도커를 다시 시작하자 메모리가 리셋되면서 스케줄러가 없어진거다 🤯🤯🤯 해결법으로 Redis에 저장하자 꼭 Redis가 아니어도 된다. 다른 데이터베이스를 사용해도 되는데 난 Redis를 사용했다. 그렇다면 Redis에 무엇을 .. 2024. 2. 2.
[zipkin] TypeError: fetchImpl is not a function fix 현상 zipkin을 연결한 서비스 A가 로컬에서 npm start을 할 경우 잘 된다. 하지만 Docker로 빌드해서 올리면 서비스 A가 죽는다. 도대체 왜 그럴까? 겨우 찾아낸 오류 문구는 TypeError: fetchImpl is not a function다. https://github.com/openzipkin/zipkin-js/issues/493 node_modules/zipkin-transport-http/src/HttpLogger.js. · Issue #493 · openzipkin/zipkin-js Running a Node application works fine for sending traces. However if I compile this to a minified file in Web.. 2024. 1. 17.
prometheus Error: connect ECONNREFUSED 127.0.0.1:9090 fix 문제 MSA 환경에서 A서비스에서 prometheus에 질의를 해야하는 코드를 작성했다. 포스트맨으로 A서비스 API를 실행한 결과 Error: connect ECONNREFUSED 127.0.0.1:9090라는 오류가 나왔다. 해결 1. prometheus:9090으로 변경하기 await axios.get('http://prometheus:9090/api/v1/query_range', { 바로 잘된다. 혹시 안되는 사람은 아래 github 링크를 보고 다른걸 시도해보길 바란다. https://github.com/grafana/grafana/issues/46434 Error reading Prometheus: Post "http://localhost:9090/api/v1/query": dial tcp 1.. 2024. 1. 9.
Helm을 이용해서 k8s에 Redis 넣기 Helm으로 k8s에 Redis 추가하기 helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update helm에서 redis repo을 가지고 온다. helm install my-redis bitnami/redis --set auth.password=my-password 이렇게 해주면 비번까지 설정할 수 있다. redis에 중요한 데이터를 넣지는 않겠지만 그래도 데이터베이스 비번 설정은 중요하니 넣어주자. kubectl exec -it [pod 이름] -- redis-cli redis에 접속하자. ping이라도 해보려고 했더니 (error) NOAUTH Authentication required가 나온다. kubectl exec -i.. 2023. 12. 21.
[MongoDB] mongoose의 populate을 이용해서 편하게 다른 컬렉션 정보 가져오기 지금 누가 join하고 웃었는가? join은 관계형 데이터베이스에서 많이 쓰인다. SQL에서 join을 사용하면 두 테이블 간의 관계를 기반으로 데이터를 결합하여 결과를 반환한다. 그럼 MongoDB는? $lookupd이라는 Aggregation 연산자가 있긴하다. db.users.aggregate([ { $lookup: { from: "orders", // 결합할 다른 컬렉션 localField: "_id", // 현재 컬렉션의 필드 foreignField: "userId", // 다른 컬렉션의 필드 as: "userOrders" // 결과를 저장할 필드 이름 } } ]); 직접적이고 유연한 방법을 제공하지만 복잡한 쿼리를 작성해야 한다. 이때 mongoose의 populate를 쓰면 좋다. mongo.. 2023. 12. 8.
728x90
반응형