java 40

[Spring Boot] 5. mock 테스트 코드 작성

1. 테스트 계층별 요약표각 계층은 서로 다른 목적을 가지고 있으며, 사용하는 도구도 다릅니다.계층 테스트 종류 주요 어노테이션 핵심 목적Controller슬라이스 테스트@WebMvcTestAPI 경로, 리다이렉트, 뷰 이름, 입력값 검증Service단위 테스트@ExtendWith비즈니스 로직, 예외 발생 조건 검증Repository통합 테스트@MyBatisTestSQL 문법, DB 테이블 구조 일치 여부 확인2. 계층별 실제 테스트 코드 및 상세 설명① Controller 테스트: "사용자를 어디로 보낼 것인가?"서버 전체를 띄우지 않고 HTTP 요청과 응답만 가짜로 시뮬레이션합니다.@ActiveProfiles("test") // test 설정 적용@WebMvcTest(AuthController.cla..

SPRING BOOT 2026.03.03

[Spring Boot] 3. 로컬 파일 업로드 권한 문제 → supabase

1. 발단: 로컬 환경의 한계와 권한 에러상황Spring Boot 서버에서 userUpload/DOC 경로에 파일을 저장하려 시도.에러 발생: java.nio.file.AccessDeniedException: /Users/userUpload원인: 서버 프로세스가 Mac/Linux의 루트 권한 구역(/Users/)에 폴더를 생성할 권한이 없음.결과 (빈 껍데기 현상)DB(장부): "파일이 저장되었다"고 데이터는 기록됨 (성공).Storage(창고): 실제 하드디스크에는 파일이 저장되지 않음 (실패).팀원 공유 불가: 내 컴퓨터에 설령 저장되더라도, 다른 팀원의 컴퓨터에는 해당 파일이 없으므로 다운로드가 불가능함.2. 해결책의 진화: 로컬에서 클라우드로이 문제를 해결하려면 "누구의 컴퓨터도 아닌, 모두가 접..

SPRING BOOT 2026.03.03

[Spring Boot] 2. Flyway 마이그래이션 규칙

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_..

SPRING BOOT 2026.03.03

[Spring Boot] 1. Spring Boot의 FeignClient 설정(python 포함)

1. FeignClient란 무엇인가?왜 사용하는가? (The Why)원래 Java에서 외부 서버에 데이터를 요청하려면 RestTemplate이나 WebClient를 써서 복잡한 코드를 짜야 했습니다.주소 조립하고, 헤더 넣고, 예외 처리하고... 코드가 너무 길어집니다.FeignClient는 이 모든 과정을 생략하고 "인터페이스만 선언하면 알아서 구현체를 만들어주는" 도구입니다. 마치 Mybatis나 JPA 쓰듯이 메서드 호출만으로 외부 API를 쓸 수 있게 해줍니다.언제 사용하는가? (The When)MSA(마이크로서비스) 구조에서 서버 A가 서버 B의 데이터가 필요할 때.AI 에이전트처럼 Spring이 메인 로직을 담당하고, 실제 계산이나 AI 추론은 Python 서버가 담당할 때.외부 공공 API..

SPRING BOOT 2026.03.03

[Spring Boot] Websocket + STOMP를 이용한 세션 기반 채팅

1. 전체 아키텍처Spring Boot채팅 시스템은 RESTful API와 WebSocket API를 조합한 하이브리드 아키텍처를 채택REST API는 채팅방 생성, 목록 조회, 이전 대화 내역 로딩과 같은 상태 관리를 담당WebSocket과 STOMP 프로토콜은 사용자들이 실시간으로 메시지를 주고받는 통신 채널의 역할을 수행2. WebSocket + STOMP 설정- 모든 실시간 통신의 기반이 되는 설정은 WebSocketConfig.java 파일에서 정의- 이 설정은 STOMP 메시지 프로토콜을 사용하여 WebSocket 통신을 구조화STOMP 엔드포인트: - /ws-stomp는 클라이언트가 최초로 WebSocket 연결을 맺는 진입점- SockJS 지원을 통해 브라우저 호환성을 확보메시지 브로커: ..

JAVA 2025.09.23

[SpingBoot] Api 호출시 Redis를 활용한 캐시 저장

백엔드에서는 controller에서 Api를 호출하면, service에서 이를 처리해서 반환함.자주 호출하는 Api의 경우, 결과를 미리 다른 곳에 저장해 놓으면, 이 후에 같은 Api를 호출했을 때, 데이터베이스를 조회하지 않고 저장소에서 가져다 쓰면 되지 않을까??이는 Redis를 사용하여 key와 value의 형식으로 값을 저장해 놓음으로서 가능만약, 동아리 목록을 호출하는 Api가 있다면 Redis를 사용하여 데이터베이스 조회 수를 줄일 수 있음.(Cacheable)하지만, 동아리가 삭제가 되거나, 추가될 경우에 기존에 Redis에 저장된 정보가 최신의 정보를 반영하지 못하므로 삭제가 필요( CacheEvict ) 1. Redis 캐시 설정캐시를 설정하기 위해 CacheConfig 클래스를 생성하..

JAVA 2025.04.04

[프로그래머스] 가장 많이 받은 선물(2024 KAKAO WINTER INTERNSHIP)

문제 요약친구들이 주고받은 선물 기록을 바탕으로, 다음 달에 가장 많은 선물을 받을 친구가 몇 개를 받을지 예측하는 문제 선물 주고 받는 규칙두 사람이 선물을 주고받은 적이 있다면더 많은 선물을 줬던 사람이 다음 달에 하나 받음.선물을 주고받은 적이 없거나 동일한 개수로 주고받았다면**선물 지수(준 선물 - 받은 선물)**가 더 큰 사람이 작은 사람에게 하나 받음.선물 지수도 같다면선물을 주고받지 않음.입출력 예시friends: 친구들의 목록gifts: "A B" 형식의 선물 기록 (A가 B에게 선물 줌)result: 다음 달 가장 많은 선물을 받는 친구가 받을 선물 개수friends 목록주고받은 선물 기록 (gifts)결과["muzi", "ryan", "frodo", "neo"]["muzi frodo"..

JAVA 2025.03.07

[Spring Boot] 빈(Bean)이란? Autowired 란?

1. 빈(Bean)이란? 빈(Bean)은 스프링 프레임워크에서 관리하는 객체(인스턴스)!!스프링 컨테이너(Spring Container)가 생성하고, 필요한 곳에서 사용할 수 있도록 관리함.💡 즉, "스프링이 직접 관리하는 객체이다.빈 없이 객체를 생성하는 경우public class UserService { private UserRepository userRepository = new UserRepository(); // 직접 생성 public void processUser() { userRepository.save(new User("홍길동")); }}  단점 빈을 사용하지 않으면 객체를 new를 사용해서 위와 같이 직접 생성해야함.UserRepository의 구현이 바뀌면..

JAVA 2025.03.07

[Java] Set, Map, ArrayList, 2D Array

1. set (중복을 허용하지 않는 집합)중복을 허용하지 않으며, 순서가 중요하지 않은 데이터를 저장종류정렬중복 허용순서 유지특징HashSetXXX가장 빠름LinkedHashSetXXO입력 순서를 유지TreeSet오름차순 자동 정렬XX자동정렬import java.util.*;public class SetExample { public static void main(String[] args) { // 1️⃣ HashSet (중복X, 순서X) Set hashSet = new HashSet(); hashSet.add("Apple"); hashSet.add("Banana"); hashSet.add("Cherry"); hashSet.a..

JAVA 2025.03.05

[React / Spring Boot] 프론트엔드, 백엔드 프로젝트 구조

세션 기반의 로그인 프로젝트를 만들기 위한 프론트엔드, 백엔드의 구조를 정리해보았다.  1. 프론트엔드 /src ├── api # API 요청 관련 코드 │ ├── authApi.js # 로그인 및 로그아웃 API 요청 │ ├── userApi.js # 사용자 정보 조회 API 요청 │ ├── components # 공통 UI 컴포넌트 │ ├── InputField.js # 입력 필드 컴포넌트 │ ├── context # 전역 상태 관리 │ ├── AuthContext.js # 로그인 상태 관리 │ ├── pages # 주요 페이지 │ ├── LoginPage.js # 로그인 ..

카테고리 없음 2025.02.20