Spring Boot61 [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] @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. 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. [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. 제어할수 없는 것에 의존하지 않기(테스트하기 좋은 코드) https://www.youtube.com/watch?v=DJCmvzhFVOI 위의 세미나를 유튜브로 시청한뒤 회사에서 마침 적용한 부분이 있어서 사례를 작성해 보려고 합니다. 1. 투표 기능 2. 외부 API 연동 1. 특정 날짜에 의존하지 않기 (투표 기능) 어느날 투표 기능을 할 수 있는 API를 추가해야 된다고 했을때 다음과 같은 요구 사항이 있다고 가정하겠습니다. 1. 해당 투표는 특정한 요일에만 정상 작동 되어야 한다. 그러면 다음과 같이 코드를 작성할 수 있습니다. 기존 코드 public class VoteService { public String vote() { LocalDateTime now = LocalDateTime.now(); if (now.getDayOfWeek() == DayOf.. Spring Boot 2023. 11. 5. QueryDSL 다중 DB 설정하기 개발 환경 Java 17 spring boot 3.1.1 h2database PrimaryDatasource @Configuration @EnableJpaRepositories( entityManagerFactoryRef = "primaryEntityManager", transactionManagerRef = "primaryTransactionManager", basePackages = "com.example.multiplebeans.repository.primary" ) public class PrimaryDatasource { @Bean @ConfigurationProperties("spring.datasource.hikari.primary") // 외부 설정을 주입 받는 객체라는 뜻이다. publi.. Spring Boot 2023. 6. 27. JDK Dynamic Proxy, CGLIB 그리고 AOP 프록시 패턴 프록시 패턴이라는 디자인 패턴이 있다. 프록시 패턴은 실제 기능을 수행하는 객체 대신 가상의 대리자(프록시)를 사용하여 로직의 흐름을 제어하는 디자인 패턴이다. 프록시 패턴의 활용 원래 하려던 기능을 수행하며 그 외의 부가적인 작업 (로깅, 캐싱, 인증, 트랜잭션 등)을 별도로 수행할 수 있다. 비용이 많이 드는 연산 (DB 쿼리)를 실제로 필요한 시점까지 미룰 수 있다. 프록시 객체 만드는 법 기존의 객체를 프록시를 만드는 법은 두가지가 있다. 1. JDK Dynamic Proxy 2. CGLIB JDK Dynamic Proxy JDK Dynamic Proxy 는 Java의 리플렉션 패키지에 존재하는 Proxy라는 클래스를 통해 생성된 프록시 객체를 의미 한다. 타겟클래스를 리플렉션의 Pr.. Spring Boot/AOP 2023. 5. 2. [디자인패턴] Spring 에서 사용되는 프록시, 데코레이터 패턴 프록시(Proxy) 패턴 프록시 패턴은 실제 기능을 수행하는 객체 대신에 가상의 객체를 사용해 로직의 흐름을 제어(접근 제어가 목적)하는 디자인 패턴 입니다. 클라이언트는 서버에 필요한 것을 요청하고, 서버는 클라이언트의 요청을 처리하는 일을 합니다. 프록시는 클라이언트가 요청한 결과를 서버에 직접 요청하는것이 아니라 어떤 대리자를 통해 간접적으로 서버에 요청하는것을 말합니다. 프록시의 주요 기능 접근제어 권한에 따른 접근 차단 캐싱 지연로딩 부가 기능추가 원래 서버가 제공하는 기능에 더해서 부가 기능을 수행한다. 예) 요청 값이나, 응답 값을 중간에 변경한다. 예) 실행 시간을 측정해서 추가 로그를 남긴다. 프록시(Proxy) 패턴 예시 SNS 서비스가 있습니다. 이 SNS의 글의 목록을 조회하여 화면.. Spring Boot 2023. 4. 30. [Spring] Spring에서 사용되는 템플릿 콜백 패턴 콜백 정의 프로그래밍에서 콜백 또는 콜애프터 함수는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있다. 템플릿 콜백 패턴 템플릿 콜백 패턴은 전략 패턴의 변형된 형태입니다. 전략패턴은 코드가 변화되는 부분을 매번 클래스로 만들고 외부에서 구체 클래스를 주입해 주어야 한다. 반면 템플릿 콜백 패턴은 변화되는 부분을 독립된 클래스를 만드는 것이 아니라 익명 내부 클래스를 생성하여 이를 활용하므로 주입이 필요하지 않다. 그렇기 때문에 템플릿은 정해져있는 틀, 콜백은 인수로 넘겨주는 실행 가능한 코드. 이 두개를 합쳐 템플릿 콜백 패턴이라 한다. 템플릿 콜백 패턴은 GOF 패턴은 아니고 스프링 내부에.. Spring Boot/디자인패턴 2023. 4. 30. [Spring] Spring에서 사용되는 템플릿 메소드 패턴 템플릿 메소드 패턴 GOF의 디자인 패턴에서는 템플릿 메서드 패턴을 다음과 같이 정의하고 있다. 템플릿 메서드 디자인 패턴의 목적은 다음과 같습니다. 작업에서 알고리즘의 골격을 정하고 일부 단계를 하위 클래스로 연기합니다. 템플릿 메서드를 사용하면 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재 정의할 수 있습니다. 쉽게 말해 부모 클래스에 기본적인 알고리즘의 흐름을 구현하고 중간에 필요한 처리를 자식 클래스에게 위임하는 패턴을 템플릿 메서드 패턴이라고 합니다. 템플릿 메소드 패턴 예제 붕어빵을 만드는 과정이 다음과 같다고 가정해보겠습니다. 슈크림 붕어빵 팥 붕어빵 1. 반죽을 넣는다. 2. 슈크림을 넣는다. 3. 반죽을 넣는다. 4. 3분 기다린다. 1. 반죽을 넣는다. 2. 팥을.. Spring Boot/디자인패턴 2023. 4. 29. 핀포인트 설치하기 연관글 1. 네이버 핀포인트란? 2. 핀포인트 설치하기 글 작성을 위한 환경 구성은 아래와 같이 하겠습니다. - EC2에 Hbase, Collector, Web을 모두 설치 - 로컬 PC에 Agent를 설치해서 Spring boot 프로젝트 구성해서 실행 EC2 - t2.medium - java 11, java 8 - ubuntu 20.04 위와 같이 구성한 이유는 프리티어를 사용해서 구성하려 했으나 Hbase설치 -> 실행, Collector를 설치하고 실행, Web을 설치하고 기동 하면 ec2에 접속이 안 되는 문제가 있었습니다. 원인을 찾지는 못했으나 CPU 지표가 90%가 넘게 치솟고 아마 램도 부족해서 ec2에 접속이 안되는 현상이 일어나지 않나 싶습니다. 그래서 CPU도 2개에 램도 4GB인 .. Spring Boot/모니터링 2023. 4. 1. 이전 1 2 3 4 ··· 6 다음