목록Programing/Spring (73)
T_era
1. 템플릿 메서드 패턴이란?템플릿 메서드 패턴(Template Method Pattern)은 행위(Behavioral) 디자인 패턴 중 하나로, 알고리즘의 뼈대(구조)를 정의하고, 특정 단계의 구현은 하위 클래스에게 맡기는 패턴입니다.핵심 특징:추상 클래스를 통해 알고리즘의 뼈대를 작성구현체를 통해 구체적인 알고리즘 단계를 구현상속을 통한 코드 재사용과 확장성 제공2. AOP 로깅에서 템플릿 메서드 패턴을 적용한 이유AOP를 통해 로깅을 구현할 때 다음과 같은 문제에 직면했습니다:중복 코드 문제: 각 로깅 시점마다 새로운 Aspect를 만들면 중복되는 내용이 많음ID 추출 로직의 다양성:User: JWT 토큰에서 사용자 ID 추출Post: 요청/응답 객체에서 postId 추출기타 도메인: 각각 다른 방..
스프링에서 AOP를 이용하여 로깅을 구현할 때 전략 패턴, 템플릿 메서드 패턴, SpEL을 사용하는 각 방법의 장단점, 성능, 주로 사용되는 상황 및 상호 비교는 다음과 같다.1. 전략 패턴 (Strategy Pattern)장점:유연성: 로깅 전략을 쉽게 교체할 수 있다. 예를 들어, 파일 로깅, DB 로깅, 콘솔 로깅 등 다양한 로깅 방식을 필요에 따라 동적으로 변경할 수 있다.개방-폐쇄 원칙 (OCP) 준수: 새로운 로깅 전략을 추가하더라도 기존 코드를 수정할 필요가 없다.테스트 용이성: 각 로깅 전략을 독립적으로 테스트할 수 있다.단점:초기 복잡성: 간단한 로깅 시에도 전략 인터페이스와 여러 구현체를 생성해야 하므로 초기 설계 및 구현이 다소 복잡할 수 있다.클래스 수 증가: 로깅 전략의 수만큼 클..
Spring Cloud Gateway에서 webflux와 일반 route의 차이점:기본 라우팅 (일반 route):spring:cloud: gateway: routes: - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/** filters: - StripPrefix=1WebFlux 라우팅:spring:cloud: gateway: server: webflux: routes: - id: user-service uri: lb://USER-SERVICE predicates: ..
WebFlux 기반의 Gateway 설정들을 상황별 사용법:기본 라우팅 설정:spring:cloud: gateway: server: webflux: routes: - id: user-service uri: lb://USER-SERVICE predicates: - Path=/user-service/** filters: - StripPrefix=1사용 상황: 리액티브 스트림 기반의 비동기 라우팅이 필요할 때높은 동시성 처리가 필요할 때논블로킹 I/O가 필요할 때서비스 디스커버리 설정:spring:cloud: gateway: server: webflux: d..
Spring Cloud Gateway - API Gateway 구현하기1. API Gateway란?API Gateway는 클라이언트와 백엔드 서비스 사이에 위치하는 중간 계층으로,msa로 분산된 api들을 호출하기 위한 하나의 통로라고 보면된다.다음과 같은 주요 기능을 제공한다:라우팅: 클라이언트의 요청을 적절한 마이크로서비스로 전달로드밸런싱: 여러 인스턴스에 요청을 분산인증/인가: API 접근 제어요청/응답 변환: 데이터 형식 변환서킷브레이커: 장애 서비스 격리모니터링: API 사용량 및 성능 모니터링2. Spring Cloud Gateway 의존성 설정build.gradleplugins { id 'java' id 'org.springframework.boot' version '3.2.3' ..
SQL을 작성하는 방식에 대해 정보를 찾아보다가 JPQL과 QueryDSL을 별개로 사용한다는 내용을 보아서 궁금해졌다JDBC를 사용할 때나 JPA의 JPQL을 사용할 때 문자열의 형태로 SQL을 작성하면 컴파일 시점에서 오류를 찾아주지않아 QueryDSL이 엄청 매력적이게 느껴졌는데 사용상황에 따라 구분해서 사용해야할까?결론부터 말하자면 굳이 JPQL을 사용할 필요는 없지만 알고는 있어야한다이다.먼저, JPQL과 QueryDSL의 관계를 이해하는 것이 중요하다JPQL (Java Persistence Query Language) - JPA의 표준 쿼리 언어 - 문자열 기반의 쿼리 작성 - 컴파일 시점에 오류를 잡을 수 없음String jpql = "SELECT m FROM Member m WH..
싱글톤 (Singleton)기본 스코프로, 스프링 컨테이너당 하나의 인스턴스만 생성됩니다.특징:모든 요청에서 동일한 빈 인스턴스를 공유메모리 효율적상태를 공유하므로 상태 관리에 주의 필요사용처:Service LayerRepository LayerUtil ClassConfig Class프로토타입 (Prototype)요청할 때마다 새로운 인스턴스를 생성합니다.특징:매 요청마다 새로운 빈 인스턴스 생성메모리 사용량이 더 많음상태를 독립적으로 관리 가능사용처:사용자별 세션 데이터요청별로 다른 상태를 가져야 하는 컴포넌트멀티스레드 환경에서 독립적인 인스턴스가 필요한 경우리퀘스트 (Request)HTTP 요청마다 새로운 인스턴스를 생성합니다.특징:웹 요청마다 새로운 빈 인스턴스 생성요청이 끝나면 인스턴스 소멸웹 애..
1. REQUIRED (기본값)설명: 호출하는 쪽에 트랜잭션이 있으면 해당 트랜잭션에 참여하고, 없으면 새로운 트랜잭션을 시작한다. 대부분의 비즈니스 로직에 사용되는 가장 일반적인 전파 속성이다.예시 상황: 온라인 쇼핑몰에서 상품을 주문하는 경우.@Servicepublic class OrderService { @Autowired private ProductService productService; @Autowired private PaymentService paymentService; @Transactional(propagation = Propagation.REQUIRED) // REQUIRED (기본값) public void placeOrder(String userId, Strin..
1. JOINED 전략JOINED 전략은 부모 엔티티와 자식 엔티티를 각각 별도의 테이블로 매핑하고, 두 테이블을 조인하여 엔티티를 조회하는 방식이다.구현 예시@Entity@Inheritance(strategy = InheritanceType.JOINED)@DiscriminatorColumn(name = "DTYPE")public abstract class Item { @Id @GeneratedValue private Long id; private String name; private int price;}@Entity@DiscriminatorValue("A")public class Album extends Item { private String artist; priv..
Mockito의 mock()과 ReflectionTestUtils 정리1. mock() 메서드기본 개념Mockito의 정적 메서드로, Mock 객체를 생성@Mock 어노테이션과 동일한 기능을 수행하지만, 코드에서 직접 호출테스트 메서드 내에서 일시적으로 Mock 객체가 필요할 때 유용사용 예시@Testvoid test_with_mock() { // Mock 객체 생성 UserRepository userRepository = mock(UserRepository.class); PasswordEncoder passwordEncoder = mock(PasswordEncoder.class); // Mock 객체 동작 정의 when(userRepository.findById(1L)..