Spring의 Cache 추상화개발을 하다 보면, 동적으로 변하진 않는데, 자주 필요한 데이터들을 조회하는 API를 호출할 일이 종종 있다. 간단한 예시로 아래와 같은 상황이 있을 수 있다.Frontend에서 select-box의 값을 채우기 위한 data List 조회외부 API에서 특정 데이터를 조회하는데, 외부 API에서 제공하는 데이터의 갱신 주기가 길 때자주 호출되는 데이터이지만, 실시간으로 변하는 값이 아닐 때Spring은 자주 호출되는 메서드의 실행 결과를 캐시에 저장하고, 이후 동일한 요청이 들어오면 캐시 된 값을 반환하여 응답 속도를 높이고 시스템 부하를 줄일 수 있도록 캐싱 기능을 추상화하여 제공한다.캐시 구현체와 무관하게 사용할 수 있도록 @Cacheable, @CacheEvict, ..
스프링 부트에서는 @Transactional 어노테이션을 이용하여 복잡한 트랜잭션 처리를 단순화한다. 클래스, 메서드 단위로 어노테이션을 추가할 수 있고, 스프링이 AOP를 통해 프락시를 도입하여 트랜잭션 처리를 모두 해결해 준다. @Transactional 세부 설정 트랜잭션의 세부 설정을 통해 상황별로 적절한 설정을 하여 성능을 최적화할 수 있다. @Transactional 세부 설정 종류 Isolation (격리 수준 설정) Propagation(전파 수준 설정) readOnly 속성 트랜잭션 롤백 예외 설정 time-out 설정 1. Isolation(격리 수준) 일관성이 깨지는 것을 어느 정도까지 허용하느냐에 대한 설정이다. 기본 설정은 DEFAULT이다. @Transactional(isolat..
빈 스코프란? 스프링 빈은 기본적으로 싱글톤으로 관리된다. 그래서 스프링 컨테이너는 스프링 싱글톤 컨테이너라고 불리기도 한다. 그러나 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. "스코프"는 빈이 존재할 수 있는 범위를 뜻한다. 한마디로 빈 스코프는 빈이 존재할 수 있는 범위 또는 빈의 라이프사이클의 범위라고 생각할 수 있을 것 같다. 스프링은 아래와 같이 다양한 빈 스코프를 지원한다. 싱글톤 : default, 스프링 컨테이너의 시작부터 종료까지 유지되는 가장 넓은 범위의 스코프 프로토타입 : 스프링 컨테이너는 빈의 생성과 의존성 주입까지만 관여하고, 더 이상 관리하지 않는 짧은 범위의 스코프 웹 관련 스코프 : request, session, application 등 여러 스코프..
Spring Bean LifeCycle Spring DI 컨테이너는 Bean으로 등록된 객체의 생명주기 관리를 위임받아서 관리하고, 객체가 필요한 곳에서 이 Bean을 의존성 주입받아서 사용할 수 있다. 스프링 컨테이너가 생성될 때 객체(Bean)를 생성하고 의존성을 주입하는데, 의존관계 주입 후 Bean을 초기화하고, 스프링 컨테이너를 종료하기 전에 객체를 소멸시켜야 한다. 객체의 생성과 초기화 분리 객체를 초기화 한다는 것은, 객체 생성 이외에 외부 커넥션을 연결하거나, 초기값을 등록하는 등의 여러 작업을 말한다. 이 과정을 생성자에서 진행해도 되지만, 객체 생성에 비해 초기화는 비교적 무거운 일을 수행하기 때문에 객체를 생성하는 부분과 초기화하는 부분을 명확하게 나누는 것이 좋다. 빈 생명주기 스프..
DI : Dependency Injection (의존성 주입) 의존성 주입은 객체 간의 의존성을 줄이고 유지보수성을 높이기 위해 사용된다. Spring 컨테이너에 여러 컴포넌트를 Bean으로 등록하여 생명주기 관리를 위임하고, 이 Bean으로 등록한 객체를 주입받아서 사용할 수 있다. DI 덕분에 개발자가 객체 생성에 대한 부분을 신경 쓰지 않고 비즈니스 로직에만 집중할 수 있게 된다. 의존성 주입 방법 의존성 주입 방법은 4가지가 있다. 생성자 주입 Setter 주입 Field 주입 일반 메서드 주입 이 중, 생성자 주입을 가장 많이 사용하고 Spring에서 권장하는 방법이다. 생성자 주입 생성자를 통해 의존성을 주입하는 방법이다. 생성자 호출 시점에 딱 한 번만 호출되는 것이 보장된다. 불변, 필수 ..
JWT을 이용한 인증, 인가 JWT 토큰은 특정 회원 정보를 담은 암호화된 문자열이다. 로그인 시에 이 JWT 토큰을 발행받고, 이 토큰을 클라이언트 측 (브라우저 등)에 보관하며 서버로의 모든 요청 Header에 이 토큰을 포함시켜서 요청한다. 서버에서는 모든 요청마다 Filter에서 이 토큰을 검증하고 사용 권한을 확인하고, 접근 거절 또는 허가를 하게 된다. 단순하다. 요약하자면 아래와 같다. 로그인 시 JWT 토큰 발행 클라이언트는 모든 요청 시 Header에 발급받은 토큰을 포함시킨다. 서버는 모든 요청을 받기 전, Filter를 통해 해당 토큰을 검증하여 권한 여부를 확인한다. 권한이 있으면 접근을 허가하고, 권한이 없으면 접근을 거부한다. JWT? 2023.11.26 - [Spring/Spr..
JWT이란? JWT는 Json Web Token의 약자로, 웹에서 사용되는 JSON 형식의 토큰에 대한 웹 표준 규격이다. 주로 사용자의 인증, 인가 정보를 서버와 클라이언트 간에 안전하게 주고받기 위해 사용된다. JWT의 특징 웹 표준을 따르고 있다. URL-safe 하다. (URL에서 사용할 수 있는 문자로만 이루어져 있다.) 필요한 모든 정보를 하나의 객체에 담아서 전달하기 때문에 JWT 하나로 인증을 마칠 수 있다 JWT 구조 JWT 토큰은 헤더(header)와 페이로드(payload), 서명(signature) 세 부분으로 나누어지고, 각 부분이 ' . '으로 구분된다. 헤더(header) 토큰의 유형과 서명 알고리즘이 명시된다. { "alg" : "HS256", "typ" : "JWT" } 페..
이전 글2023.11.07 - [Database] - [Redis] Redisson 분산 락을 간단하게 적용해 보기 분산 락 AOP 이용하기build.gradle아래 implementation을 추가한다.dependencies {//... implementation 'org.springframework.boot:spring-boot-starter-aop' implementation 'org.redisson:redisson-spring-boot-starter:3.17.0'}@DistributedLock@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface DistributedLock { /** * 락의..