java 40

[스프링 입문] 8. 스프링 데이터 JPA

기존에는 리포지토리를 만들 때 EntityManager를 주입받고, JPQL을 직접 작성하고, 구현 클래스를 만들어야 했습니다. 하지만 스프링 데이터 JPA를 사용하면 인터페이스 선언만으로 모든 게 끝납니다.1. 핵심 구조: JpaRepository 상속가장 먼저 해야 할 일은 JpaRepository를 상속받는 인터페이스를 만드는 것입니다.package com.example.spring_study.domain.repository;import com.example.spring_study.domain.Member;import org.springframework.data.jpa.repository.JpaRepository;import java.util.Optional;public interface Sprin..

INFLEARN 2026.03.06

[스프링 입문] 5. 컴포넌트 스캔과 자동 의존관계 설정(@Componet와 @Bean)

1. 컴포넌트 스캔과 자동 의존관계 설정스프링이 애플리케이션 실행 시 @Component와 관련된 어노테이션을 찾아 자동으로 빈(Bean)을 생성하고 연결하는 방식입니다.핵심 어노테이션@Component: 스프링 빈으로 자동 등록됩니다.@Controller, @Service, @Repository: 내부적으로 @Component를 포함하고 있어 스캔 대상이 됩니다.@Autowired: 스프링 컨테이너에서 연관된 객체를 찾아 주입해 줍니다. (DI: Dependency Injection)코드 예시package com.example.spring_study.domain.controller;import com.example.spring_study.domain.service.MemberService;import ..

INFLEARN 2026.03.06

[Spring Boot] 9. 동기 Postgres의 스케줄러 분리

1. 서두: 성능 최적화를 위한 아키텍처 설계 상황현재 프로젝트의 성능을 극대화하기 위해 Full-Async 지향 구조를 설계했습니다.WebClient: FastAPI와의 외부 통신 비동기화.Reactive Redis: Upstash 캐시 접근 비동기화.Postgres (JPA): 유일한 동기(Blocking) 구간인 DB 접근을 스케줄러 분리를 통해 해결.2. 전략: 스케줄러 분리와 자원 동기화Postgres는 현재 JPA(동기) 방식을 사용하므로, 메인 비동기 일꾼(Event Loop)이 DB 작업 때문에 멈추는 것을 방지하기 위해 **boundedElastic**이라는 별도의 주차장(스레드 풀)을 할당했습니다.🔧 설정 1: 환경 변수 (.env 또는 application.properties)DB ..

SPRING BOOT 2026.03.04

[Spring Boot] 8. 비동기 Spring WebClient, Mono와 Flux

1. 배경: 데이터의 '개수'가 아닌 '흐름'기존의 List나 User 객체는 데이터를 이미 다 가져온 '결과물'입니다. 반면 WebClient에서 사용하는 Mono와 Flux는 데이터가 도착할 것이라는 **'약속(Publisher)'**입니다. (데이터가 1개일지, 여러 개일지에 따라 적절한 그릇을 선택)2. Mono (0 ~ 1개의 데이터)*"단 한 번의 응답"**이 필요한 모든 곳에 사용합니다. 주로 상세 조회, 생성, 수정, 삭제 결과에 쓰입니다.[실제 코드 예시: 단일 사용자 정보 조회]파이썬 서버나 DB에서 특정 유저 한 명의 정보를 가져올 때의 전형적인 패턴입니다.public Mono getUserDetail(Long userId) { return webClient.get() ..

SPRING BOOT 2026.03.04

[Spring Boot] 7. Spring Boot CORS 중복 응답(web & webflux 충돌)

1. 배경 및 문제 식별프로젝트 구조: React Native(Web/App) → Spring Boot(Java) → FastAPI(Python) 문제 현상: 웹 브라우저에서 Java 서버로 API 호출 시, 아래와 같은 CORS 에러 발생하며 통신 차단.CORS policy: The 'Access-Control-Allow-Origin' header contains multiple values 'http://localhost:8081, http://localhost:8081', but only one is allowed.핵심 원인: 서버 응답 헤더에 Access-Control-Allow-Origin 값이 하나가 아니라 두 번 중복되어 포함됨.2. 초기 분석 및 환경 확인의존성 (build.gradle)전..

SPRING BOOT 2026.03.04

[스프링 입문] 4. JUnit5 테스트 코드 작성

1. JUnit 테스트의 필요성전통적인 테스트 방식인 main 메서드 실행이나 웹 컨트롤러를 통한 확인은 다음과 같은 단점이 있습니다.준비 및 실행 시간: 서버를 띄우고 화면을 조작하는 등 준비 과정이 오래 걸립니다.반복의 어려움: 한 번 실행한 후 다시 테스트하기 위해 데이터를 수동으로 지우는 등 번거로움이 있습니다.일괄 실행 불가: 수십 가지 기능을 한 번에 검증하기 어렵습니다.JUnit 프레임워크는 이러한 문제를 해결하여 빠르고 반복 가능한 테스트 환경을 제공합니다.2. 회원 리포지토리 테스트 (MemoryMemberRepositoryTest)src/test/java 하위에 생성하며, 각 기능을 독립적으로 검증합니다.테스트 코드 구성package com.example.spring_study.doma..

INFLEARN 2026.03.03

[스프링 입문] 3. Optimal 타입

1. 왜 사용하는가?NullPointerException(NPE) 방지: 값이 null일 때 발생하는 치명적인 오류를 막아줍니다.명시적인 표현: 반환 타입이 Optional라면, "이 결과는 값이 없을 수도 있으니 반드시 체크해라"라는 강력한 메시지를 개발자에게 전달합니다.2. 주요 사용 패턴 (1개 조회 시)보통 결과가 0개 또는 1개인 조회 메서드(findById, findByName)에서 주로 사용합니다.값이 있을 때만 실행: ifPresent()를 사용하여 값이 존재할 때만 특정 로직(예: 중복 체크)을 수행합니다.값이 없으면 예외 발생: orElseThrow()를 사용하여 값이 없을 경우 커스텀 에러를 던집니다.값이 없으면 기본값 반환: orElse()를 사용하여 빈 상자일 때 대신 내보낼 값을..

INFLEARN 2026.03.03

[스프링 입문] 2.MVC 템플릿 엔진 vs API 방식

1. MVC와 템플릿 엔진 (Model, View, Controller)사용자가 보낸 파라미터를 받아 서버에서 HTML을 동적으로 가공해 응답하는 방식입니다.예시 코드Controller:Java@Controllerpublic class HelloController { @GetMapping("hello-mvc") public String helloMvc(@RequestParam("name") String name, Model model) { model.addAttribute("name", name); // 'name'이라는 키로 전달받은 값을 담음 return "hello-template"; // templates/hello-template.html을 찾아라 }}V..

INFLEARN 2026.03.03

[스프링 입문] 1. Spring Boot에서 정적 페이지 로드 순서

1. 정적 페이지 조회 흐름 (그림 설명)웹 브라우저 요청: 사용자가 주소창에 localhost:8080/hello-static.html을 입력합니다.내장 톰캣 서버: 요청을 받아 스프링 컨테이너로 넘깁니다.1순위 - 컨트롤러 확인: 스프링 컨테이너는 먼저 @GetMapping("/hello-static.html")이 설정된 컨트롤러가 있는지 찾습니다. (그림 상에서는 컨트롤러X)2순위 - 정적 리소스 확인: 매핑된 컨트롤러가 없으므로, 내부 resources: static/hello-static.html 파일을 찾습니다.반환: 해당 파일이 있으면 브라우저로 그대로 던져줍니다.2. 전체 폴더 구조 및 예시 코드프로젝트의 구조와 각 위치에 들어갈 코드는 다음과 같습니다.[전체 폴더 구조]spring-stu..

INFLEARN 2026.03.03

[Spring Boot] 6. Java 21 가상 스레드 VS 기존 스레드

1. 가상 스레드 개념 정리등장 배경: 기존 스레드의 한계기존의 Java 스레드(Platform Thread)는 OS 스레드와 1:1로 매핑됩니다.리소스 소모: 스레드 하나 생성 시 약 1MB~2MB의 메모리가 필요합니다.컨텍스트 스위칭 비용: 스레드 전환 시 OS 커널이 개입하므로 CPU 비용이 큽니다.확장성 문제: 수천 명의 동시 접속자를 처리하려면 수천 개의 스레드가 필요한데, 메모리 한계로 인해 서버가 버티지 못하는 '스레드 고갈' 현상이 발생합니다.가상 스레드(Virtual Thread)란?JVM이 관리하는 경량 논리 단위로, OS 스레드와 직접 연결되지 않습니다.수백만 개 생성 가능: 메모리를 KB 단위로 아주 적게 사용하여 일반 노트북에서도 수십만 개 이상을 동시에 띄울 수 있습니다.M:N ..

SPRING BOOT 2026.03.03