스프링 29

캐시 설정

🎬 Spring Boot + Redis로 영화 서비스 만들기 (조회수 캐싱 기능 포함)Spring Boot와 Redis를 활용해 영화 조회수 집계와 캐싱 기능을 구현한 MovieService 코드를 소개합니다. 조회수가 가장 높은 영화 하나를 Redis에 저장해두고, 전체 영화 목록을 가져올 때 가장 먼저 보여주는 구조입니다.✅ 사용 기술Spring BootSpring Data JPARedis (RedisTemplate)Spring Cache (@Cacheable, @CacheEvict)Java 17+📁 MovieService 전체 코드@Service@RequiredArgsConstructor@EnableCachingpublic class MovieService { private final Mo..

스프링 2025.05.19

JPQL로 작성된 findByIdWithUser 를 QueryDSL로 변경합니다.

# Todo 관련 Repository 및 QueryDSL 구현이 문서는 `Todo` 엔티티와 관련된 Spring Data JPA와 QueryDSL을 사용한 커스텀 쿼리 구현을 설명합니다.## 1. `TodoRepositoryQueryDSL` 인터페이스`TodoRepositoryQueryDSL` 인터페이스는 `Todo` 엔티티와 관련된 커스텀 쿼리 메서드를 정의하는 인터페이스입니다. 이 인터페이스는 QueryDSL을 사용한 커스텀 메서드의 표준을 제공하며, 실제 구현은 `TodoRepositoryImpl` 클래스에서 수행됩니다.```javapackage org.example.expert.domain.todo.repository;import org.example.expert.domain.todo.entity..

스프링 2025.05.05

JPA 다대일 연관관계에서 연관관계 편의 메서드를 꼭 분리해야 할까?

🔹 들어가며Spring JPA에서 @ManyToOne, @OneToMany 같은 연관관계를 다룰 때, 단순히 Entity를 설정하는 것보다 더 중요한 건 **"연관관계를 어떻게 유지할 것인가"**입니다.특히 할 일(Todo)을 생성할 때 자동으로 유저(User)를 담당자(Manager)로 등록하는 예처럼, 연관 엔티티를 함께 조작할 일이 많을수록 편의 메서드를 따로 만드는 습관이 중요해집니다.🔹 문제 상황 예시public Todo(String title, String contents, String weather, User user) { this.title = title; this.contents = contents; this.weather = weather; this.user =..

스프링 2025.05.02

KPT 회고

KPT 회고 - 가게 기능 & 인증 처리 경험✅ Keep (잘한 점, 계속할 점)가게 생성, 수정, 조회, 폐업 기능을 명확히 분리하고, 각각에 대해 Entity, DTO, Controller, Service, Repository 계층을 체계적으로 구성함가게 상태에 따른 처리 로직(예: 폐업 여부에 따라 수정 제한 등)을 도입해 실제 운영 환경을 고려한 설계를 함@AuthenticationPrincipal을 사용하여 인증된 사용자 기반으로 가게 기능을 연동함❌ Problem (문제점, 아쉬운 점)@AuthenticationPrincipal로 받아오는 사용자 ID가 String 타입이라, 이를 Long으로 변환하는 과정에서 타입 불일치로 인한 혼란이 발생함인증 객체와 UserEntity 간의 연결 흐름이 ..

스프링 2025.04.29

트러블슈팅 JWT와 @AuthenticationPrincipal의 차이점

# JWT vs @AuthenticationPrincipal## 1. **JWT (JSON Web Token)**### 개념JWT는 사용자 인증을 위해 서버와 클라이언트 간에 전달되는 JSON 형식의 토큰입니다. 주로 **상태 없는 인증(stateless authentication)** 시스템에서 사용됩니다.### 동작 원리- JWT는 세 부분으로 구성됩니다: 1. **Header**: 토큰의 타입과 서명 알고리즘 정보를 포함. 2. **Payload**: 인증된 사용자 정보 및 기타 클레임(claim)을 포함. 3. **Signature**: 서명은 토큰의 무결성을 보장하기 위해 사용됩니다.- 클라이언트는 로그인 후 서버로부터 JWT를 받습니다.- 이후 클라이언트는 요청을 보낼 때마다 HTTP 헤..

스프링 2025.04.28

HttpStatus란

https://developer.mozilla.org/ko/docs/Web/HTTP/Reference/Status참고할만한 링크🌐 HttpStatus란?HttpStatus는 서버가 클라이언트 요청에 대해 응답할 때 보내는 상태 코드야.상태 코드를 통해 요청이 성공했는지, 실패했는지, 추가 조치가 필요한지 등을 알려준다.상태 코드는 항상 3자리 숫자로 되어 있고, 숫자 범위에 따라 의미가 다르다.🔢 HttpStatus 분류범위의미설명1xx정보요청을 받았고 계속 처리 중2xx성공요청이 성공적으로 처리됨3xx리다이렉션다른 위치로 이동 필요4xx클라이언트 오류요청이 잘못됨 (클라이언트 문제)5xx서버 오류서버가 요청 처리 실패 (서버 문제)🏷️ 주요 HttpStatus 코드 + 예시✅ 200 OK설명: 요..

스프링 2025.04.28

도커 설정

✅ 1. Docker 명령어로 MySQL 컨테이너 실행docker run -d -p 3307:3306 --name Spring -e MYSQL_ROOT_PASSWORD=root mysql:8.0.36외부에서 접속하기 위해 포트 3307 사용root 계정의 비밀번호는 root✅ 2. MySQL 사용자 추가 (root@%)컨테이너 내부에서 MySQL 접속docker exec -it Spring mysql -u root -p# 비밀번호: root사용자 생성 및 권한 부여CREATE USER 'root'@'%' IDENTIFIED BY 'root';GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;FLUSH PRIVILEGES;'root'@'%'는 외부(..

스프링 2025.04.22

@ExtendWith(SpringExtension.class) vs @ExtendWith(MockitoExtension.class)

🔍 @ExtendWith(SpringExtension.class) vs @ExtendWith(MockitoExtension.class)✅ 공통점둘 다 JUnit 5에서 테스트 환경을 확장하기 위해 사용하는 어노테이션.각각 다른 테스트 목적에 맞춰 사용됨.✅ @ExtendWith(SpringExtension.class)항목 설명목적Spring 테스트 환경 구성용도@Autowired, @MockBean, @SpringBootTest 등과 함께 사용사용 예통합 테스트, 웹 컨트롤러 테스트, JPA 테스트 등특징Spring 컨텍스트를 실제로 로딩함@ExtendWith(SpringExtension.class)@SpringBootTestclass MyServiceTest { @Autowired MySe..

스프링 2025.04.18

프록시

🧩 프록시(Proxy)란?JPA에서 em.getReference()를 호출하면 실제 엔티티 객체가 아닌 프록시 객체를 반환해. 이 프록시는 지연 로딩(Lazy Loading) 을 위한 가짜 객체야.🔁 프록시의 목적DB 접근을 지연시키기 위해 사용돼.엔티티의 실제 데이터를 당장 불러오지 않고, 필요할 때 DB에서 조회하게 만들어.✅ 프록시 작동 방식Tutor proxyTutor = em.getReference(Tutor.class, tutor.getId());이 시점에서는 DB에 쿼리를 날리지 않음대신 Tutor를 상속받은 프록시 객체가 생성됨proxyTutor.getName() 같이 프록시의 필드에 접근하면 그 시점에 DB 조회 발생✅ 프록시 특징 정리특징 설명em.find() vs em.getRef..

스프링 2025.04.18