📘 Redux, Transaction, Logging, Lambda, Stream 정리
🧩 Redux
🔐 Redux Persist
Redux의 상태는 기본적으로 새로고침 시 초기값으로 리셋됩니다. 이를 방지하기 위해 redux-persist를 사용하여 상태를 LocalStorage 또는 SessionStorage에 저장할 수 있습니다.
| 구분 | 설명 |
|---|
| 기능 목적 | 새로고침 후에도 상태를 유지하기 위함 |
| 저장소 종류 | LocalStorage, SessionStorage |
| 설치 명령어 | npm i redux-persist |
⚙️ 핵심 용어
| 용어 | 설명 | 예시 코드 |
|---|
persistConfig | persist 설정 객체 | const option = { key: '식별이름', storage } |
persistReducer | 기존 슬라이스를 persist 버전으로 변경 | const persist슬라이스 = persistReducer(option, 슬라이스) |
persistGate | 상태를 로드하는 동안 렌더링을 지연시키는 컴포넌트 | <PersistGate loading={로딩값} persistor={persist스토어}> |
LocalStorage | 기본 스토리지 | import storage from 'redux-persist/lib/storage' |
SessionStorage | 세션 저장소 | import storageSession from 'redux-persist/lib/storage/session' |
💾 Transaction (트랜잭션)
데이터베이스에서 여러 연산(DML) 을 하나의 논리적 작업 단위로 묶어 처리하는 방법.
예시: 이체, 주문, 등록 등 여러 insert/update/delete가 하나의 과정으로 이뤄질 때 사용
✅ 트랜잭션의 4대 속성 (ACID)
| 속성 | 의미 | 설명 |
|---|
| 원자성 (Atomicity) | All or Nothing | 모든 연산이 성공해야 결과 반영 |
| 일관성 (Consistency) | Data Consistency | 트랜잭션 이후 데이터는 일관성 유지 |
| 독립성 (Isolation) | Non-interference | 다른 트랜잭션과 상호 간섭 금지 |
| 지속성 (Durability) | Permanence | 성공 시 결과는 영구히 반영 |
⚙️ 주요 용어
| 용어 | 설명 |
|---|
| commit | 트랜잭션 정상 완료 후 결과 저장 |
| rollback | 오류 발생 시 이전 상태로 복구 |
| savepoint | 특정 시점의 작업 임시 저장 (부분 롤백 가능) |
🧩 Spring에서의 트랜잭션 적용
트랜잭션은 AOP(관점지향 프로그래밍)를 통해 비즈니스 로직에 적용합니다.
| 적용 방법 | 설명 |
|---|
@Transactional 메서드 단위 적용 | @Transactional void method(){} |
| 클래스 전체 적용 | @Transactional class Service{} |
💥 롤백 조건
| 설정 | 설명 |
|---|
| 기본 | RuntimeException 발생 시 롤백 |
@Transactional(rollbackFor = Exception.class) | 모든 예외 시 롤백 |
@Transactional(rollbackFor = 특정예외.class) | 특정 예외만 롤백 |
🧾 Logging (로그 관리)
프로그램 실행 중 발생 정보를 기록하여 상태를 추적하고 유지보수를 용이하게 하는 기능.
⚙️ Spring에서의 로깅
@Log4j2 어노테이션을 사용하여 Controller / Service 계층에서 활용
@Log4j2
class Controller {}
🧠 주요 메서드
| 메서드 | 용도 | 사용 단계 |
|---|
log.debug() | 개발 및 테스트 단계 로그 | |
log.info() | 상태 확인용 로그 (개발/운영 공통) | |
log.warn() | 경고 로그 (운영 단계) | |
log.error() | 예외 발생 확인용 (운영 단계) | |
⚙️ 로그 설정 (application.properties)
| 설정 항목 | 설명 | 예시 |
|---|
| 로그 레벨 | debug < info < warn < error | logging.level.java=info |
| 로그 파일 지정 | 로그 저장 경로 | logging.file.name=경로/파일명.log |
| 로그 패턴 (File) | 로그 파일 형식 설정 | logging.pattern.file |
| 로그 패턴 (Console) | 콘솔 로그 형식 설정 | logging.pattern.console |
패턴 요소
| 코드 | 설명 |
|---|
%msg | 로그 메시지 |
%n | 줄바꿈 |
%d{y M d H m s} | 날짜/시간 |
%level | 로그 레벨 |
%logger | 경로/클래스명 |
🔠 람다식 함수 활용
Lambda (람다식)은 메소드 없이 간결하게 함수를 표현하기 위한 문법입니다.
☯️ 함수형 인터페이스
| 인터페이스 | 설명 | 주요 메서드 | 예시 |
|---|
Function<T,R> | 입력 T를 받아 결과 R 반환 | .apply(T) | Function<Integer,Integer> f = x -> x * 2; |
Supplier<T> | 입력 없이 결과 T 반환 | .get() | Supplier<Double> s = () -> Math.random(); |
Consumer<T> | 입력 T를 받아 반환값 없음 | .accept(T) | Consumer<String> c = x -> {...}; |
Predicate<T> | 입력 T로 boolean 반환 | .test(T) | Predicate<Integer> p = x -> x%2==0; |
🌊 .stream (스트림 API)
stream은 데이터를 처리하기 위한 데이터 흐름 통로입니다.
구조: [ 데이터 ] → [ 중간연산 ] → [ 최종연산 ]
| 조합 | 설명 |
|---|
stream() + forEach() | 단순 반복 |
stream() + map() | 반환값이 있는 반복 |
stream() + filter() | 조건 필터 반복 |
stream() + sort() | 오름차순 정렬 |
stream() + sort(Comparator.reverseOrder()) | 내림차순 정렬 |
stream() + distinct() | 중복 제거 |
stream() + limit(N) | 앞의 N개 데이터 추출 |
stream() + reduce(초기값, (누적, 현재) -> 연산) | 누적 연산 (합계 등) |