목록스프링 (25)
Kuma's Curious Paradise

[ 문제와 해결 ]1. Filter 테스트 코드를 작성하던 중 문제가 생겼다. 2. 오류 메시지와 원인은 다음과 같다. java.lang.ClassCastException: class java.lang.String cannot be cast to class org.springframework.security.core.userdetails.UserDetails (java.lang.String is in module java.base of loader 'bootstrap'; org.springframework.security.core.userdetails.UserDetails is in unnamed module of loader 'app') - 오류 메시지의 의미는 String은 UserDetails 객..

Java Persistence API(JPA)는 객체 관계 매핑(ORM)을 사용하여, 자바 코드로 DB에 접근하는 일을 쉽게 만든다. 하지만 JPA를 사용하다 보면 마주하는 문제 중 하나가 바로 'N+1 문제'이다. 1. N+1 문제란?N+1 문제는 1개의 쿼리를 날리는데, 불필요한 N개의 쿼리가 같이 날아가서 성능이 저하되는 문제를 말한다. 이는 주로 컬렉션이나, 연관관계가 맺어진 엔티티를 가져올 때 발생한다. 예를 들어, 멤버가 3명이고 각 멤버는 2개의 주소를 가진다면 '멤버를 모두 찾는 쿼리'(1개)를 날리는데, 연관 엔티티를 가져오기 위해 '각 멤버의 주소를 찾는 쿼리'(멤버의 수만큼 3개)가 추가로 날아가는 것을 말한다. 2. N+1 문제 발생시키기2-1. Member는 여러 개의 Produ..
Member 회원가입 관련 테스트 코드를 작성하였다. 해당 코드를 다시 살펴보며 테스트 코드를 이해해 보자. public class MemberTest { @Nested class create { @Test void 생성성공_주어진_필드로_멤버_생성() { // given String email = "test@naver.com"; String password = "asdf1234!"; String name = "이름"; Address address = Mockito.mock(Address.class); // when Member m..

JUnit과 AssertJ는 모두 단위 테스트 용 라이브러리로, 테스트 작성에 많은 도움을 준다. 다음과 같이 의존성을 추가하면 스프링은 JUnit, AssertJ, Mockito 등 다양한 테스트 라이브러리를 함께 불러온다.testImplementation 'org.springframework.boot:spring-boot-starter-test' 이러한 기본 설정은 두 라이브러리가 모두 필요함을 의미할 것이다. 보통은 AssertJ를 사용해서 테스트 코드를 작성하라는 이야기를 많이 하는데, 이번 기회에 두 라이브러리의 차이점에 대해 알아보려 한다.1. JUnit 위의 스크린샷을 보면, junit 밑에 jupiter.api 라는 것이 존재한다. junit5가 보급되면서 구조가 변경되었고 그 과정에서 ‘..
1. JPA의 데이터 타입은 크게 2가지다.엔티티 타입 (@Entity)값 타입2. 이중 ‘값 타입’은 3가지로 분류된다.기본 값 타입 : int, double 등 자바 원시 타입 + Wrapper class + 특별한 친구 String임베디드 타입 : 엔티티 안에 엔티티! 예를 들면… User 안에 Address 엔티티주소처럼 여러 엔티티에서 공통 사용하는 정보를 임베디드 타입으로 정의하면 코드 중복은 줄이고 재사용성은 높일 수 있다.관련 있는 필드를 묶어 관리하므로 구조가 명확해지고 엔티티들의 관계를 이해하기가 쉬워진다.예시로, Address의 모든 속성들은 User 테이블의 컬럼이 된다. (따로 테이블 안 생김 주의!) + Address가 null이면 해당 컬럼 모두 null이다.정리하자면, 임베디..