| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
- Kotlin
- 배포
- spring boot
- AI
- architecture
- Network
- VUE
- java
- docker
- Spring
- react
- Android
- Design
- TypeScript
- SQL
- DL
- frontend
- CS
- cloud
- inflearn
- Database
- Python
- blockchain
- OS
- http
- DB
- Studying
- GCP
- springboot
- Algorithm
- Today
- Total
목록java (66)
소소한 지식 저장소
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)전..
1. JUnit 테스트의 필요성전통적인 테스트 방식인 main 메서드 실행이나 웹 컨트롤러를 통한 확인은 다음과 같은 단점이 있습니다.준비 및 실행 시간: 서버를 띄우고 화면을 조작하는 등 준비 과정이 오래 걸립니다.반복의 어려움: 한 번 실행한 후 다시 테스트하기 위해 데이터를 수동으로 지우는 등 번거로움이 있습니다.일괄 실행 불가: 수십 가지 기능을 한 번에 검증하기 어렵습니다.JUnit 프레임워크는 이러한 문제를 해결하여 빠르고 반복 가능한 테스트 환경을 제공합니다.2. 회원 리포지토리 테스트 (MemoryMemberRepositoryTest)src/test/java 하위에 생성하며, 각 기능을 독립적으로 검증합니다.테스트 코드 구성package com.example.spring_study.doma..
1. 왜 사용하는가?NullPointerException(NPE) 방지: 값이 null일 때 발생하는 치명적인 오류를 막아줍니다.명시적인 표현: 반환 타입이 Optional라면, "이 결과는 값이 없을 수도 있으니 반드시 체크해라"라는 강력한 메시지를 개발자에게 전달합니다.2. 주요 사용 패턴 (1개 조회 시)보통 결과가 0개 또는 1개인 조회 메서드(findById, findByName)에서 주로 사용합니다.값이 있을 때만 실행: ifPresent()를 사용하여 값이 존재할 때만 특정 로직(예: 중복 체크)을 수행합니다.값이 없으면 예외 발생: orElseThrow()를 사용하여 값이 없을 경우 커스텀 에러를 던집니다.값이 없으면 기본값 반환: orElse()를 사용하여 빈 상자일 때 대신 내보낼 값을..
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..
1. 정적 페이지 조회 흐름 (그림 설명)웹 브라우저 요청: 사용자가 주소창에 localhost:8080/hello-static.html을 입력합니다.내장 톰캣 서버: 요청을 받아 스프링 컨테이너로 넘깁니다.1순위 - 컨트롤러 확인: 스프링 컨테이너는 먼저 @GetMapping("/hello-static.html")이 설정된 컨트롤러가 있는지 찾습니다. (그림 상에서는 컨트롤러X)2순위 - 정적 리소스 확인: 매핑된 컨트롤러가 없으므로, 내부 resources: static/hello-static.html 파일을 찾습니다.반환: 해당 파일이 있으면 브라우저로 그대로 던져줍니다.2. 전체 폴더 구조 및 예시 코드프로젝트의 구조와 각 위치에 들어갈 코드는 다음과 같습니다.[전체 폴더 구조]spring-stu..
1. 가상 스레드 개념 정리등장 배경: 기존 스레드의 한계기존의 Java 스레드(Platform Thread)는 OS 스레드와 1:1로 매핑됩니다.리소스 소모: 스레드 하나 생성 시 약 1MB~2MB의 메모리가 필요합니다.컨텍스트 스위칭 비용: 스레드 전환 시 OS 커널이 개입하므로 CPU 비용이 큽니다.확장성 문제: 수천 명의 동시 접속자를 처리하려면 수천 개의 스레드가 필요한데, 메모리 한계로 인해 서버가 버티지 못하는 '스레드 고갈' 현상이 발생합니다.가상 스레드(Virtual Thread)란?JVM이 관리하는 경량 논리 단위로, OS 스레드와 직접 연결되지 않습니다.수백만 개 생성 가능: 메모리를 KB 단위로 아주 적게 사용하여 일반 노트북에서도 수십만 개 이상을 동시에 띄울 수 있습니다.M:N ..
1. 테스트 계층별 요약표각 계층은 서로 다른 목적을 가지고 있으며, 사용하는 도구도 다릅니다.계층 테스트 종류 주요 어노테이션 핵심 목적Controller슬라이스 테스트@WebMvcTestAPI 경로, 리다이렉트, 뷰 이름, 입력값 검증Service단위 테스트@ExtendWith비즈니스 로직, 예외 발생 조건 검증Repository통합 테스트@MyBatisTestSQL 문법, DB 테이블 구조 일치 여부 확인2. 계층별 실제 테스트 코드 및 상세 설명① Controller 테스트: "사용자를 어디로 보낼 것인가?"서버 전체를 띄우지 않고 HTTP 요청과 응답만 가짜로 시뮬레이션합니다.@ActiveProfiles("test") // test 설정 적용@WebMvcTest(AuthController.cla..
1. 발단: 로컬 환경의 한계와 권한 에러상황Spring Boot 서버에서 userUpload/DOC 경로에 파일을 저장하려 시도.에러 발생: java.nio.file.AccessDeniedException: /Users/userUpload원인: 서버 프로세스가 Mac/Linux의 루트 권한 구역(/Users/)에 폴더를 생성할 권한이 없음.결과 (빈 껍데기 현상)DB(장부): "파일이 저장되었다"고 데이터는 기록됨 (성공).Storage(창고): 실제 하드디스크에는 파일이 저장되지 않음 (실패).팀원 공유 불가: 내 컴퓨터에 설령 저장되더라도, 다른 팀원의 컴퓨터에는 해당 파일이 없으므로 다운로드가 불가능함.2. 해결책의 진화: 로컬에서 클라우드로이 문제를 해결하려면 "누구의 컴퓨터도 아닌, 모두가 접..
1. Flyway 장애 원인 요약 (Post-Mortem)문제: 공용 DB(public)의 장부에는 20260210102236 기록이 있는데, 내 로컬 폴더(가방)에는 해당 파일이 없음.결과: Flyway가 "파일 유실"로 판단하여 서버 구동을 차단(500 에러).교훈: 여러 서버가 하나의 DB를 쓸 때는 방어적 쿼리가 필수이며, 서버별로 이력 테이블을 분리하는 것이 안전함.2. 유형별 방어적 마이그레이션 쿼리 (Best Practices)① 테이블 생성 (Create Table)테이블이 이미 존재할 경우 에러가 나는 것을 방지합니다.-- IF NOT EXISTS 하나로 해결됩니다.CREATE TABLE IF NOT EXISTS public.tb_por_board_custom_fields ( field_..
1. FeignClient란 무엇인가?왜 사용하는가? (The Why)원래 Java에서 외부 서버에 데이터를 요청하려면 RestTemplate이나 WebClient를 써서 복잡한 코드를 짜야 했습니다.주소 조립하고, 헤더 넣고, 예외 처리하고... 코드가 너무 길어집니다.FeignClient는 이 모든 과정을 생략하고 "인터페이스만 선언하면 알아서 구현체를 만들어주는" 도구입니다. 마치 Mybatis나 JPA 쓰듯이 메서드 호출만으로 외부 API를 쓸 수 있게 해줍니다.언제 사용하는가? (The When)MSA(마이크로서비스) 구조에서 서버 A가 서버 B의 데이터가 필요할 때.AI 에이전트처럼 Spring이 메인 로직을 담당하고, 실제 계산이나 AI 추론은 Python 서버가 담당할 때.외부 공공 API..
