1. 상황쇼핑몰 프로젝트를 구현하면서 api가 많아짐에 따라 그만큼 필요한 DTO의 수도 걷잡을 수 없이 많아지고 있었다. 그래서 처음에는 이를 최대한 알아보기 쉽게 구분하고자 request의 경우 in, response의 경우 out으로 나눠서 관리하였다. 하지만 모든 api가 request, response 두 가지만 존재하는 것은 아니었다.request의 경우 특정 필드의 경우 key, value 형태의 리스트가 요구되기도 했고, 이에 따라 새로운 Dto를 추가해야 하는 상황이 발생했다. 2. 개선 전 클라이언트와 위와 같은 형태로 request를 보내주길 바라며 아래와 같은 코드를 작성했었다. @AllArgsConstructor@NoArgsConstructor@Getter@Setter@Buil..
상황쇼핑몰 프로젝트를 진행하면서 회원과 상품과 같은 주요 테이블에 지나치게 많은 연관관계를 집중시킨 결과, 몇 가지 문제가 발생했습니다. 위 이미지는 설계 단계에서 작성한 초기 ERD의 회원 테이블 부분입니다.개발 초기에는 큰 문제가 없었지만, 테이블 간 의존도가 높아지면서 아래와 같은 문제들이 발생했습니다.요구사항 변경의 어려움 회원 테이블은 구매 내역, 장바구니, 리뷰 등 다양한 테이블과 연관되어 있었습니다.이런 상황에서 상품에 대한 찜하기 기능을 도입하려고 하자, 기존에는 특정 상품에 대한 구매 내역과 리뷰만 로드했었지만 이제는 추가적으로 찜하기 테이블을 조인해야 했습니다. 이로 인해 새로운 기능과 기존 기능 간 의도치 않은 상호작용을 방지하기 위해 기존 코드를 반복적으로 테스트해야 했고, 데이터 ..
JWT와 Access Token, Refresh Token, RTR 방식 정리 1. 쿠키, 세션 방식 기존의 사용자 인증 방식은 쿠키와 세션 방식으로 이루어졌다. 쿠키 방식은 Key, Value로 이루어진 구조로 만료시간, 도메인, 경로 등의 정보를 사용자의 로컬 하드에 저장하였다. 그러나 이는 개인 정보를 저장하는 것이기에 보안에 취약했으며, 용량 제한 때문에 많은 정보를 담을 수가 없었다. 이러한 문제를 해결하고자 사용자 정보를 서버 측에서 저장하고 관리하기 위해 세션 방식이 도입되었다. 세션 ID에는 중요한 정보가 담겨 있지 않지만, 세션 ID 자체를 탈취당하면 타인이 사용자인 척 위장할 수 있는 문제점이 있다. 또한, 사용자가 많아지면 서버에 트래픽 부하가 생기므로 성능이 저하되기도 한다. 이러한..
[Springboot] 스프링부트 2.7 이상 QueryDsl build.gradle 설정 필요한 부분만 작성했습니다. buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'java' id 'war' id 'org.springframework.boot' version '2.7.13' id 'io.spring.dependency-management' version '1.0.15.RELEASE' id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10' } group = 'org.zerock' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '11' } c..
Failed to initialize JPA EntityManagerFactory: No identifier specified for entity 에러 해결법 Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: No identifier specified for entity 위와 같은 오류가 발생했을 경우, ..
[Spring boot] java.lang.NullPointerException findAll() null 에러 해결 Repository에 생성자 주입이나 @Autowired 어노테이션을 달아주지 않아서 생기는 에러이다. 컨트롤러의 레포지토리를 다시한번 살펴보도록 하자.