전체 글153 2024.11.25~2024.11.29 팡교 미래에셋 식단 11월 4주차 etc/판교 미래에셋 2024. 11. 28. [Spring] @RequestBody를 Controller에서 받기 전 변환하기 - Interceptor(HttpServletRequestWrapper), RequestBodyAdvice 사용하기 이번 글은 컨트롤러에서 @RequestBody에 붙은 Dto를 받기 전에 컨트롤러에 타입을 변환해서 넘겨줘야 되는 문제를 해결하기 위해 작성하게 되었습니다. 1. 문제 상황프론트에서는 타임 관련된 필드를 long 타입의 Unix Timestamp를 요청하고 응답받아 클라이언트의 타임존에 맞게 시간을 보여주고 있다.기존 DB의 데이터 타입은 Unix Timestamp으로 저장 -> 가독성을 위해 백엔드에서는 DB에 Date 타입으로 조회 및 저장, 수정을 해야 된다.위와 같은 상황에서 이미 개발 된 코드를 일일이 찾아 Unix Timestamp값으로 넘어오는 필드를 수정하는 것보다는 컨트롤러가 받기 전에 변환을 해서 처리하면 괜찮겠다는 생각을 했습니다. 그래서 첫번째 ArgumentResolver(아.. Spring Boot 2024. 5. 18. Spring Boot 3.x Embedded MongoDB Transaction + Replica set Test 1. 소개 스프링 부트와 자바를 사용하고 있고 데이터 베이스는 몽고 디비를 사용하는 곳에서 테스트하기 위한 방법은 저번에 한 번 글로 다룬 적이 있습니다. https://techjisu.tistory.com/180 MongoDB 테스트하기(TestContainer 및 memory DB) 이번에 몽고 디비를 공부하면서 어떻게 테스트할까라는 생각으로 공부하고 글을 작성하게 되었습니다. 기존에는 RDB(MySQL, PostgreSQL)를 사용하면서 hibernate를 사용했으므로 프로덕트 코드는 RDB에 techjisu.tistory.com 여기서 테스트 컨테이너를 사용하면 되지만 도커가 없는 환경에서는 사용할 수 없다는 생각에 mongo-java-server 사용하여 테스트 코드를 작성하였는데요. 테스트 .. 카테고리 없음 2024. 3. 31. [Redis] Redis-Sentinel 구축해보기 센티널이란? 레디스의 자체 고가용성 기능이다. 센티널은 데이터를 저장하는 기존 레디스 인스턴스와는 다른 역할을 하는 별도의 프로그램이며, 페일오버 기능을 사용하면 마스터 인스턴스에 장애가 발생하더라도 레디스를 계속 사용할 수 있도록 동작해 레디스의 다운 타임을 최소화할 수 있다. 센티널의 기능 1. 모니터링 마스터, 복제본 인스턴스의 상태를 실시간으로 확인한다. 2. 자동 페일오버 마스터의 비정상 상태를 감지해 정상 상태의 복제본 중 하나를 마스터로 승격시킨다. 3. 인스턴스 구성정보 안내 센티널은 클라이언트에게 현재 구성에서의 마스터 정보를 알려준다. 페일오버가 발생하면 변경된 마스터 정볼르 재전달하기 때문에 페일오버가 발생하더라도 레디스의 엔드포인트 정보를 변경할 필요가 없다. 센티널 인스턴스 배치 .. DB 2024. 2. 18. [Spring Boot] @Profile 은 어떻게 동작할까? 스프링 부트 프로젝트를 진행하다 보면 운영, 개발, 로컬 등등 프로파일 별로 환경 변수를 다르게 설정해서 사용하게 됩니다. profile 설정 방법 application.yml spring: profiles: default: local --- spring: config: activate: on-profile: local --- spring: config: activate: on-profile: dev --- spring: config: activate: on-profile: prod default 일 때 local로 설정. --- 로 분기하여 각 프로파일일 때 환경 변수를 따로 설정할 수 있습니다. @Profile @Target({ElementType.TYPE, ElementType.METHOD}) @R.. Spring Boot 2024. 2. 7. [MongoDB] Spring Data MongoDB lookup 몽고 디비의 lookup은 RDB에서의 Join과 같은 기능이라 생각하시면 됩니다. 몽고 디비는 유연한 스키마와 변경이 쉬워서 기본적으로 정규화를 하지 않는게 몽고 디비의 특징이라 할 수 있습니다. 이런 특징에 맞게 RDB보다 조인 성능이 느리고 데이터를 중복해서 저장합니다. 그렇기 때문에 조인(lookup)을 하기 보다는 앱 조인이라 하는 Application Layer에서 객체 참조를 통한 조인을 하는 것이 더 효율적이라고 합니다. 글 작성 환경은 spring boot 3.2.1, spring- data-mongodb, java 17에서 작성하였습니다. 이번글에서 사용할 restaurants와 orders 컬렉션입니다. db.restaurants.insertMany( [ { _id: 1, name: .. Spring Boot/mongodb 2024. 1. 31. [ETC] mac os m1 UTM 설치 및 우분투 설치 (virtualbox 대체) 윈도에서는 virtualbox vm을 사용할 수 있지만 맥북 실리콘에서는 잘 되지 않는 경우가 많다. 그래서 UTM이라 도구를 사용하게 되었습니다. UTM 설치 및 우분투 가상 머신 띄우는 방법을 작성해보도록 하겠습니다. UTM 다운로드 brew install --cask utm https://formulae.brew.sh/cask/utm 위의 경로에서 확인할 수 있습니다. ubuntu 22.04 다운로드 https://docs.getutm.app/guides/ubuntu/ utm을 실행한다. 새 가상머신 만들기 Virtualize를 선택 Linux 선택 탐색을 눌러 다운받은 iso 파일을 넣어준다. 메모리 크기와 CPU 코어를 설정해준다. 저장 공간의 크기도 설정해 줍니다. 내 로컬 피시와의 마운트 해.. etc 2024. 1. 12. MongoDB 테스트하기(TestContainer 및 memory DB) 이번에 몽고 디비를 공부하면서 어떻게 테스트할까라는 생각으로 공부하고 글을 작성하게 되었습니다. 기존에는 RDB(MySQL, PostgreSQL)를 사용하면서 hibernate를 사용했으므로 프로덕트 코드는 RDB에 맞게 사용하면서 테스트 코드는 h2(인메모리 디비)를 사용해 hibernate 설정만 바꿔서 편하게 테스트할 수 있었습니다. 스프링 hibernate를 사용하지 않고 몽고 디비는 nosql이므로 기존의 방식과는 다른 방법으로 테스트를 해야 했다,, 공식적인 Spring 그래서 찾은 방법은 TestContainer와 오픈소스인 memory db를 사용하는 방법이다. 1. de.flapdoodle.embed.mongo https://mvnrepository.com/artifact/de.flapd.. Spring Boot 2024. 1. 8. [Java] OCP - 개방 폐쇄 원칙을 잘지키는 코드 객체 지향의 5대 원칙(SOLID)에는 다음과 같이 있습니다. SRP(단일 책임의 원칙: Single Responsibilty Principle) - 하나의 클래스는 하나의 책임을 가져야 한다. OCP(개방 폐쇄 원칙: Open-Closed Principle) - 확장에 대해 열려있고 수정에 대해서는 닫혀 있어야 한다. LSP(리스코프 치환의 원칙: Liskov Substitution Principle) - 하위 타입은 상위 타입을 대체할 수 있어야 한다. ISP(인터페이스 분리 원칙: Interface segregation principle) - 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 한다. DIP(의존 역전의 원칙: Dependency Inversion Principle) - .. Java 2023. 12. 13. [MySQL] Index - 인덱스 사용법 MySQL 인덱스를 공부하고 알기 쉽게 정리하기 위해 글을 작성하게 되었습니다. 1. 인덱스를 왜 사용할까? 다음 두 개의 순서가 적힌 표가 있습니다. 1. 3 1 2 6 4 2. 1 2 3 4 6 1번 표는 3, 1, 2, 6, 4 2번 표는 1, 2, 3, 4, 6 1번과 2번 중에 5가 없다는 것을 알기 쉬운 것은 정렬되어 있는 2번 표라고 생각합니다. 인덱스는 정렬된 자료구조로써 이를 통해 탐색범위를 최소화하게 됩니다. MySQL에서 인덱스 또한 테이블이며 인덱스를 생성시 정렬된 데이터를 가진 테이블을 확인할 수 있습니다. 데이터 주소 이름 종류 가격 1 햄버거 음식 100 2 피자 음식 200 3 콜라 음료 50 4 치킨 음식 300 위와 같은 데이터가 있다고 가정합니다. 가격이 가장 싼 데이터.. DB 2023. 12. 7. ssh 와 scp 명령어 보통 개발을 하다보면 원격 서버에 접속을 하거나 파일을 보내야 하는 일이 생긴다. 이럴때 ssh와 scp 명령어를 사용하면 된다. ssh 기본적으로 ssh는 22번 포트를 사용하게 된다. ssh는 원격서버에 접속할 수 있는 프로토콜이다. ssh -i [sshKey] [linux계정명]@[linux Ip 또는 DNS] ec2 를 사용하면 접속할 수 있는 pem키는 발급받을 수 있는데 sshKey 부분에 pem키 경로를 적어주면 된다. scp scp는 ssh 기반의 파일 전송(복사) 프로토콜이다. 그러므로 22번 포트를 사용한다. 1. 로컬에서 원격지로 전송할 때 scp -i [sshKey] [로컬에서 보내고자 하는 파일명] [linux계정명]@[linux Ip 또는 DNS]:[파일을 저장하고자 하는 경로].. 카테고리 없음 2023. 11. 23. [GitHub Actions + Spring Boot + Nginx + Slack Notification] 무중단 배포 CI/CD 구축하기 우리가 로컬에서 개발하고 이제 실제 운영환경에 배포해야 할 상황이 온다면 어떻게 해야 할까? 일단 앱을 테스트하고 빌드하고 패키징 된 jar파일을 배포를 해야 된다. 이러한 과정을 파이프라인으로 관리하며 자동화할 수 있다면 얼마나 편할까 라는 생각에서 시작하여 글을 작성하게 되었습니다. 모든 코드는 GitHub에 있습니다. 1. CI/CD 란 무엇인가? CI/CD는 앱 개발 과정에서 자동화를 도입하여 고객에게 앱을 자주 제공하는 방법이다. 주요 개념은 지속적인 통합, 지속적인 전달 및 지속적인 배포입니다. CI/CD는 통합 및 테스트 단계부터 제공 및 배포에 이르기까지 앱 수명주기를 전반에 걸쳐 지속적인 자동화 및 모니터링을 합니다. 이러한 연결된 방식을 종합하면 CI/CD 파이프라인이라고도 합니다. 2.. Spring Boot 2023. 11. 22. 이전 1 2 3 4 ··· 13 다음