Spring
-
[JPA] Json 다형성을 활용한 DTO 설계와 확장Spring/JPA 2024. 11. 26. 12:59
API를 설계하다 보면 서로 다른 요청 데이터 타입에 공통 필드가 반복적으로 존재하는 경우가 많습니다.이 상황에서 새로운 공통 필드가 추가되거나 변경될 때 모든(1억개) DTO를 수정해야 하는 번거로움이 발생합니다. DTO(Data Transfer Object)를 쓰는 이유?"Controller에서는 DTO로 요청 정보를 받는 게 좋다."라는 말을 개발 공부를 시작했을 무렵 접하게 되었습니다.하지만 이유를 정확히 알지 못한 상태에서 사용해 오다가 이번에 JPA 공부를 하면서 그jangto.tistory.com1. 문제사항처음 API를 설계할 때 공통 내용을 요청받는 DTO를 각각 따로 만들었다고 가정합니다.예를 들어 BookRequest, AlbumRequest, MovieRequest라는 요청 DTO가..
-
DTO(Data Transfer Object)를 쓰는 이유?Spring 2024. 11. 11. 12:50
"Controller에서는 DTO로 요청 정보를 받는 게 좋다."라는 말을 개발 공부를 시작했을 무렵 접하게 되었습니다.하지만 이유를 정확히 알지 못한 상태에서 사용해 오다가 이번에 JPA 공부를 하면서 그 의미를 더 깊이 이해하게 되었습니다. 해당 글에서는 Entity 대신 DTO를 사용해야 하는 이유를 정리했습니다.Entity와 DTO란 무엇일까?JPA와 같은 ORM(Object Relational Mapping) 기술을 사용할 때 Entity란 DB 테이블과 1:1로 매핑되는 클래스를 의미하며 각 필드는 테이블의 컬럼과 연결되어 애플리케이션에서 DB와 상호작용하는 도메인 모델의 역할을 합니다.DTO(Data Transfer Object)는 데이터 전송을 위한 전용 객체로써 주로 API 요청과 응답 ..
-
BeanPostProcessor 사용법: 빈 초기화 과정에서의 조작과 시점 이해하기Spring 2024. 11. 7. 18:02
BeanPostProcessor는 Spring에서 빈이 등록되기 전 빈을 조작할 수 있는 강력한 기능입니다.빈 초기화 과정에서 BeanPostProcessor의 역할을 알아보고 @PostConstruct와의 실행 순서 차이에 따른 충돌 가능성을 알아보겠습니다.Bean이 등록되는 과정Spring Container가 빈을 등록할 때 간단하게 아래와 같은 순서로 진행됩니다.빈 정의 등록 - 빈 메타데이터를 등록합니다.빈 인스턴스 생성 - 빈 객체를 생성합니다. 의존성 주입 - 의존성을 주입합니다.빈 초기화 - 초기화 메소드를 호출합니다. 빈 등록 - 컨테이너에 등록합니다.BeanPostProcessor를 사용하면 빈 초기화 전후 단계에서 빈을 조작할 수 있습니다.※ BeanPostProcessor는 가장 우선..
-
[Spring Cloud 2일차] API Gateway 필터 순서 및 Eureka Load BalancingSpring/Cloud 2024. 9. 11. 14:21
Spring Cloud Gateway에서 API Gateway 필터 구성하기사용자 정의 필터를 생성하려면 AbstractGatewayFilterFactory를 상속 받은 후 apply 메서드를 구현한다.GatewayFilter를 반환해야 하며 GatewayFilter를 구현한 OrderedGatewayFilter로 생성하면 실행 순서를 지정할 수 있다.OrderedGatewayFilter는 Ordered도 구현하고 있는데 Ordered 객체 안에는 HIGHEST_PRECEDENCE (Integer.MIN_VALUE)와 LOWEST_PRECEDENCE(Integer.MAX_VALUE)가 있어서 가장 먼저 실행되야 하는것과 가장 마지막에 실행되어야 한는 필터의 순서를 쉽게 지정해줄 수 있다.추가 ) Filt..
-
[Spring Cloud 1일차] Eureka 연동 및 API Gateway 설정과 필터링Spring/Cloud 2024. 9. 11. 11:53
서버 포트 번호 설정: server.port = 0Spring Boot에서 server.port=0으로 설정하면, 서버는 자동으로 사용 가능한 랜덤 Port 번호를 할당한다.이는 Spring Cloud에서 특히 유용하며 여러 애플리케이션 인스턴스를 각기 다른 Port로 실행해 Eureka와 같은 서비스 등록 서버에 유연하게 등록할 수 있다.Eureka 연동 시 랜덤 Port 번호 문제점Eureka는 기본적으로 Host 이름과 Port 번호를 결합하여 인스턴스를 등록하는데 포트가 0으로 설정하면 포트번호가 0번으로 등록되어서 같은 Host 이름을 가지게 되면 몇 개를 등록해도 1개만 등록된 것처럼 보이는 문제점이 있다.이를 해결하기 위해 고유한 인스턴스 ID 설정이 필요하다. [Eureka Client 설..
-
[Spring] Proxy 내부 호출 문제 해결 및 순환 참조 문제 해결Spring 2024. 8. 28. 17:35
Proxy 내부 호출@Component@Slf4jpublic class A { public void external() { log.info("external"); internal(); } public void internal() { log.info("internal"); }}---@Aspect@Slf4jpublic class AllAspect { @Before("execution(* *(..))") public void doA(JoinPoint joinPoint) { log.info("aop = {}", joinPoint.getSignature()); }}위 상황에서 external()을 호출하면 doA 메서드에서 작..
-
[Spring] Thread Local 사용 시 주의 사항Spring 2024. 8. 3. 20:11
Java에서 기본적으로 제공하는 ThreadLocal은 동시성 문제를 해결하는 가장 기본적인 방법 중 하나입니다.ThreadLocal은 내부적으로 Map 자료 구조를 통해 각 Thread 별로 데이터를 저장하고 불러오기 때문에 각 Thread는 자신만의 데이터를 독립적으로 가질 수 있습니다.Thread와 ThreadPoolThread는 하나의 프로세스 내에서 실행 단위를 뜻합니다.Spring을 통해 웹 개발을 할 때 일반적으로 ThreadPool을 통해 Thread를 관리합니다.이러한 상황에서 ThreadLocal을 사용할 경우, 몇 가지 주의해야 할 점이 있습니다.주의사항 1. ThreadPool 재사용 문제ThreadPool에서는 Thread가 응답 후 사라지는 것이 아니고 다시 ThreadPool로..
-
[Spring-Security 6.3.0-M1] 권한 계층 RoleHierarchySpring/Security 2024. 5. 29. 23:18
기존 방식public RoleHierarchy roleHierarchy() { RoleHierarchyImpl roleHierarchyImpl = new RoleHierarchyImpl(); roleHierarchyImpl.setHierarchy("ROLE_ADMIN > ROLE_USER"); return roleHierarchyImpl;}변경 방식public RoleHierarchy roleHierarchy() { return RoleHierarchyImpl.fromHierarchy("ROLE_ADMIN > ROLE_USER");}변경 사항기본 생성자 사용 중단기존의 기본 생성자 생성자 RoleHierarchyImpl()은 사용하지 않게 되었습니다.팩토리 메소드인 fromHierarchy()을 통해 객..