[MVC-6] CSR 환경에서 @RequestBody만 쓸까? (feat. 파일 업로드와 @ModelAttribute)
·
Spring/MVC
0. 궁금증지난 [MVC-5] 포스팅에서는 스프링 MVC의 기본 기능과 애노테이션 기반 컨트롤러에 대해 알아보았다. 요즘은 React나 Vue.js 같은 프레임워크를 사용하는 CSR(Client-Side Rendering) 환경이 대세다. 이런 환경에서는 프론트엔드와 백엔드가 JSON 데이터로 통신하는 것이 표준(Standard)처럼 자리 잡았다.JSON 데이터 전송 → @RequestBody 사용그렇다면, 과거 JSP나 타임리프 시절에 폼(Form) 데이터를 받던 @ModelAttribute는 이제 CSR 환경에서 쓸모가 없을까? 결론부터 말하면 "아니오"다. JSON만으로는 해결하기 어려운 상황들이 분명 존재하기 때문이다. 이번 글에서는 CSR 환경에서도 @ModelAttribute가 필수적인 상황(..
[Basic-3] 실전 비즈니스 메트릭: 마이크로미터 고급 활용과 운영 모니터링
·
Spring/Monitoring
1. 비즈니스 메트릭의 진정한 가치: 숫자 너머의 인사이트 기초편에서 우리는 CPU, 메모리, HTTP 요청 같은 기술 메트릭을 다뤘다. 이제 한 걸음 더 나아가, "우리 비즈니스는 잘 돌아가고 있는가?"라는 질문에 답할 수 있는 비즈니스 메트릭을 설계하고 구현해보자.1.1. 기술 메트릭의 한계와 비즈니스 메트릭의 필요성기술 메트릭만으로 놓치는 것들:# 기술 메트릭은 정상이지만...✅ CPU 사용률: 45% (정상)✅ 메모리 사용률: 60% (정상)✅ HTTP 에러율: 0.5% (정상)✅ 평균 응답 시간: 120ms (정상)# 비즈니스 문제는 발생 중...❌ 주문 취소율: 40% → (평소 5% 대비 8배 증가)❌ 결제 실패율: 25% → (평소 2% 대비 12.5배 증가)❌ 재고 소진률: 90% → (..
[Basic-2] 마이크로미터, 프로메테우스, 그라파나: 운영 모니터링의 기초 이해
·
Spring/Monitoring
1. 왜 모니터링이 필요한가: 운영자의 눈과 귀 서버가 24시간 안정적으로 동작하는 것은 개발의 끝이 아닌 운영의 시작이다. 애플리케이션이 배포된 후 개발자에게 남은 가장 중요한 임무는 "서버가 잘 돌아가고 있는지 확인하는 것"이다. 하지만 서버실에 가서 모니터를 직접 보거나 매번 로그인해서 확인할 수는 없는 노릇이다.모니터링의 핵심 질문들:지금 서버는 살아 있는가? (헬스 체크)사용자 요청은 얼마나 들어오는가? (트래픽 측정)응답 속도는 정상적인가? (성능 모니터링)메모리나 CPU는 여유가 있는가? (리소스 관리)갑자기 에러가 늘어나진 않았는가? (장애 감지) 이러한 질문에 답하기 위해 필요한 것이 바로 메트릭(Metrics)이다. 메트릭은 시스템의 상태를 수치화한 데이터로, 시간의 흐름에 따라 변화하..
[Basic-1] 스프링 부트 액츄에이터(Actuator) 완벽 가이드
·
Spring/Monitoring
1. 프로덕션 준비 기능과 액츄에이터 이해1.1. 운영을 위한 필수 장비: 자가 진단 기능서비스를 개발하는 것은 차를 제작하는 것과 유사하다. 차를 완성했다고 끝이 아니다 - 실제 도로에서 안전하게 운행하려면 연료 잔량, 엔진 온도, 타이어 압력 등을 확인할 수 있는 계기판이 반드시 필요하다. 마찬가지로 애플리케이션도 배포 후 운영 환경에서 정상 동작하는지 실시간으로 확인할 수 있는 자가 진단 기능이 필수적이다. 스프링 부트 액츄에이터는 바로 이 자가 진단 기능을 제공하는 도구로, 운영 중인 서비스의 핵심 상태를 언제든지 확인할 수 있는 '계기판' 역할을 한다.1.2. 액츄에이터: 상태 확인 + 실시간 제어액츄에이터는 단순히 상태를 보여주는 것을 넘어, 서비스를 제어할 수도 있다. 예를 들어, 서버를 재..
[Advanced-4] QueryDSL(3): 실무 활용 패턴
·
Spring/JPA
1. 순수 JPA와 QueryDSL 통합1.1. 순수 JPA 리포지토리 QueryDSL 통합순수 JPA 리포지토리에 QueryDSL을 통합하는 방식은 다음과 같다.package study.querydsl.repository;import com.querydsl.jpa.impl.JPAQueryFactory;import org.springframework.stereotype.Repository;import study.querydsl.entity.Member;import javax.persistence.EntityManager;import java.util.List;import java.util.Optional;import static study.querydsl.entity.QMember.member;@Repo..
[Advanced-3] QueryDSL(2): 문법
·
Spring/JPA
1. 시작 - JPQL vs QueryDSL1.1. QueryDSL 설정 - Bean 등록 (⭐⭐)실무에서는 JPAQueryFactory를 매번 수동으로 생성하지 않고, 스프링 컨테이너에 빈으로 등록하여 필요한 곳에서 주입받아 사용한다. 이는 코드의 중복을 줄이고 일관된 설정을 유지하게 한다.@Configurationpublic class QuerydslConfig { @PersistenceContext private EntityManager em; /** * JPAQueryFactory를 빈으로 등록한다. * 이를 통해 Repository나 Service에서 @RequiredArgsConstructor 등으로 주입받아 사용할 수 있다. */ @Bean p..
[Advanced-2] QueryDSL(1): 기본
·
Spring/JPA
1. 프로젝트 생성 및 의존성 설정 (build.gradle)QueryDSL은 Java에서 타입 안전한 SQL 쿼리를 작성하게 해주는 프레임워크이다. 특히 Spring Boot 3.x 환경에서는 javax가 jakarta로 변경됨에 따라 관련 설정에 유의해야 한다.1.1. 프로젝트 기본 환경Java: 17 이상Spring Boot: 3.2.0 이상Build Tool: Gradle - Groovy주요 의존성: Spring Data JPA, H2 Database, Lombok, QueryDSL (Jakarta 대응 버전)1.2. build.gradle 핵심 설정dependencies { implementation 'org.springframework.boot:spring-boot-starter-data..
[Advanced-1] Spring Data Jpa
·
Spring/JPA
1. 예제 도메인 모델1.1. 엔티티 설계Member 엔티티package study.datajpa.entity;import jakarta.persistence.*;import lombok.*;@Entity@Getter @Setter@NoArgsConstructor(access = AccessLevel.PROTECTED)@ToString(of = {"id", "username", "age"})public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne(fetch = FetchType.LA..