Spring 24

Java Spring 프로젝트에서 시간(Timezone)을 UTC로 통일

백엔드 시스템에서 시간(Time)은 생각보다 훨씬 까다로운 주제이다.특히 다음과 같은 상황에서는 문제가 자주 발생한다.서버는 한국(KST)인데, 사용자는 해외에 있음DB에 저장된 시간이 환경마다 다르게 보임로컬에서는 정상인데, 운영 서버에서 시간이 9시간 어긋남로그, 배치, 만료 시간 계산이 뒤틀림“모든 내부 시간은 UTC로 저장하고, 보여줄 때만 변환한다.” 1. 왜 UTC로 통일해야 하는가?로컬 타임존(KST 등)으로 저장할 때 문제점서버 위치가 바뀌면 시간 기준이 달라진다컨테이너(Docker), 클라우드 환경에서 TZ 설정 누락 시 오동작여러 국가 사용자 서비스 시 시간 계산이 복잡해진다서머타임(DST) 문제 발생 가능UTC로 저장하면 얻는 장점서버 위치와 무관한 일관성DB, 로그, 배치, 캐시 ..

카테고리 없음 2026.01.02

CompletableFuture + Spring @Async

Spring에서 비동기 처리를 가장 실무적으로 사용하는 방법Spring에서 비동기 처리를 가장 간단하게 도입하는 방법은@Async + CompletableFuture 조합이다. 1. @Async란 무엇인가@Async는 Spring이 제공하는 비동기 실행 애너테이션이다.메서드를 별도 스레드에서 실행하도록 만들어준다.@Asyncpublic CompletableFuture asyncMethod() { return CompletableFuture.completedFuture("result");} 2. 기본 동작 구조@Async가 붙은 메서드는Spring이 내부적으로 TaskExecutor(ThreadPool) 에 작업을 위임호출자는 즉시 반환결과는 CompletableFuture로 받는다Spring이 스..

IT/Spring 2026.01.02

CompletableFuture vs WebFlux

Java 비동기 처리, 무엇을 선택해야 하지?Java에서 비동기 처리를 고민하다 보면 마주치는 두 가지 선택지가 있다.바로 CompletableFuture와 Spring WebFlux이다.두 기술 모두 “비동기 처리”를 지원하지만, 문제 해결 방식과 철학은 다르다. 1. CompletableFuture란 무엇인가CompletableFuture는 미래에 완료될 결과를 표현하는 비동기 추상화이다.기존의 동기 코드 스타일을 최대한 유지하면서, 비동기 처리를 “추가”하는 방식이다.기존 Servlet / MVC 구조 그대로 사용 가능Thread 기반 비동기 처리명시적인 스레드 풀(ExecutorService) 사용imperative(명령형) 코드 스타일 유지현재 구조를 유지하면서 비동기를 도입하고 싶을 때 적합하..

IT/JAVA 2026.01.02

H2 인메모리 DB의 동작 원리

Spring Boot 프로젝트를 실행하고, POST로 데이터를 전송한 후 GET으로 조회해 보니, 방금 저장한 데이터가 잘 나온다.application.properties에 DB 연결 정보가 없음MySQL이나 PostgreSQL 같은 데이터베이스를 설치하지도 않음이게 가능한 이유는 Spring Boot의 기본 동작 때문이다. Spring Boot의 기본 동작 — 자동 H2 인메모리 DB Spring Boot에서 JPA(JpaRepository)를 사용하지만 DB 설정이 없는 경우,자동으로 인메모리 H2 데이터베이스를 사용한다.인메모리 DB란?디스크가 아닌 메모리(RAM)에 데이터가 저장되는 데이터베이스로,애플리케이션이 종료되면 모든 데이터가 사라진다. Spring Boot는 다음 조건에서 H2를 자동..

IT/Spring 2025.08.12

Spring Data JPA 페이지네이션(Pagination) 처리

웹 애플리케이션에서 데이터를 조회할 때, 수만 건 이상의 데이터를 한 번에 내려받는 것은 매우 비효율적이다.이런 경우에 사용하는 대표적인 기법이 바로 페이지네이션(Pagination)이다.페이지네이션이란? 페이지네이션은 대량의 데이터를 페이지 단위로 나누어 사용자에게 제공하는 방식이다.예를 들어, 데이터베이스에 10,000건의 로그가 있을 때, 이를 한 번에 모두 내려받기보다 20개씩 나눠서 보여주는 방식이다.이를 통해 메모리 사용을 줄이고, 사용자 경험을 개선하며, 네트워크 비용도 줄일 수 있다.Spring Data JPA에서 페이지네이션 구성 요소Spring Data JPA는 페이지네이션을 위해 여러 유틸리티를 기본 제공한다. 대표적으로 아래 3가지가 있다. 1. Pageable 인터페이스페이지 요청..

IT/Spring 2025.07.30

JPA에서 deleteAll() vs deleteAllInBatch()의 차이와 주의할 점

Spring Data JPA를 사용하다 보면 전체 데이터를 삭제해야 할 때 deleteAll()과 deleteAllInBatch() 두 가지 메서드 중 무엇을 써야 할지 고민하게 된다두 메서드는 이름만 보면 비슷해 보이지만, 동작 방식, 성능, 주의사항 모두 다르기 때문에 잘 구분해서 사용해야 한다 1️⃣ deleteAll() — 하나씩 순회하며 삭제userRepository.deleteAll();내부적으로는 findAll()로 모든 데이터를 조회한 뒤,for 루프로 한 건씩 EntityManager.remove() 호출즉, n개의 delete 쿼리가 실행된다✅ 특징JPA가 영속성 컨텍스트를 유지한 채 개별 엔티티를 추적엔티티 리스너, 연관된 Cascade, orphanRemoval 등 모두 동작❗ 단점..

IT/Spring 2025.07.19

스프링 어노테이션

@Transactional@Transactionalpublic void createUser(User user) { userRepository.save(user); emailService.sendWelcomeEmail(user);}해당 범위 내의 DB 작업을 하나의 트랜잭션으로 묶어 처리한다.모두 성공하면 커밋, 하나라도 실패하면 모두 롤백한다.적용 위치에 따라 다르게 작동한다:클래스에 선언 → 해당 클래스의 모든 public 메서드에 적용메서드에 선언 → 해당 메서드에만 적용주의: private, protected, default 접근자 메서드에는 적용되지 않다.옵션:@Transactional(rollbackFor = Exception.class) @Valid@PostMapping("/user..

IT/Spring 2025.07.15

RestTemplate WebClient RestClient

Spring Framework에서 HTTP 요청을 처리하기 위해 사용할 수 있는 주요 클라이언트는 RestTemplate, WebClient, 그리고 RestClient 이다.1. RestTemplate- 동기식 HTTP 클라이언트: 요청을 보내고 응답을 받을 때까지 블로킹된다- 간단하고 직관적인 API: 사용하기 쉽고, 간단한 HTTP 요청을 처리하는 데 적합하다. - Spring 5.0 이후로는 더 이상 새로운 기능이 추가되지 않음: 유지보수는 계속되지만, 새로운 기능은 추가되지 않는다. - 기존 코드와의 호환성: 많은 기존 프로젝트에서 사용되고 있으며, 기존 코드와의 호환성이 중요할 때 유용하다- Spring 5.0 이후로는 더 이상 새로운 기능이 추가되지 않으며, WebClient로 대체될 예정이..

IT/Spring 2025.01.23

React 프로젝트 Spring으로 가져오기

✅ DashboardController.java 만들기  ✅ proxy 변경✅ "proxy": "http://localhost:8080"  ➡️  "homepage": "/dashboard"  ✅ yarn start 후 페이지 뜨는 것 확인 후 ✅yarn build✅ build 후 index.html 이름 변경   dashboard.html  (컨트롤러 맵핑 주소 맞춤)✅ Spring 프로젝트의 📁templates 폴더 안에 dashboard.html   복붙 ✅  📁 resources > static > dashboard 폴더 만들기✅ dashboard 폴더 안에 yarn build 후 생성된 파일 중 html 파일 제외하고 모두 복사✅ spring 재가동  끝 !

IT/Spring 2024.12.31

Swagger

https://swagger.io/ API Documentation & Design Tools for Teams | SwaggerSwagger and OpenAPI go hand‑in‑hand. Swagger offers powerful and easy to use tools to take full advantage of the OpenAPI Specification. See how we do itswagger.io Spring Boot 프로젝트에서 Swagger-UI를 통해 개발한 Rest API 들의 목록을 확인하고 테스트 할 수있다. Swagger- 개발한 Rest API를 문서화 한다. - API 호출을 통한 테스트를 가능하게 한다. => api 단위테스트, 명세서 다 가능하다 build.grad..

IT/Spring 2024.12.24

Mapper Error (@ResultMap)

[ERROR] 24-12-04 15:07:02 [PaymentServiceImpl:169] - 결제완료 데이터 조회에 실패했습니다. org.apache.ibatis.binding.BindingException: Mapper method 'kr.co.sonystore.mappers.PaymentMapper.selectCountPayComplete' attempted to return null from a method with a primitive return type (int). /**     * 결제완료된 데이터를 조회한다     * @param input - 조회할 결제내역 정보에 대한 모델 객체     * @return 조회된 데이터 수     */    @Select(        "SELECT C..

IT/Spring 2024.12.04

@ResponseBody

@ResponseBody 애노테이션은 Spring MVC에서 컨트롤러 메서드가 반환하는 값을 HTTP 응답 본문으로 직접 변환하여 클라이언트에게 전송할 때 사용한다 주로 RESTful 웹 서비스에서 JSON 또는 XML 형식의 데이터를 반환할 때 사용된다@ResponseBody를 사용하면, 반환된 객체가 JSON 또는 XML 형식으로 변환되어 HTTP 응답 본문에 포함된다.  @RestController 애노테이션은 @Controller와 @ResponseBody를 결합한 것이다따라서 @RestController를 사용하면 메서드에 @ResponseBody를 명시적으로 추가하지 않아도 된다

IT/Spring 2024.12.03

Spring MVC 다중삭제

cart.html.. 선택 삭제 ...   ()   axios.delete 요청에서 배열을 쿼리 매개변수로 전달할 때, Spring MVC에서 이를 올바르게 처리하기 위해서는 배열의 각 요소를 개별적으로 쿼리 매개변수로 전달해야 한다이를 위해 paramsSerializer를 사용하여 쿼리 매개변수를 올바르게 직렬화 할 수 있다/* = = = = = 다중 상품 삭제 = = = = = */document.querySelector('.button_del_checked_ite..

IT/Spring 2024.11.27

Thymeleaf

Thymeleaf 템플릿 엔진을 사용하여 숫자를 형식화하고 HTML 요소에 값을 삽입하는 구문이 구문은 cart.price 값을 천 단위 구분 기호(쉼표)를 사용하여 형식화하고,그 값을 요소의 텍스트로 설정한다 Thymeleaf 표현식#numbers는 Thymeleaf의 유틸리티 객체로, 숫자 형식화를 위한 메서드를 제공한다formatInteger 메서드는 정수를 형식화한다첫 번째 인수: 형식화할 숫자 값 (cart.price). 두 번째 인수: 최소 자릿수 (1). 세 번째 인수: 천 단위 구분 기호 ('COMMA').

IT/Spring 2024.11.26

Spring 파일 업로드 경로 맵핑

application.properties 와 MyWebConfig.java  설정 설명  application.properties # 업로드 된 파일이 저장될 폴더 경로 ("/"로 끝나면 안됨)# => 이 경로가 프로젝트 폴더 안에 존재하면 안됨# [mac, linux 용]# upload.dir=/Users/hyeon/upload# [widows 용] => 드라이브 문자열 앞에 "/" 적용 필요upload.dir=/C:/HYEON/upload# 업로드 된 파일이 노출될 URL 경로 ("/" 로 끝나면 안됨)# => "http://localhost:8080/files" 를 의미# => "http://localhost:8080/files" 가 "upload.dir"에 명시한 폴더를 의미upload.url=/..

IT/Spring 2024.11.21

File Upload

코드 분석회원관리 - 회원가입부분  파일업로드 🫛 RestController 🫛 업로드 받기  UploadItem uploadItem = null;uploadItem = fileHelper.saveMultipartFile(photo);  >>> FileHelper 🗂️ 🗂️ 파일의 원본 이름 추출String originName = multipartFile.getOriginalFilename();ex)  originName = imgname.png 🗂️ 업로드 된 파일이 저장될 폴더의 이름을 "년/월/일" 형식으로 생성  Calendar c = Calendar.getInstance();String targetDir = String.format("%s/%04d/%02d/%02d", uploadDir..

IT/Spring 2024.11.21

Interceptor

핸들러 인터셉터  Handler Interceptor - 웹 브라우저가 보내는 컨트롤러의 실행 요청을 중간에 가로채서 어떠한 일을 수행하게 하는 기능 - 모든 웹 페이지가 공통적으로 동일하게 실행해야 하는 기능들을 구현할 수 있다 - 컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채는 역할- 웹 어플리케이션 내에서 특정한 URL 호출을 가로채는 역할- 요청과 응답을 가로채서 원하는 동작을 추가하는 역할 - 요청을 받아들이기 전, 세션에서 로그인 한 사용자가 있는지 보고 없다면 로그인 페이지로 redirect 시킬 수 있다- 주기적으로 결과 페이지에 등장하는 데이터들을 인터셉터에서 응답을 가로채 데이터를 추가한 다음 보낼 수 있다 - 클라이언트의 요청이 컨..

IT/Spring 2024.10.23

Spring 프로젝트 구성

패키지 정보패키지 이름 (com.hyeon.cookie)GroupId  :  com.hyeonArtifactId  :  cookie의존성 설정프로젝트 생성 과정에서 dependencies 항목에 대해 아래의 항목을 선택Spring Boot DevTools Spring Boot Acturator Ops Spring WebThymeleaf Template EnginesLombok(Java Mail Sender)추가 설정logback 설정파일 추가/src/main/resources/logback-spring.xml 파일 추가프로젝트명 변경라이브러리 설정필요한 라이브러리 추가UserAgent 라이브러리 추가MyWebConfig.java,  application.properties 파일 추가 및 설정패키지 추가 ..

IT/Spring 2024.10.16
반응형