memo6759 님의 블로그
2025-12-03(Stream APi, 리액트 -> 스프링 -> DB(insert)) 본문
1. 스트림(Stream) 정리 )
Stream이란?
- Java 8에서 도입된 기능
- “컬렉션의 대량 데이터를 간결하게 처리하기 위한 API”
- JavaScript 배열의 filter, map, reduce 기능과 유사
- 기존 반복문보다 훨씬 깔끔하고 안전한 형태로 데이터를 가공할 수 있음
Stream 처리 3단계
① 스트림 생성
자료구조 → stream() 변환
List<Integer> list = List.of(1,2,3); Stream<Integer> s = list.stream();
② 중간 연산
- 스트림을 또 다른 스트림으로 변환
- 필터링, 변형, 정렬
- 반드시 마지막에 종료연산이 있어야 동작함
중간연산 예시:
.filter(x -> x > 10) .map(x -> x * 2) .sorted()
③ 종료 연산(최종연산)
- 스트림을 소비해서 결과를 반환하는 단계
- 끝나면 스트림은 재사용 불가 (일회성)
종료 연산 예시:
.collect(Collectors.toList()) .forEach(System.out::println) .sum() .count()
2. 스트림 연산의 구성
1) 중간 연산
- 결과가 “스트림”
- 메소드 체이닝 가능
- 끝나기 전까지 실제 계산을 하지 않는 지연 연산(lazy evaluation)
대표 중간 연산:
- filter()
- map()
- distinct()
- sorted()
2) 종료(최종) 연산
- 스트림을 “소모”하고 결과를 만듬
- 스트림 → 자료구조(List, Set 등)로 변환하거나
- 합계/평균 등 계산 수행
대표 종료 연산:
- collect()
- forEach()
- reduce()
- count()
스트림 자체를 return 하지 않는다
→ 스트림은 일회용이라 반환하면 프레임워크 성능↓, 코드 유지보수↓
→ 반드시 List/Map/Set 등으로 바꿔서 반환
3. 메소드 참조
람다식을 더 간결하게 쓰는 문법.
① static 메소드 참조
클래스명 :: 메소드명 Math :: max
② 특정 객체의 인스턴스 메소드
object :: method System.out :: println
③ 생성자 참조
클래스명 :: new Student :: new
메소드 참조는 코드 줄 수가 줄고 가독성이 매우 좋아짐.

스트림 (java 8에 도입)
- 컬렉션의 많은 데이터들을 처리하기 위한 기능을 제공하는 공통의 인터페이스
- 많은 데이터를 간결하게 관리할 수 있도록 APi를 제공
- 다양한 자료구조가 동일한 방식으로 연산될 수 있도록 제공
- 자바스크립트의 배열 고차 함수와 비슷한 개념
1. 스트림을 사용하는 방법
1) 스트림 생성
- 자료구조에 담긴 데이터를 스트림으로 변환
2) 데이터 처리
- 원하는 데이터를 필터하거나 새로운 자료구조를 만들기 위해 가공하는 작업을 정의
3) 결과로 자료구조 생성
- 처리된 데이터로 결과를 만들기
- List, Set, Map등으로 변환되거나 합계나 평균을 구하거나 반복해서 출력되는 작업만 처리
2. 스트림연산
- 스트림은 중간연산과 종료연산으로 구성된다.
1) 중간연산은
- 결과가 또 다른 스트림을 반환한다
- 연속적으로 연산이 가능
- 메소드 체이닝이 가능
자료구조객체.stream() ------------ 자료구조객체를 스트림으로 변환
.filter() ------------ 메소드의 실행결과가 스트림을 반환하면 이 결과를 이용해서 다른 메소드를 호출해서 작용 가능
.map() -------------- stream을 리턴하는 여러 메소드를 체이닝 해서 연산을 연속적으로 처리 할 수 있다.
- 중간 연산은 결과가 스트림으로 만들어지기 때문에 이걸로 마무리를 할 수 없고 항상 마무리는 스트림을 소비해야 한다.
2) 종료 연산(최종연산)
- 스트림에 저장된 모든 데이터에 대한 처리를 종료하고 결과를 반환
- 처리를 종료한다는 것은 하나씩 꺼내서 스트림에 저장된 데이터를 사용하는 것은 혹은 결과로 스트림이 아니라 list, Set, Map과 같은 종류의
자료구조를 반환
- 스트림을 처리한 후 결과를 다른 곳으로 리턴하려면 무조건 컬렉션으로 만들어서 사용한다.
- 스트림 자체를 리턴하지 않는다. (성능저하의 원인)
3. 메소드 참조
- 람다 표현식을 간결하게 표현하기 위한 문법
- static 메소드의 참조
형식
클래스명 :: static 메소드명
- 인스턴스메소드의 참조(특정객체의 메소드)
인스턴스명 :: 메소드명
- 생성자 참조
클래스명 :: new
4. 후반부: (Open API ~ Entity ~ React ~ MVC 흐름)
5. Open API, OpenCV, AI API 사용 가능성
- React + Spring 프로젝트는 외부 API 연결 매우 쉬움
- 지도 API(네이버, 카카오)
- 공공데이터 API
- OpenAI API
- OpenCV + Python + MQTT 연계 (라즈베리파이에서 처리)
결국 “웹+AI+IoT” 형태로 확장 가능
→ 스마트 주차장, 스마트 팜 기능 더 넣을 수 있음
6. 웹소켓 · MQTT 활용성
- MQTT → IoT 센서, 라즈베리파이와 연결
- WebSocket → 웹 채팅, 실시간 알림, 실시간 센서 대시보드
둘 다 실시간 기능 제공 방식
React + Spring Boot 에서 손쉽게 사용할 수 있음
7. 람다식이 필요한 이유
익명 내부 클래스에서 override하는 함수가 하나일 때
→ 코드가 너무 길기 때문에 람다식으로 대체 가능
예시:
list.forEach(item -> System.out.println(item));
8. 엔티티(Entity)란
- DB 테이블과 매핑되는 클래스
- persist() = JPA가 관리하는 상태로 변화 (INSERT 준비)
9. 서비스 → 컨트롤러로 갈 때 DTO 변환이 필요한 이유
- 엔티티 그대로 내보내면
- 양방향 무한루프
- 보안 문제
- 화면 요구사항과 구조 불일치
→ 그래서 Service에서 DTO로 변환
10. React는 JSON + Axios로 통신
React → Spring Boot
axios.post("/api/category", { name: "음료" })
Spring → ResponseEntity로 응답
return ResponseEntity.ok(dto);
11. MVC 흐름 완전 정리
✔ Controller
→ Service 메소드 호출
✔ Service
→ DTO/Entity 변환
→ 로직 처리
→ DAO(Repository) 호출
✔ DAO/Repository
→ DB 처리
→ 엔티티 반환
⚠ 타입이 맞지 않으면
→ null 반환
→ 에러 대신 로그만 출력하도록 처리 가능
'HDC 학습일지' 카테고리의 다른 글
| 2025-12-05(스프링 시큐리티) (0) | 2025.12.06 |
|---|---|
| 전체 백엔드 흐름 (0) | 2025.12.02 |
| 2025-12-02(웹 mqtt) (1) | 2025.12.02 |
| 2025-11-25(카메라 센서 - react MQTT) (0) | 2025.12.02 |
| 2025-11-24(리액트 state, props) (0) | 2025.11.27 |