안녕하세요,이번 포스팅에서는 NestJS 개발 중 알게 된 스냅샷과 히스토리 개념에 대해 이야기해보려고 합니다.NestJS 개발 커뮤니티에서 유명한 '삼촌님'의 깃허브 레포지토리를 참고하면서 스냅샷 방식을 도입하게 되었습니다.이전에는 히스토리성 로그 방식의 테이블을 사용했는데요,이번 글에서는 두 방식의 차이점과 각각의 특징, 그리고 도입 예제에 대해 알아보겠습니다. 스냅샷과 히스토리성 테이블의 차이점데이터 저장 방식히스토리 테이블: 변경된 내용만 순차적으로 기록합니다. "어제 뭐 했더라..." (매일매일 일기 쓰는 느낌)스냅샷: 특정 시점의 전체 상태를 저장합니다. "자, 여기 내 전재산!" (인생 통장 사진 찍기)조회 성능히스토리 테이블: 최신 상태를 얻기 위해 여..
nestjs, prisma를 이용해 cursor 페이지네이션을 구현한다.서버 부하를 줄이는 많은 태스크가 있지만, 오늘은 페이지네이션 방식인 cursor를 통해 어떻게 부하를 줄이는지 알아보자.참고로 Prisma를 적용한 포스팅 글이 없어 prisma로 적용한 포스팅이다. cursor 도입 후 실서버에서 테스트 결과는 맨 아래에 있다. 🌠 목차✅ 들어가기에 앞서✅ offset과 cursor란? 속도 차이가 나는 이유✅ cursor의 적용 예제✅ prisma 사용시 cursor의 주의사항✅ cursor 결과✅ 성능 최적화 방법 및 비용 줄이기들어가기에 앞서▶️ BE: nestJS, Prisma, TypeScript, AWS AuroraDB | FE: flutter 를 사용했다. - Prisma+c..
JPA + S3 조합으로 S3에 파일 올리는 것은 예제가 많이 있는데 JPA + S3 + DB에 저장한 값 불러와서 실제로 사용할 수 있는 예제는 많이 없었다 그래서 글을 작성하게 되었다. 나의 경우는 팀 프로필 변경 건에 대한 API를 만들어보았다. 1. 코드 예제에서 import는 생략하니 실제로 사용하려면 import선언정돈 직접 하자 2. AMI랑 S3이용해서 만드는건 구글 검색하면 엄청 나오니까 이건 다른 포스팅 참고 Application.yml의 기본설정 # ------- 파일 업로드 시작 ---------- spring: servlet: multipart: enabled: true # 임시 저장경로 - 파일 확장자 체크 max-request-size: 100MB max-file-size: 1..
하루종일 삽질을 하면서 나 같은 사람이 있을 거라는 생각이 들어 글을 작성하게 되었다. 글에 들어가기 전 참고용 구성할 환경: 로컬/개발 서버: AWS EC2 1개 개발서버용 (백엔드, 프런트) DB: H2(로컬) AWS RDS(개발) CI/CD: 깃허브액션 회원가입: JWT CI/CD는 깃허브액션을 사용했고, 회원가입 부분에서 JWT를 이용해 application-oauth.yml에서 시크릿 키들을 정의했다. ssh에 접속해서 resources/ 경로에 vim 명령어를 통해 application-oauth.yml를 생성 및 키 값들을 포함한 내용 작성을 해주었다. nohup java -jar. jar --spring.profiles.active=dev & 명령어를 통해 백엔드를 배포할 때 applica..
스프링에서 오류를 마주했다 처음 한 두 번 마주한 오류는 어째 어째 해결했지만, 반복되는 일이 많았다. 뭐가 부족한지 고민을 한 결과 각 어노테이션 별 동작 유무 및 성공결과에 대한 정확한 개념 정리가 부족하다고 느껴 정리하게 되었다. @RestController와 @Controller 먼저 @RestController와 @Controller를 비교하기 전에 Controller가 뭔지 가볍게 정리한다 뷰를 반환하는 Controller 전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용한다. Spring MVC Container는 Client의 요청으로부터 View페이지를 반환한다. Data를 반환하는 Controller Controller의 역할은 View..
뷰에서 해당 게시글 삭제를 만들려고 하던 중 맞이한 오류이며 JPA queryDsl 작성중 맞이한 오류이다. 뷰 페이지에서 게시글 삭제 버튼 클릭 시 ajax를 통해 해당 게시글의 id를 보내주고, Controller에서 @Pathvariable로 id값을 받아서 DaoCustom, DaoCustomImpl로 가는 로직을 구상했다. 그러던 중 아래와 같은 오류 메시지를 마주했다. template might not exist or might not be accessible by any of the configured Template Resolvers 원인을 구글링해 본 결과 리턴해 줄 페이지가 없을 경우 경로를 찾지 못해 발생한 오류 라고 한다. 그러나 나는 @DeleteMapping을 사용하므로 리턴 페..
✍ 글을 적는 이유 회사 업무 중 Controller에 @Transactional(readOnly = false)를 사용하길래 내가 만든 모든 Controller에 @Transactional(readOnly = false) 붙였다. 또한 @Transactional(readOnly = false)를 붙이지 않으니 오류 메시지가 나와서 스택오버플로우를 보고 붙여야 하는 줄 알았다. 그러나 사수님으로부터 @PatchMapping 에는 (readOnly = false)를 지우고 @Transactional만 사용하라고 했다. 나는 피드백을 듣고 궁금증이 생겨 이 글을 작성하게 되었다. 핵심만 볼라면 5번 글을 봐주세요🥹 1. 들어가기에 앞서... 트랜잭션 이란? 1. 데이터베이스의 상태를 변경하는 작업의 수행하..
스프링으로 회원 가입 테스트 과제를 만들던 중 회원수정 @PutMapping에서 not-null property references a null or transient value가 발생했다. JPA에 대한 깊은 이해가 없이 테스트 과제를 수행하기에만 급급하여 오류 해결에 애를 먹었다 이를 해결하기 위해 접근했던 방법을 기록하고자 작성한다. [변경 전 회원수정 Controller 일부] ... @ApiOperation(value = "회원 수정", notes = "회원정보를 수정한다") @PutMapping(value = "/user") public SingleResult modify( @ApiParam(value = "회원번호", required = true) @RequestParam long idx, ..
- Total
- Today
- Yesterday