본문 바로가기

Back-end78

리액티브 프로그래밍 Spring WebFlux - 디버깅, 테스팅 디버깅  디버그 모드 Hooks.onOperatorDebug(); 비용이 많이 드는 동작 과정을 거치기 때문에 -> 처음부터 디버그 모드를 활성화하는 것은 권장하지 않음  checkpoint() 사용Flux .just(2, 4, 6, 8) .zipWith(Flux.just(1, 2, 3, 0), (x, y) -> x/y) .checkpoint("Example12_4.zipWith.checkpoint", true) .map(num -> num + 2) .checkpoint("Example12_4.map.checkpoint", true) .subscribe( data -> log.info("# onNext: {}", data), .. 2024. 8. 4.
리액티브 프로그래밍 Spring WebFlux를 이용한 Non Blocking 애플리케이션 구현 리액티브 시스템 리액티브 스트림즈 Blocking I/O 와 Non-Blocking I/O 함수 디스크립터 (Function Descriptor) ReactorHot Sequence & Cold Sequence Backpressure Scheduler Context리액티브 시스템과 리액티브 프로그래밍    리액티브 시스템  리액티브 시스템이란?리액티브라는 용어는 어떤 이벤트나 상황이 발생했을 때, 그에 따라 적절하게 행동하는 것을 의미합니다.그래서 리액티브 시스템은 반응을 잘하는 시스템, 클라이언트의 요청에 즉각적으로 응답함으로써 지연 시간을 최소화합니다.   리액티브 선언문MEANS: 비동기 메시지 기반의 통신 -> 느슨한 결합, 격리성, 위치 투명성 보장FORM: 리액티브 시스템이 비동기 메시지 통신.. 2024. 8. 3.
테스트와 테스트 주도 개발 TDD 테스트 테스트의 장점회귀 방지: 기존코드가 변경에도 잘 실행되는지 확인가능 잠재적 오류의 발견 가능성이 높음테스트를 통과한 코드만 운영코드에 배포  테스트 종류인수테스트: 최종 환경과 유사한 상태로 테스트E2E테스트: End To End Test 처음부터 끝까지 테스트통합테스트: 여러 요소를 복합적으로 테스트단위테스트: 필요한 단위로 쪼개서 테스트  테스트 대역모든 유형의 비운영용 가짜 의존성을 포괄하는 용어, 스턴트 대역이라는 개념에서 시작관리할 수 없는 것들에 주로 Mock 사용    단위 테스트DB 포함해서 단위테스트를 작성할 때 신경쓸 부분 테스트간에 데이터가 공유되어서는 안됩니다!- 테스트간 독립적으로 수행되고 서로의 영향을 받지 않도록 설정하는 것이 핵심! 텍스트 픽스처:- setup, bef.. 2024. 6. 27.
도메인 주도 개발 - 도메인서비스 도메인서비스  도메인 서비스 객체를 애그리거트에 주입하지 않기public class Order { @Authwired private DiscountService discountService; ..} Service 필드는 데이터 자체와는 관련이 없다. 저장 대상도 아니다.일부 기능만 필요로 하기 때문에 굳이 의존 주입을 할 이유는 없다. public class Order{ public void calculate(DiscountService discountService, .. ) { .... }} public class OrderService { private DiscountService discountService; private Order crea.. 2024. 5. 15.
도메인 주도 개발 - 이벤트 이벤트과거에 벌어진 어떤 것을 의미   시스템 간 강결합 문제public void 최소() { 주문취소 환불 (외부 환불 처리 서비스 이용)}외부 서비스의 성능에 영향을 받는 문제 도메인 객체에 서로 다른 도메인 로직이 섞이는 문제 강한 결합을 없앨 수 있는 방법은 이벤트를 사용하는 것특히 비동기 이벤트를 사용하면 두 시스템 간의 결합을 크게 낮출 수 있다.  이벤트 구성요소이벤트 생성 주체 -> 이벤트 퍼블리셔 -> 이벤트 핸들러 이벤트 용도1. 트리거: 도메인의 상태가 바뀔 때 다른 후처리가 필요하면 후처리를 실행하기 위한 트리거로 이벤트를 사용할 수 있다.2. 서로 다른 시스템 간의 데이터 동기화  이벤트 장점1. 서로 다른 도메인 로직이 섞이는 것을 방지2. 기능 확장에 용이  .. 2024. 5. 15.
내부망 프로젝트 - SAP HANA DB & Spring Boot DataBase 를 SAP HANA DB로 이관하면서 HANA DB 실습과 스프링 부트 연동을 했던 과정을 전체는 못담았지만 일부 기록을 남기려고 합니다. 1. HANA DB 실습 VMware 설치 VMware 다운로드 및 설치 방법(feat. VMware Workstation 무료 설치) HANA DB 관련 [무료 SAP HANA 설치하기] 01. 설치 파일 다운로드 및 vmware 준비 [무료 SAP HANA 설치하기] 03. HANA Studio 설치하기 HANA 멀티테넌트 DB - 3. 접속포트 이클립스 설치 하나 스튜디오를 사용하기 위해 이클립스를 활용합니다. HANA Studio Plug-in 설치 이클립스 실행 후 상단 메뉴 Help > Install New Software https://t.. 2024. 1. 10.
스프링부트 API JPA 최적화 페치조인, 페이징 default_batch_fetch_size 페치조인, 페이징 1. 페이징 엔티티 조회 * 선호하는 방법 중 하나 @GetMapping("/api/v3-1/orders") public ResponseEntity orderV3_page( @RequestParam(value = "offset", defaultValue = "0") String offset, @RequestParam(value = "limit", defaultValue = "100") String limit ) { // N 만큼 데이터 나옴 List orders = repository.findAllWithMemberDelivery(offset, limit); // ToOne 관계이기 때문에 페이징 가능 List result = orders.stream() .map(o -> new Ord.. 2023. 12. 23.
스프링부트 API JPA 최적화 (N+1) 컬렉션 조회 최적화, DTO 조회 성능 향상 컬렉션 조회 최적화 1. 엔티티 조회 - 페치 조인으로 쿼리 수 최적화 OrderApiController /** * 페치 조인 */ @GetMapping("/api/v3/orders") public ResponseEntity orderV3() { // N 만큼 데이터 나옴 List orders = repository.findAllWithItem(); List result = orders.stream() .map(o -> new OrderDto(o)) .toList(); return ResponseEntity.ok(new Result(result)); } Order 엔티티 객체로 쿼리 결과를 받아서 Dto 로 변환작업을 한다음 반환 OrderRepository findAllWithItem() public .. 2023. 12. 21.
스프링부트 API JPA 최적화 ToOne 관계 (N+1 문제) , 페치 조인 ToOne 관계 (N+1 문제) , 페치 조인 지연 로딩과 조회 성능 최적화 주문(Order) 내의 ToOne 관계인 member, delivery 지연로딩 조회 Entity @Table(name = "orders") @Getter @Setter public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; // = new ProxyMember()를 생성해서(하이버네이트에서) 넣어둔다. // =.. 2023. 12. 19.
내부망 프로젝트 - Offline 에서 Spring Boot 개발 Maven 레포지토리 새로운 프로젝트에 투입하게 되었습니다. 그래서 요구사항 정의부터 시작하게 되어 23년 12월 말까지 진행하는 프로젝트 입니다. 이번 프로젝트는 보안이 중요한 국가(기관)에서 하는 프로젝트이기 때문에 내부망(폐쇄망)에서 접속가능한 웹포털을 개발하는 프로젝트입니다. 내부망 프로젝트는 처음이라 내부망 환경에서 어떻게 웹포털 프로젝트를 진행하게 되는지 기록하려고 합니다. 내부망 포털, 공유 디스크 등을 사용하려면 해당 담당자 분이 PC에 각종 보안 프로그램을 설치하여 외부망을 쓰지 못하도록 설정하게 됩니다. 그래서 내부망 PC로 전환전에 기존 다른 프로젝트를 실행시켜 메이븐/Gradle repository 파일들을 받아 오거나 프로젝트에 필요한 의존성 파일들을 최대한 받아옵니다. 뿐만 아니라 office, 한글.. 2023. 10. 15.
Spring Cloud (MSA) - 모니터링 (Actuator, Prometheus, Grafana) 개요 배포를 한 뒤에 내가 내가 배포한 서버가 잘 동작하는지 어떻게 동작하고 있는지 서버의 상태를 확인할 수가 없었습니다. 그래서 모니터링하는 기술들이 있었는데 적용해본 기술들은 다음과 같습니다,. Spring Actuator Prometheus Grafana 그라파나를 사용하기 위해서는 프로메테우스의 정보가 필요하고 프로메테우스를 사용하기 위해서는 /actuator/prometheus 와 같이 연결이 필요했습니다. 그래서 Spring Actuator, Prometheus, Grafana 순으로 적용시켜보았습니다. 환경 Win11 Spring boot 2.7.8 Docker Engine v20.10.21 Spring Actuator implementation 'org.springframework.boot.. 2023. 2. 16.
Spring Cloud (MSA) - 스프링부트 도커 이미지 생성 후 컨테이너 실행 도커 이미지 생성 예시1) 윈도우에서 테스트없이 빌드 : ./gradlew clean build -x test 이미지 생성 $ docker build -t llsrrll96/timedeal:timedeal-0.0.1-SNAPSHOT . 생성이 안될 경우 참고 윈도우에서 테스트없이 빌드 : ./gradlew clean build -x test 빌드를 해서 .jar 파일 생성 예시2) docker build -t docker.io/in28min/mmv2-currency-exchange-service:0.0.1-SNAPSHOT . 예시3) $ docker build -t chat:chat-0.0.1-SNAPSHOT . {이미지이름}:TAG 이미지 확인 docker images 또는 Docker Desktop .. 2023. 2. 1.