Spring19 [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. 제어할수 없는 것에 의존하지 않기(테스트하기 좋은 코드) 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. 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] Spring에서 사용되는 템플릿 메소드 패턴 템플릿 메소드 패턴 GOF의 디자인 패턴에서는 템플릿 메서드 패턴을 다음과 같이 정의하고 있다. 템플릿 메서드 디자인 패턴의 목적은 다음과 같습니다. 작업에서 알고리즘의 골격을 정하고 일부 단계를 하위 클래스로 연기합니다. 템플릿 메서드를 사용하면 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재 정의할 수 있습니다. 쉽게 말해 부모 클래스에 기본적인 알고리즘의 흐름을 구현하고 중간에 필요한 처리를 자식 클래스에게 위임하는 패턴을 템플릿 메서드 패턴이라고 합니다. 템플릿 메소드 패턴 예제 붕어빵을 만드는 과정이 다음과 같다고 가정해보겠습니다. 슈크림 붕어빵 팥 붕어빵 1. 반죽을 넣는다. 2. 슈크림을 넣는다. 3. 반죽을 넣는다. 4. 3분 기다린다. 1. 반죽을 넣는다. 2. 팥을.. Spring Boot/디자인패턴 2023. 4. 29. [ThreadLocal] 쓰레드 로컬 사용해보기 동시성이란? 동시성 문제는 여러 쓰레드가 같은 인스턴스의 필드에 접근해야 하기 때문에 트래픽이 적은 상황에서는 확률상 잘 나타나지 않고 트래픽이 점점 만나질 수록 자주 발생합니다. 특히 스프링 빈처럼 싱글톤 객체의 필드를 변경하며 사용할 때 이러한 동시성 문제를 조심해야 합니다. 이런 동시성 문제는 지역 변수에서는 발생하지 않습니다. 지역 변수는 쓰레드마다 각각 다른 메모리 영역이 할당되기 때문입니다. 동시성 문제가 발생하는 곳은 같은 인스턴스의 필드(주로 싱글톤에서 자주 발생), 또는 static 같은 공용 필드에 접근할 때 발생합니다. 동시성 문제는 값을 읽기만 하면 발생하지 않고 어디선가 값을 변경하기 때문에 발생합니다. 이러한 문제를 해결하기 위한 것이 스레드 로컬입니다. ThreadLocal 쓰.. Java 2023. 4. 22. Transaction 사용법 트랜잭션 전파 @Transcational 어노테이션의 기본 옵션은 REQUIRED이다. public class A { @Transcational public void A() { log.info("A 외부 트랜잭션 시작"); B(); } @Transcational public void B() { log.info("B 내부 트랜잭션 시작"); } } 위와 같은 상황에서 A 메서드에서의 트랜잭션을 외부 트랜잭션 B를 내부 트랜잭션이라 말할 수 있다. 스프링의 경우 외부 트랜잭션과 내부 트랜잭션을 묶어서 하나의 트랜잭션을 만들어준다. 내부 트랜잭션이 외부 트랜잭션에 참여하는것이다. 이것이 기본 옵션은 REQUIRED일때의 트랜잭션 방식이다. 물리 트랜잭션의 실제 DB에서의 트랜잭션이고 논리 트랜잭션은 트랜잭션 .. Spring Boot/Transaction 2023. 1. 24. Logback 커스텀하게 사용하기 이전글들에서 로그백설정으로 로그를 나오게 해봤습니다. 하지만 개발을 하다보면 커스텀하게 1에서는 ~~ 이렇게 로그를 찍고 싶고 2에서는 !!! 이렇게 로그를 찍고 싶은 상황이 있을 것입니다. 그 상황에 맞춰서 로그백을 설정하는 법을 알아보겠습니다. logback-spring-prod.xml ${LOG_DIR}/request1.log ${LOG_DIR}/archive/request1.%d{yyyy-MM-dd}_%i.log 1KB 30 [REQUEST1] ${LOG_PATTERN} true ${LOG_DIR}/request2.log ${LOG_DIR}/archive/request2.%d{yyyy-MM-dd}_%i.log 10KB 30 [REQUEST1] ${LOG_PATTERN} true ${LOG_DIR}.. Spring Boot/Logback 2023. 1. 15. Logback - fileAppender 로그를 남기는게 중요하다는것은 저번글에서 알아보았습니다. 그럼 이제 로컬 환경말고 운영 및 개발 환경에서의 로그를 남기는 법에 대해서 알아보겠습니다. 로컬에서는 인텔리제이로 스프링부트 서버를 시작하게되면 인텔리제이 콘솔에 로그를 확인할수있지만 실제 운영서버를 띄운다면 콘솔을 확인 할 수 없습니다. 그렇기 때문에 파일로 저장해놓은뒤 파일에 적힌 로그들을 확인해야합니다. 이제 파일로 로그를 저장하는 법에 대해서 알아보겠습니다. 프로젝트 구성 logback-variables.properties 로그백 설정에서 사용할 변수들을 정의 해놓은 파일입니다. LOG_DIR=logback/logs LOG_PATTERN=[%-5level] %d{yyyy-MM=dd HH:mm:ss} [%thread] [%logger{40}.. Spring Boot/Logback 2023. 1. 15. Logback 설정하기 Logback 이란? - SLF4J(Simple Logging Facade for Java)라는 인터페이스를 구현하는 구현체이다. ( Simple Logging Facade for Java provides a Java logging API by means of a simple facade pattern. The underlying logging backend is determined at runtime by adding the desired binding to the classpath and may be the standard Sun Java logging package java.util.logging, log4j, reload4j, logback or tinylog. ) - 즉 Logging Frame.. Spring Boot/Logback 2023. 1. 15. Feign Client - Error Decoder 및 logger DemoFeignErrorDecoder public class DemoFeignErrorDecoder implements ErrorDecoder { private final ErrorDecoder errorDecoder = new Default(); @Override public Exception decode(String methodKey, Response response) { HttpStatus httpStatus = HttpStatus.resolve(response.status()); if (httpStatus == HttpStatus.NOT_FOUND) { System.out.println("[DemoFeignErrorDecoder] Http Status = " + httpStatus); throw.. Spring Boot/Feign Client 2023. 1. 15. 이전 1 2 다음