IT/Spring 22

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 Boot에서 @Valid와 @ExceptionHandler로 유효성 검사 에러 처리

웹 애플리케이션에서 클라이언트로부터 데이터를 받을 때, 값이 유효하지 않다면 서비스 로직이 실행되기 전에 차단하는 것이 안전하다.Spring Boot에서는 @Valid 또는 @Validated 어노테이션을 활용해 손쉽게 입력값 검증을 수행할 수 있다.하지만 유효성 검증에서 실패하면 MethodArgumentNotValidException 같은 예외가 발생하고, 기본적으로는 깔끔한 JSON 형태로 응답되지 않는다.@Valid 유효성 검사와 @ExceptionHandler를 활용하여 사용자 친화적인 에러 메시지 응답을 구현하는 방법 ⬇️ @Valid와 유효성 검사 어노테이션Spring Boot에서는 DTO 클래스에 다양한 검증 어노테이션을 붙여 입력값을 제한할 수 있다.대표적으로 다음과 같은 어노테이션이 있..

IT/Spring 2025.08.05

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

HikariCP

🔍 HikariCP란?HikariCP는 경량의 고성능 JDBC 커넥션 풀이다.Spring Boot에서는 기본 커넥션 풀로 HikariCP를 사용하고 있으며, 빠른 속도와 낮은 메모리 사용량으로 잘 알려져 있다.Hikari는 일본어로 "빛"이라는 뜻이며, 그 이름처럼 빠르고 가볍다는 특징을 가진다.Spring Boot 2.x부터는 HikariCP가 기본으로 설정되어 있기 때문에 별도 설정 없이도 바로 사용할 수 있다.🤔 커넥션 풀애플리케이션이 데이터베이스에 접근할 때마다 커넥션을 새로 생성한다면 다음과 같은 문제점이 발생한다.커넥션 생성/종료는 비용이 크고 느리다대량의 요청 처리 시 DB 자원 고갈 가능성이 있다응답 속도 저하, 장애 발생 위험이 있다➡️ 이런 문제를 해결하기 위해 미리 일정량의 커넥션..

IT/Spring 2025.07.12

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

Error

[WARN ] 24-11-26 20:36:43 [DefaultHandlerExceptionResolver:247] - Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'cartid' for method parameter type int is not present] RestController에서 cartid 요청 파라미터가 누락되었다@RequestParam 어노테이션을 사용하여 cartid 파라미터를 받아야 하는데, 해당 파라미터가 요청에 포함되지 않았기 때문에 발생한 에러이다 문제 원인 요청 파라미터 누락 => 클라이언트에서 서버로 요청을 보낼 때 cartid 파..

IT/Spring 2024.11.26

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
반응형