2025/02 14

spring webflux 에 대한 개요

spring webflux 란 비동기식 서버(Netty) , 혹은 MSA 에서 다른 서비스에 데이터를 요청(WebClient) 할 때 유용하게 사용할 수 있는 웹 프레임워크이다. Spring MVC가 동기 방식(Servlet 기반)이라면, WebFlux는 Netty 기반의 논블로킹 방식으로 동작한다.  Reactive Streams 에 기반한 기술이며, 구성요소는 RouterFunctions, Annotation, WebClient가 있다. (비동기 HTTP client, RestTemplate의 대체제.) 동작 방식은 Event Loop 로써, 요청이 들어오면 큐에 등록하고 IO 작업이 완료되면 콜백함수를 실행한다.사용하는 데이터 타입은 Flux(stream) 혹은 Mono.(값이 0또는 1개) 이다...

개발/TIL 2025.02.27

kubernetes에서 yml 로 pod 관리하기

Kubernetes에서는 YAML 파일을 통해 클러스터 리소스를 선언적으로 정의한다. 다음 각 파일은 특정 목적과 역할을 가지고 있다. deployment.yml 애플리케이션의 배포를 정의하는 파일이다. 애플리케이션을 실행할 컨테이너 이미지, 포트, 환경 변수, 볼륨 등의 세부 사항을 명시한다. 복제본(Replica)을 지정하여 원하는 수의 포드를 항상 실행되도록 관리한다. 롤링 업데이트와 같은 배포 전략을 설정할 수 있다. hpa.yml Horizontal Pod Autoscaler(HPA)를 설정하는 파일이다. 클러스터의 리소스 사용률(예: CPU, 메모리 또는 사용자 정의 메트릭)을 모니터링하여 자동으로 포드 수를 조절한다. 부하에 따라 애플리케이션의 확장성과 효율성을 보장할 수 있다. ingres..

개발/TIL 2025.02.26

java record 알차게 사용하기

Java Record는 데이터를 담는 용도의 클래스를 간결하게 선언할 수 있도록 도와주는 Java의 기능이다.  Java 14에서 preview로 도입되었으며, Java 16부터 정식으로 사용 가능하다.Record를 사용하면 보일러플레이트 코드를 크게 줄일 수 있고, 불변(immutable) 데이터 모델을 쉽게 구현할 수 있다! 기본적으로 Record는 다음과 같은 특징을 가진다. 간결한 선언:필드(구성 요소)를 나열하는 것만으로 자동으로 생성자, 접근자(getter), equals(), hashCode(), toString() 메서드 등이 생성된다. 정말 강력한 장점!불변성:Record의 모든 필드는 암묵적으로 final이며, Record 객체는 생성 이후 변경할 수 없다. 명확한 목적:데이터의 단순 ..

개발/TIL 2025.02.25

@EntityGraph 어노테이션

@EntityGraph 어노테이션 자세한 설명1. @EntityGraph란? @EntityGraph는 JPA의 FetchType.LAZY로 인해 발생하는 N+1 문제를 해결하는 방법 중 하나이다.JPA에서 @ManyToOne, @OneToMany 등의 관계를 Lazy Loading으로 설정하면, 연관된 엔티티를 조회할 때 추가적인 SELECT 쿼리가 발생한다. @EntityGraph를 사용하면 JPQL이나 Native Query 없이도 한 번의 쿼리로 연관된 엔티티를 함께 조회할 수 있다. LEFT JOIN FETCH와 유사한 동작을 수행하는 것이 특징이다. 2. @EntityGraph의 사용 목적: N+1 문제를 해결하는 등 성능의 최적화에 도움이 된다. Fetch 전략을 지정할 수 있는데, 직접 JP..

개발/TIL 2025.02.24

로그인 시 refresh token 을 사용하는 이유와 frontend - backend에서 주의할 점

로그인 관련하여 사용자 경험, 보안을 모두 고려해서 refresh token 을 설계하는 것은 매우 기본적이면서도 중요한 문제이다. 이번에는 frontend- backend 각각에서 refresh token 처리를 위한 논리 중 기본적인 뼈대를 정리해보았다. 각각의 구현 방법과 장/단점도 포함되어있다.  사용자가 로그인하면서버는 Access Token과 Refresh Token을 발급한다.Access Token은 메모리(React의 State, Redux, Vuex 등)에 저장한다. Refresh Token은 보안을 위해 HttpOnly Secure Cookie에 저장하거나, 로컬 스토리지에 저장(이 방식은 위험한 편)한다.API 요청 시프론트엔드는 Access Token을 Authorization: B..

개발/TIL 2025.02.23

spring boot 애플리케이션에서 null 데이터 처리하기

프로그래밍을 할 때 Null 데이터를 잘 처리하는 것은 매우 중요하다.  프레임워크 혹은 라이브러리를 활용해 Null 을 허용하지 않음으로써 null에 접근하는 오류를 사전에 방지할 수 있다. 다음 라이브러리에서 어노테이션 활용이 가능하다. Null 처리를 돕는 몇가지 라이브러리에 대해 정리해보려고 한다. Javax Validation (JSR-303/JSR-380) @NotNull null을 허용하지 않음Lombok (lombok.NonNull)@NonNullnull이 들어오면 NullPointerException 발생Spring (org.springframework.lang)@NonNullnull을 허용하지 않음 (Spring 전용) 1. Javax Validation (javax.validation..

개발/TIL 2025.02.22

단 한 줄로 spring boot 애플리케이션 성능 올리기 - gzip

GZIP (Content-Encoding: gzip)gzip은 웹에서 데이터 전송 시 사용되는 압축 방식으로, 응답 데이터를 압축해 전송함으로써 전송 속도를 높이고 대역폭을 절약한다.텍스트 데이터 혹은 json 과 같은 웹 응답 데이터를 압축하면 성능을 올리는데 도움이 된다. 주로 HTTP 응답에서 사용되며, Content-Encoding 헤더에 명시된다.  1.  요청 헤더 (클라이언트 → 서버)GET /index.html HTTP/1.1 Host: example.com Accept-Encoding: gzip, deflategzip: GZIP 압축을 지원함deflate: DEFLATE 압축을 지원함. 2. 응답 헤더 (서버 → 클라이언트)HTTP/1.1 200 OK Content-Encoding: gz..

개발/TIL 2025.02.21

Java의 Optional<T>로 안전하게 null 데이터 처리하기

Java의 Optional은 null을 직접 다루지 않고 안전하게 값(객체)을 다룰 수 있도록 감싸는 컨테이너이다. 기본적으로 null을 방지하는 방법은 javax validation, spring validation, lombok 등에서 제공하는 어노테이션을 활용하는 방법을 통해 null이 아니어야 하는 데이터를 사전 방어 하는 방식이 있다.  이번에 알아보는 방법은, 그런 경우는 다 막더라도 null일 수 있는 데이터에 대해 어떻게 처리할 것인가, 이다.  JAVA SE 8부터 등장한 Optional 은, null이거나 , null이 아닐 수 있는 데이터를 안전하게 감싸고 있는 클래스이며 다양한 api를 제공한다.1. Optional 을 사용하지 않고 get() 을 사용하는 경우. (비추천)- 값이 ..

개발/TIL 2025.02.20

default 를 이용해서 interface 에 메서드 정의하기

java 8부터는 default 키워드를 사용하면 인터페이스 내에서도 메서드의 구현을 포함할 수 있다. public interface ColorRepository { // 기존 방식 (쿼리 실행을 위한 선언) @Query(value = "SELECT ...", nativeQuery = true) Optional findByIdAndLangCd(@Param("id") Long id, @Param("language") String language); // default 메서드 사용하기 default Optional findById(Long id) { return findByIdAndLangCd(id, "en"); // 기본값 "en" 적용 }}default 키워드..

개발/TIL 2025.02.19

JpaRepository 에서 deleteAllInBatch 로 효율적인 삭제하기 (feat. vs deleteAll)

deleteAllInBatch() 함수란? org.springframework.data.jpa.repository.JpaRepository에서 정의되어 있다. 비교할 대상인 deleteAll()은 인터페이스 org.springframework.data.repository.CrudRepository에 정의 되어있다. 둘다 구현체인 org.springframework.data.jpa.repository.support.SimpleJpaRepository에 구현되어있다.  Spring Data JPA의 JpaRepository에서 제공하는 대량 삭제(Batch Delete) 메서드로, 모든 엔티티를 한 번의 SQL 쿼리로 즉시 삭제하는 기능을 한다. deleteAll 메서드는 조회후 삭제하는 반면 (SELECT..

개발/TIL 2025.02.18
728x90
728x90