[Backend/Spring] Spring Boot - Redis 연동과 캐싱
·
Backend/Spring
Redis 란?Redis는 메모리에 데이터를 저장하는 저장소이다.일반 DB(MySQL 등)는 데이터를 디스크에 저장한다. 디스크는 데이터를 읽을 때 물리적인 탐색 과정이 필요해서 시간이 걸린다.Redis는 데이터를 메모리(RAM)에 저장하기 때문에 디스크 탐색 없이 바로 읽어올 수 있어서 속도가 훨씬 빠르다.MySQL → 디스크 저장 → 조회 시 디스크 I/O 발생 → 상대적으로 느림Redis → 메모리 저장 → 바로 읽어옴 → 매우 빠름물론 단점도 있다.메모리는 서버가 꺼지면 데이터가 날아간다. 그래서 Redis는 영구 저장이 필요한 데이터가 아니라 임시로 빠르게 접근해야 하는 데이터에 사용한다.꼭 써야하나?지금 구현하고 있는 myshop 프로젝트를 생각해보자. 상품 목록 조회..
[Backend/Spring] Spring Boot - 테스트 코드(JUnit5 / Mockito)
·
Backend/Spring
지금까지 코드를 수정하고 확인할 때마다 앱을 실행하고 Postman으로 직접 요청을 보내서 확인했다.매우 귀찮다..이걸 테스트 코드로 대체할 수 있다고 한다. 한번 알아보자. 테스트 종류는 크게 두 가지가 있다.단위 테스트(Unit Test) : 특정 클래스나 메서드 하나만 독립적으로 테스트DB나 외부 서비스에 의존하지 않고 Mockito 로 가짜 객체를 만들어 테스트 한다. 실행 속도가 빠르다.통합 테스트(Integration Test) : 여러 계층을 실제로 연결해서 테스트실제 DB에 데이터를 넣고 조회하는 것까지 확인한다. 실행 속도가 느리다.이번 글에서는 단위 테스트를 해보려고 한다.파일 수정테스트 코드에서 생성자로 객체를 만들어야 하기 때문에 기존 코드에서 세 곳을 수정한다.MemberJoinR..
[Backend/Spring] Spring Boot - Spring Security + JWT
·
Backend/Spring
인증 방식에는 크게 두 가지가 있다.세션 방식 : 로그인하면 서버가 세션을 만들어서 저장하고, 클라이언트는 세션 ID를 쿠키에 담아 요청한다.서버가 세션을 직접 저장하기 때문에 서버가 여러 대로 늘어나면 세션 공유 문제가 생긴다.JWT 방식 : 로그인하면 서버가 토큰을 발급하고 클라이언트가 이를 저장한다. 이후 요청마다 토큰을 헤더에 담아 보내면 서버는 토큰을 검증하기만 하면 된다.서버가 아무것도 저장하지 않아서 서버가 여러 대로 늘어나도 문제 없다.인증 흐름로그인 시로그인 요청 → AuthService에서 이메일/비밀번호 검증 → 검증 성공 시 JWT 토큰 발급 → 클라이언트가 토큰 저장 이후 API 요청 시Authorization 헤더에 토큰을 담아서 요청 → JwtAuthenticationFilte..
[Backend/Spring] Spring Boot - 예외 처리
·
Backend/Spring
일단 지금 코드에서 존재하지 않는 회원을 조회하면 어떤 응답이 오는지 확인해보자.없는 회원에 대한 정보를 요청했기 때문에 에러가 발생할 것은 당연히 예상할 수 있다.그치만 여기에 2가지 문제가 있다."status" 가 500(서버 오류)인데 지금은 서버 오류가 아니고 클라이언트가 잘못된 ID를 요청한 것이므로 404(클라이언트 오류)여야 한다.에러 메시지가 없어서 클라이언트 입장에서 뭐가 문제인지 알 수 없다.커스텀 예외 클래스 만들기com.seongmo.myshop 하위에 exception 패키지를 만들자com.seongmo.myshop├── member├── item└── exception ├── BusinessException.java ├── ErrorCode.java ├── Err..
[Backend/Spring] Spring Boot - @OneToMany 와 N+1 문제
·
Backend/Spring
@OneToMany기존 Java 코드에서 회원 객체로 상품 목록에 접근하려면 문제가 생긴다.// @OneToMany 추가 전 — Member 객체에서 상품 목록 접근 불가member.getItems() // 이런 메서드 자체가 없음// 상품 목록을 가져오려면 ItemRepository를 따로 써야 함itemRepository.findBySellerId(memberId)즉, 회원 객체에서 상품 목록에 바로 접근할 수가 없다.이를 해결하기 위해 Member.java 에 @OneToMany 를 추가하자.Member.java 수정package com.seongmo.myshop.member;import com.seongmo.myshop.item.Item;import jakarta.persistence.*;impo..
[Backend/Spring] Spring Boot - JPA 연관관계
·
Backend/Spring
연관관계회원과 상품의 관계를 생각해보자.회원 1명 → 상품 여러 개 등록 가능상품 1개 → 회원 1명에게 속함이런 관계를 DB에서는 외래키(Foreign Key)로 표현하고, JPA에서는 @ManyToOne, @OneToMany 로 표현한다.Member (1) ←→ Item (N)Item 테이블에 member_id 컬럼이 생김 (외래키)상품 엔티티 만들기com.seongmo.myshop 하위에 item 패키지를 만들고 아래 파일들을 생성하자.com.seongmo.myshop├── member└── item ├── Item.java ├── ItemStatus.java ├── ItemController.java ├── ItemService.java ├── ItemRepository..
[Backend/Spring] Spring Boot - JPA와 MySQP 연동
·
Backend/Spring
JPA는 Java Persistence API 의 약자로, Java 객체와 DB 테이블을 매핑해주는 기술이다.JPA를 쓰면 SQL을 직접 작성하지 않아도 Java 코드로 DB를 다룰 수 있게 된다.// SQL 직접 작성 방식SELECT * FROM member WHERE id = 1;// JPA 방식memberRepository.findById(1L);JPA는 인터페이스고, 실제 구현체는 Hibernate 이다.Spring Boot에서 spring-boot-starter-data-jpa 를 추가하면 Hibernate가 자동으로 설정된다.Member.java 만들기com.seongmo.myshop.member 패키지에 Member.java 파일을 만들자.// Member.javapackage com.seo..
[Backend/Spring] Spring Boot - MVC 계층 구조와 API
·
Backend/Spring
MVC 계층 구조Model-View-Controller 의 약자로, 코드를 역할에 따라 세 부분으로 나누는 설계 패턴원래 MVC는 웹 초창기에 화면(VIew)까지 서버에서 만들어서 보내주던 시절의 패턴이라고 한다.요즘에는 View의 역할은 React 같은 프론트엔드가 대신하고, 내가 공부하고 있는 건 API 서버라 View는 없고 Controller와 Model만 사용한다.Controller : 클라이언트(HTTP)의 요청을 받아서 적절한 Service를 호출하고 응답을 돌려주는 역할 -> 교통정리ModelService : 실제 비즈니스 로직을 처리 -> 회원가입 시 이메일 중복체크, 비밀번호 암호화 등Repository : DB에 데이터를 저장하고 조회클라이언트 → Controller → Service..