Backend 65

JUnit 단위 테스트 적용, JaCoCo 커버리지 측정

📌 목차JUnit이란?JUnit 적용 방법JUnit 적용 예시DB 연동 단위 테스트 방법테스트 실행테스트 커버리지란?테스트 커버리지 측정 방법 - JaCoCo한글 경로 문제 해결 방법테스트 결과 확인 🎯 0.JUnit 단위 테스트 적용하기기존 테스트 코드를 작성하지 않고 직접 프로그램을 로컬에서 실행해서 테스트하고 있었다. => 코드 변경 시 마다 기능을 재테스트 하는데 시간이 소요되고, 테스터가 놓치는 부분이 있을 수 있음.이를 개선하기 위해 JUnit 기본 사용법을 알아보고 ‘일정 시스템’에 적용해보기로 했다!! 📌 1. JUnit이란?Java에서 가장 많이 쓰이는 단위 테스트 프레임워크역할: 테스트 작성 → 자동 실행 → 결과 확인Spring Boot에서는 spring-boot-starter-..

Backend/JAVA 2025.08.27

Stream API란? (for-loop와 비교)

📌 1. Stream API란?Stream API는 Java 8에서 도입된 기능으로, 컬렉션(List, Set 등)이나 배열의 데이터를 함수형 스타일로 처리할 수 있는 API. 간결하고 직관적인 코드를 작성할 수 있으며, 반복문보다 가독성이 좋고 병렬 처리도 지원한다. 📌 2. Stream의 특징원본 데이터를 변경하지 않음 (불변성 유지)중간 연산(Intermediate)과 최종 연산(Terminal)으로 나뉨병렬 처리(parallelStream()) 가능 📌 3. Stream API 기본 동작 흐름Stream API는 "데이터 생성 → 중간 연산 → 최종 연산" 의 구조로 작동해!Stream 생성 → 중간 연산(필터링, 변환 등) → 최종 연산(리스트로 변환, 출력 등) 📖 예제: 숫자 리스..

Backend/JAVA 2025.08.09

로컬에서 Secure Cookie 테스트: Https 설정

Secure Cookie가 동작하는지 테스트가 필요한데 그러기 위해서 https 설정부터하는 과정이다!!통신하는 서버 2개 다 https설정 해야한다.📌 1. OpenSSL을 이용한 인증서 및 키 생성 과정 # 1. 개인키 생성genrsa -out my_private.key 2048# 2. CSR 생성 (← 여기서 config 지정!)req -new -key my_private.key -out my_cert.csr -config "C:\Users\dddzr\Documents\Tools\openssl-0.9.8k_X64\openssl.cnf" 🔹 경로 생략 시 기본 경로에서 찾는다: Unable to load config info from c:openssl/ssl/openssl.cnf * req 명령..

[Spring, JSP] session 생성 차단

jwt 방식 로그인을 사용하기 때문에 세션을 생성하지 않도록 Spring Security 에서 아래와 같이 설정했다.근데도 JSESSIONID가 생기고 있었다. 나는 jsp를 사용하는게 문제였다!!📌 1. 목적: 완전한 무상태(Stateless) 서버 만들기Spring Security에서 SessionCreationPolicy.STATELESS를 설정JWT 기반 인증이나 토큰 기반 인증을 쓸 때는 세션이 필요 없으므로, JSESSIONID 쿠키도 없어야 정상.http .cors(Customizer.withDefaults()) .csrf(csrf -> csrf.disable()) .sessionManagement(session -> session .sessionCreation..

Spring(boot X) 정적 리소스 처리 흐름

📌 1. 필수 설정정적 리소스를 사용하려면 반드시 설정해야 할 파일✅ 1-1. web.xml 설정 (DispatcherServlet 매핑) appServlet org.springframework.web.servlet.DispatcherServlet 1 appServlet / 이 설정으로 인해 /thumb-images/** 같은 정적 요청도 DispatcherServlet을 거치게 됨 ✅ 1-2. servlet-context.xml (또는 dispatcher-servlet.xml) 설정 -->file: 접두사는 절대경로 기반을 의미classpath:는 WAR 내부 리소스를 가리킴 (자주 쓰는 /static/, /public/ 등 포함)📌 2. 환경별 경로 차이 설정환경설정 예..

Spring boot 예외 처리: @ControllerAdvice, @ExceptionHandler, ResponseStatusException

기존에 controller에서 예외 catch해서 직접 처리하는 방식을 자주 사용했었다.@GetMapping("/user/{id}")public ResponseEntity getUser(@PathVariable Long id) { try { User user = userService.findById(id); return ResponseEntity.ok(new ApiResponse("SUCCESS", "조회 성공", user)); } catch (UserNotFoundException e) { return ResponseEntity.status(HttpStatus.NOT_FOUND) .body(new ApiResponse("FAIL..

ICal을 이용한 외부 캘린더 연동

ICal 방식을 사용하여 외부 캘린더를 구독하고자 했는데 java 라이브러리인 ical4j가 버전에 따라 달라진게 많은 것 같아서 4.x 기준으로 기록을 남긴다!! 🔍 1. ICal 이란?iCal 또는 iCalendar는 전자 일정 정보를 교환하기 위한 표준 포맷.텍스트 기반 포맷 (.ics 파일)으로 여러 캘린더 기능을 제공하는 서비스에서 제공함. 대신 이 방식으로 연동하면 조회만 가능하다!!그리고 텍스트 파일이라 데이터 많으면 들고오고 파싱하는게 오래 걸릴 수 있음. 📌2. ICal Url 가져오기Ical Url을 제공하는 타 시스템에서 url 정보를 가져온다.예) 구글 캘린더Public은 공개캘린더인 경우 이용 가능, secret 주소를 복사 한다. 🔍 3. ical4j란?ical4j는 Jav..

Backend/API 2025.07.26

[Google API] 구글 캘린더 연동

캘린더 시스템에서 google 캘린더 연동을 위해 API연동을 했다. 📌1. Google Cloud에 프로젝트 생성https://console.cloud.google.com/ Google 클라우드 플랫폼로그인 Google 클라우드 플랫폼으로 이동accounts.google.com 등록하는 건 캡쳐를 못 했는데ClientID랑 시크릿키를 발급받으면 됩니다! 📌2. 프로젝트 코드 수정2.1. 의존성 추가pom.xml org.springframework.boot spring-boot-starter-oauth2-client com.google.api-client google..

Backend/API 2025.07.26

[Google API] 구글 앱 인증 받기

📌 1. 인증이 필요한 이유 ✅ 1.1. 구글 클라우드에서 제공하는 calendar API를 사용함.Calendar API는 구글에서 “비공개 Google 사용자 데이터에 대한 액세스 권한을 부여하는 민감한 범위” 라고 판단하는 API임. (readonly인 경우에도)Google Calendar를 사용하여 액세스할 수 있는 모든 캘린더 보기, 수정, 공유, 영구 삭제 ✅ 1.2. 사용자 유형을 외부로 설정함.사용자 유형외부: 구글 계정이 있는 모든 사용자 대상내부: 구글 클라우드 조직과 연결된 프로젝트에서 내부 사용자 구성. ✅ 1.3. 민감한 범위 API 사용 + 사용자 유형이 외부인 경우Oauth 동의 화면에서 아래 화면(안전하지 않은 앱으로 이동)을 띄우지 않기 위해서는구글 인증이 필..

Backend/API 2025.07.26

OpenFeign: MSA 서비스 간 통신

📌MSA에서의 HTTP 클라이언트 사용MSA 환경에서는 각 서비스가 독립적으로 동작하며, 서로의 API를 호출해야 한다. 이때 다양한 HTTP 클라이언트를 사용할 수 있으며, 성능과 유지보수를 고려해 적절한 방식을 선택해야 한다. ✅ HTTP 클라이언트는 MSA에서만 사용할까?➡️ 아니다! 일반적인 모놀리식 아키텍처에서도 다른 외부 API 호출을 위해 HTTP 클라이언트를 사용한다.➡️ 하지만 MSA에서는 서비스 간 통신이 필수적이므로, OpenFeign 같은 라이브러리가 특히 많이 사용된다. ✅ 일반적인 API 호출과의 차이점은?➡️ 보통 API 호출은 단순한 HTTP 요청이지만, MSA에서는 더 세밀한 HTTP 클라이언트 설정이 필요하다.서비스 디스커버리(Eureka) 를 이용한 동적 URL 매핑로..