spring 22

[트러블슈팅] JPA Cascade와 Aggregate Root 적용하기

회원가입 기능을 구현하면서 여러 엔티티가 함께 생성되는 구조를 설계하게 되었습니다.처음에는 각 엔티티를 개별 Repository를 통해 저장하는 방식으로 구현했지만 이 방식은 JPA를 사용하면서도 ORM의 장점을 제대로 활용하지 못하는 구조였습니다.이번 글에서는 회원가입 로직을 Cascade와 Aggregate Root 개념을 활용하여 개선한 과정을 정리해보려고 합니다. 문제 상황회원가입 시 다음과 같은 여러 엔티티가 함께 생성되었습니다.MemberProfileImageAuthBusinessBusinessCode 기존 구현에서는 이렇게 필요한 각 엔티티를 Repository를 통해 각각 개별적으로 저장하였습니다.코드를 보면 아래와 같습니다 기존 회원가입 로직@Transactionalpublic Long..

Spring에서 Redis 쉽게 사용하는 방법 정리 -활용

Spring은 Redis를 편하게 사용할 수 있도록다양한 추상화와 기능을 제공합니다.즉 단순 Redis Client 수준이 아니라Template 패턴Cache 자동 처리메시징 지원Reactive 지원까지 제공하여Redis를 매우 쉽게 사용할 수 있는 환경을 만들어 줍니다.이번 글에서는실무에서 자주 사용하는 기능만 핵심 위주로 정리해 보겠습니다 Spring에서 Redis 쉽게 쓰게 해주는 핵심 기능RedisTemplateStringRedisTemplateSpring Cache abstractionRedis RepositoryMessage Listener (Pub/Sub)Reactive Redis 1. RedisTemplate (가장 핵심)Spring Redis의 중심 클래스입니다.Redis 명령어를 Jav..

Spring Data Redis 공식문서로 내부 동작 이해하기

Spring Boot에서 Redis를 사용할 때 우리는 보통 아래처럼 아주 간단하게 사용한다.stringRedisTemplate.opsForValue().set("user", "donguk"); 하지만 이 한 줄 뒤에서는 생각보다 많은 계층과 추상화가 동작하고 있다.이 글에서는 Spring Data Redis 공식 문서 기반으로RedisTemplate 내부 동작Lettuce의 역할RedisConnection 추상화StringRedisTemplate 차이HashMapper 동작Redis 트랜잭션 구조Spring Boot Auto Configuration까지 전체 흐름을 깊게 정리해 본다. 참고 : https://docs.spring.io/spring-data/redis/reference/ Spring Da..

@JoinColumn의 이해

@JoinColumn 이 JPA를 공부하면서 가장 많이 쓰이는데 초반에 공부를 할 때 대충 외우는 식으로 넘어갔다..나중에 가니까 내가 생각한 방식으로 동작하지 않는 코드를 보면서 JoinColumn에 대해서 찾아봤고 학습한 내용을 정리해 보려고 합니다..! DB의 Join보통 DB에서 Join을 하려면 외래키를 활용해 JOIN을 한다. 예시를 통해 알아보자 여러 명의 Member가 하나의 Team에 가입할 수 있다고 해보면 다음과 같이 Table을 설계하는 게 자연스러운 일이다 membermember_id(pk)member_nameteam_id(fk)1MemberA12MemberB13MemberC1 teamteam_id(pk)team_name1팀A 이렇듯 DB에서는 1:N 관계에서 무조건 N 쪽에..

🌿 스프링/JPA 2026.02.24

API 서버 - 응답 통일 어노테이션 만들기 ( @ApiSuccess )

개요사이드 프로젝트를 하기 전의 우리들만의 아키텍처 규칙을 만들고 싶었다 특히 김영한 님의 스프링 강의를 보면서 MessageSource와 나만의 Annotation을 만들어서 최대한 개발하는데 편의성을 높이고 싶었다 그래서 이번에는 API 응답의 통일성을 가져가고 이를 하면서 느낀 트러블 슈팅 과정을 기록해 볼려고 합니다목표1. 성공 응답과 실패 응답을 우리들만의 Spec 을 만들어서 프런트 엔드 분에게 편의성을 제공하자 예시) 성공응답 { "success": true, "code": 200, "message": "요청에 성공했습니다.", "data": { "id": 1, "name": "dongwook" }} 예시2 ) data 가 없는 성공 응답 { "success": true..

API 예외처리

개요HTML 은 BasicErrorController를 통해서 오류 페이지를 뿌려 주면 되지만 JSON 같은 API는 하나의 오류페이지로 퉁 칠순 없다 각 상황에 맞는 오류 응답 스펙을 정하고 JSON으로 데이터를 내려 줘야 한다 만일 API 컨트롤러에서 오류가 발생하면 JSON 형식으로 응답이 나가야 하는데... 이런 형식으로 응답이 나가면 안된다 이렇게 응답이 나가는 이유는 BasicController 에 응답이 도착할 때 Client의 Accept Header 에따라서 BasicErrorController 가 작동하는 방식이 달라지기 때문이다스프링은 이러한 특정 AcceptHeader (여기서는 application/json) 을 조건으로 RequestMapping 하는 기능도 제공한다 Bas..

서블릿 필터와 스블릿 인터셉터

개요로그인이 안 된 사용자는 로그인하라고 가게하고 로그인이 된 사용자만 우리 페이지를 보여주고 싶다이런 건 모든 컨트롤러의 공통으로 해야 하는 과제다 컨트롤러 하나 하나 하는게 아니라 요청이 오면 요청을 검사하는 공통으로 해야 하는 과제가 생겼다 요구사항 지금 이 사용자가 로그인 됐는지 확인로그인이 안됐으면 리다이렉트 페이지로로그인이 됐으면 계속 이용하게 하자 스프링 필터 필터의 위치HTTP 요청 -> WAS(response,request객체) -> 필터 -> Dispatcher서블릿 -> 컨트롤러 스프링의 필터의 위치는 ServletContainer 안에 존재한다. 그리고 그중에서도 DispatcherServlet 앞단에 존재한다 그래서 필터를 이용해 모든 고객의 요청 로그를 남길 수도 있다 참고..

로그인 처리- 쿠키,세션

개요V1 쿠키 직접 사용V2 커스텀 세션 매니저V3 서블릿 HttpSessionV4 RedirectURL 처리V5 @SessionAttributeV6 ArgumentResolverV7 Filter 인증 처리V8 Interceptor 인증 처리 (최종) V1 - 쿠키에 MemberId 저장@PostMapping("/login")public String login(@Valid @ModelAttribute LoginForm form , BindingResult bindingResult, HttpServletResponse response) { //로그인 성공 처리 Cookie cookie = new Cookie("memberId", String.valueOf((loginMember..

Validation

개요우리가 흔히 사용하는 @Validated , BindingResult는 처음부터 존재했던 게 아니라 점진적으로 발전된 결과물이다.그 과정을 따라가 보려고 한다 V1 - 가장 원시적인 검증 방식 (Map 사용) @PostMapping("/add") public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes, Model model) { //검증 오류 결과를 보관 Map errors = new HashMap(); //검증 로직 if (!StringUtils.hasText(item.getItemName())) { errors.put("i..

메시지 , 국제화 기능

메시지 기능 만약 HTML에 이런 식으로 하드 코딩 되어 있으면 유지보수에 굉장히 힘들 것이다 상품명 만일 기획자가 “상품명 → 상품이름으로 바꿔주세요” 라고 요청이 오면 모든 HTML 을 찾아가서 하나하나 다 수정해야 한다 그래서 이러한 Message를 한 파일에 관리하고 해당 파일에서 가져다 쓰는 방식이 필요하다 messages.propertiesitem=상품item.id=상품 IDitem.itemName=상품명item.price=가격item.quantity=수량 이렇게 하나의 파일에서 관리하고 이제 문구 변경 시 properties 파일만 수정하면 전체 화면 반영이 된다!국제화 기능메시지에서 나라별로 관리하면 서비스를 국제화 할 수 있다 스프링은 국제화 기능도 제공한다 messages_en..