Backend/spring (Boot) 29

Spring Boot DTO ↔ Entity 변환 방법

📌 왜 DTO ↔ Entity 변환이 필요한가?Entity는 DB 모델이고, DTO는 입출력·뷰 모델이기 때문.엔티티를 그대로 노출하면 보안·커플링·유효성 검증·API 스펙 분리 문제가 생기므로,DTO로 변환해서 외부와 내부를 분리하는 것이 Spring 실무 표준이다. 📌 객체 변환 3가지 방법 비교Spring Boot에서 DTO ↔ Entity 변환 시 대표적으로 아래 3가지를 비교할 수 있다. 📍 비교 기준컬렉션(List) 변환연관 관계 필드 변환 (예: User → Address 포함)타입 변환 (예: LocalDateTime → String)방법List 변환연관 관계 필드 변환타입 변환 (예: LocalDateTime → String)BeanUtils.copyProperties()❌ 수동 처..

DTO / VO / DAO / Entity / Model 비교

DTO / VO / DAO / Entity / Model은 모두 Spring에서 데이터와 관련된 객체들로, 각기 다른 역할을 한다. 헷갈리는 개념들을 한 번에 정리해보자! 😎📌🔥1. DTO / VO / DAO / Entity / Model 비교구분역할/목적특징사용하는 층(Layer)변경 가능성예시VO값 객체 (Value Object)불변 객체 (immutable)DTO, Entity와 연동 가능변경 XMoney, Point, AddressDTO데이터 전달 객체 (Data Transfer Object)계층 간 데이터 전달용Controller ↔ Service ↔ DAO변경 OUserDTO, LoginDTODAODB 접근 객체 (Data Access Object)DB 호출/쿼리 수행Repository ..

Redis란? (Spring 연동)

Redis 개념 → 설치 → 사용 → Spring 예제까지 한 번에 정리함.📌 1. Redis란?Redis (REmote DIctionary Server) 는 메모리(In-Memory)에 데이터를 저장하는 Key-Value 저장소다. 빠른 조회를 위한 캐시 + 만료되는 데이터 저장소이다. ✅ Redis의 핵심 특징메모리 기반 → 매우 빠름 (ms 단위)Key-Value 구조TTL(만료시간) 지원캐시 / 세션 / 토큰 / 임시 데이터 관리에 최적⚠️ 캐시는 DB처럼 쓰면 안 됨. 빠른 조회용 보조 저장소.트랜잭션 보장 ❌영속성 한계장애 시 데이터 유실 가능📖 예시KEY: product:123VALUE: { "name": "운동화", "price": 99000 } 📌 2. Redis는 언제 쓰는가?✔ ..

Connection Pool과 Size 선정 기준 (with HikariCP)

🔍 1. 커넥션 풀(Connection Pool)이란?데이터베이스와 연결(Connection)을 미리 만들어 풀(Pool)에 보관해두고, 요청이 들어오면 즉시 꺼내서 사용하고 다시 반납하는 구조. ✅ 장점매번 DB 연결을 새로 만들지 않아도 돼서 속도 빠름DB 커넥션 수를 제한해 과부하 방지 🔍 2. HikariCP란?Spring Boot의 기본 커넥션 풀 구현체.빠르고 가벼운 커넥션 풀로, 성능이 뛰어나서 널리 쓰인다.📌 3. HikariCP 설정✅ 3-0. yaml 예시spring: datasource: hikari: maximum-pool-size: 30 minimum-idle: 30 idle-timeout: 60000 connection-timeo..

[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] (프로젝트 외부) 정적 리소스 처리

📌0. 서블릿 컨테이너 기본 동작 자원이 프로젝트 내부 /resources 또는 /static 밑에 있을 때✅ 0-1. Spring MVC (레거시 설정, xml 기반)DispatcherServlet을 /에 매핑하면 모든 요청이 DispatcherServlet으로 감.정적 리소스도 DispatcherServlet을 거치게 됨 → 그래서 Spring이 ResourceHttpRequestHandler를 통해 다시 정적 리소스 처리를 해줘야 함.✅ 0-2. Spring Boot 동작 원리스프링부트는 자동으로 ResourceHandlerRegistry를 등록해서, 별도 mvc:resources를 안 써도 정적 리소스 핸들러가 붙음.기본 매핑 경로:classpath:/static/classpath:/public..

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

[error] java.lang.IllegalArgumentException: Name for argument of type [int] not specified

🚨 Name for argument of type [int] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag. java.lang.IllegalArgumentException: Name for argument of type [int] not specified Ensure that the compiler uses the '-parameters' flag. This application has no explicit mapping for /error, so you are seeing this as a fallback.Wed Fe..

[error] getOutputStream() has already been called for this response

🚨 Could not write JSON: getOutputStream() has already been called for this response  🔥 오류 원인HttpServletResponse의 getOutputStream() 또는 getWriter()가 여러 번 호출되었을 때 발생하는 문제!즉, 응답을 한 번 보낸 후에 또 응답을 보내려고 할 때 발생한다.  📖 에러 코드 (수정 전) ➡️ 쿠키를 response.addCookie()로 설정한 후, ResponseEntity로 JSON 응답을 반환. ➡️ 하지만 ResponseEntity가 HTTP 응답을 설정하는 과정에서 response.getOutputStream()을 다시 호출하기 때문에 충돌이 발생. @PostMapping("/l..

[JAVA] 쿠키(Cookie) 설정 방법

쿠키 설정 방법에 대해 알아보기전에 쿠키에 대해 간단히 알아보자!!🔍 쿠키(Cookie)란? 쿠키는 웹 브라우저에 저장되는 작은 데이터 조각!!서버가 클라이언트(브라우저)에 정보를 저장하고, 이후 요청에서 다시 전송하도록 도와주는 역할➡️ 쿠키는 웹에서 사용자 상태를 유지하는 중요한 메커니즘! 🍪 🚀 특징세션 유지: 로그인 상태 유지, 장바구니 정보 저장클라이언트 저장: 브라우저에 텍스트 형태로 저장됨자동 전송: 동일한 도메인에 대한 요청마다 자동 포함🎯 쿠키 설정 시 추가할 내용✅ HttpOnly → 자바스크립트에서 접근 불가능하게 해서 보안 강화✅ Secure → HTTPS에서만 쿠키 전송 (HTTPS 환경이라면 꼭 설정!)✅ Path=/ → 모든 경로에서 쿠키 사용 가능✅ Max-Age / ..