전체 글

Spring Boot

@RequestParam Enum 값 받기

@RequestBody로 받는 Enum 타입 값들은 @JsonCreater를 사용해 받을 수 있었다! @JsonCreator public static PostStatus create(String requestValue) { return Stream.of(values()) .filter(v -> v.key.equalsIgnoreCase(requestValue)) .findFirst() .orElseThrow(() -> new BadRequestException(INVALID_POST_STATUS)); } 그렇다면 @RequestParam으로 받아야 하는 Enum 값들은 어떻게 받아야 할까? @RequestParam은 주로 쿼리스트링이나 폼 데이터와 관련이 있다. @RequestParam을 사용하는 경우에는..

Trouble Shooting

saveAll 사용 시 쿼리가 여러 번 나가는 문제 이유는?

이동봉사 중개 공고 등록 시 PostImage를 save하는 쿼리가 여러 번 나가는 성능 문제가 생긴다 ,, ! 분명 PostImage의 List를 만들어 한 번에 saveAll을 했지만 쿼리가 PostImage의 개수만큼 나간다 ! 벌크 연산을 적용하기 위해 batch size를 설정하여 한 번에 할 수 있는 작업을 늘렸다. 하지만 batch size를 설정한 후에도 쿼리가 나가는 횟수는 동일했다. 어떤 게 문제일까? 문제는 바로 ,,, Id 채번 방식 (데이터베이스나 시스템에서 고유한 식별자(ID)를 생성하는 방식)이 GenerationType.IDENTITY이면 batch insert가 불가능하다는 것이었다!! GenerationType.SEQUENCE 또는 GenerationType.TABLE로 ..

Trouble Shooting

S3 이미지 업로드 시 나타나는 warn 로그

이동봉사 중개 공고 등록 API 구현 중 S3에 이미지를 올리는 과정에서 warn 로그 발생 S3 warning: "No content length specified for stream data" AWS 공식 문서에 나와 있는 설명 ↓ metadata 콘텐츠 길이를 정해 해결! ObjectMetadata metadata = new ObjectMetadata(); try (InputStream inputStream = multipartFile.getInputStream()) { metadata.setContentLength(multipartFile.getSize());// metadata ContentLength 설정 amazonS3Client.putObject(bucketName, savedFileNam..

Trouble Shooting

게시글 테이블과 게시글 이미지 테이블의 연관 관계 설정

이번 이동봉사 중개 서비스를 구현하는 데 있어서 고민되는 부분이 있었다! 게시글에 여러 이미지가 들어갈 수 있기 때문에 게시글 테이블과 이미지 테이블을 분리했다. 그런데 게시글에는 대표 이미지가 따로 있어서 대표 이미지를 어떻게 넣을까 고민하다가 처음에는 아래와 같이 String 타입의 mainImage 컬럼을 만들어서 해당 컬럼에 이미지 url 값을 저장하면 되겠다! 라고 생각했다. (그러면 join해서 가져오지 않아도 게시글 목록을 불러올 때 대표 이미지를 더 빠르게 불러올 수 있을 것이라 생각했다.) 하지만 . . 다시 생각해 보니 정규화가 되지 않았다는 것을 알 수 있었다. 게시글 테이블에 이미지 url이 들어가는 것은 잘못된 설계라는 것을 깨달았다. 이미지에는 이미지만 따로 들어가야 하지만 공고..

CS/알고리즘

해시테이블

해시테이블 키-주소 매핑에 의해 구현된 사전 ADT ex) 컴파일러의 심볼 테이블, 환경변수들의 레지스트리 해시테이블 - 버켓 배열 + 해시함수 항목들의 키를 주소(배열 첨자)로 매핑함으로써 1차원 배열에 사전 항목들을 저장 성능 탐색, 삽입, 삭제: O(n) 최악시간, 그러나 O(1) 기대시간 버켓 배열 해시테이블을 위한 버켓 배열(bucket array)은 크기 M의 배열 A로서 A의 각 셀을 버켓(키-원소 쌍을 담는 그릇)으로 봄 - 슬롯(slot)이라고도 함 정수 M은 배열의 용량을 정의 키 k를 가진 원소 e는 버켓 A[k]에 삽입 사전에 존재하지 않는 키에 속하는 버켓 셀들은 NoSuchKey라는 특별한 개체를 담는 것으로 가정 버켓 배열 분석 키가 유일한 정수며 [0, M-1] 범위에 잘 분..

Trouble Shooting

RDB vs NoSQL

RDBMS 데이터 타입과 제약을 통해 데이터의 정확성 보장 SQL이라는 RDBMS의 데이터를 관리하기 위해 설계된 프로그래밍 언어를 사용한 질의문을 통해 데이터를 다룸 데이터의 update가 빠름 데이터 처리에 대한 부하 발생 시 처리가 어려움 하나의 정보를 만들기 위해 여러 테이블로 쿼리를 사용하게 되며, 트랜잭션 처리를 중요시함 장점 정해진 스키마에 따라 데이터를 저장해야 하므로 명확한 데이터 구조 보장 각 데이터를 중복없이 한 번만 저장 가능 단점 테이블 간 관계를 맺고 있어 시스템이 커질 경우 join문이 많은 복잡한 쿼리가 만들어질 수 있다. 성능 향상을 위해서는 Scale-Up 만을 지원해 비용 문제가 있을 수 있다. 스키마로 인해 데이터가 유연하지 못하다. 스키마가 변경될 경우 번거롭고 어렵..

Trouble Shooting

소셜 로그인, JWT 관련 의문점 정리

이번 프로젝트를 진행하면서 JWT와 관련해 팀원들과 논의한 내용을 기록해 보고자 한다! 안드로이드와 협업하는 과정에서 나누었던 이야기를 크게 3가지로 정리해 보면 다음과 같다. 1. 소셜 로그인에서의 역할 분배 2. 토큰 전달 방식(http only cookie 등), 프론트의 토큰 저장 방식 3. JWT 토큰 재발급 1. 소셜 로그인에서의 역할 분배 지난 프로젝트에서 안드로이드 앱을 출시했을 때, 소셜 로그인은 안드로이드가 처리한 후 서버는 해당 유저의 정보를 받아 저장하는 형식으로 프로젝트를 진행하였다. 이후, 웹 프로젝트를 진행하면서 소셜 로그인에 대해 알아보면서 이번에 구현하고자 했던 소셜 로그인 플로우는 다음과 같았다. 카카오를 예를 들어 설명하면, 1. 프론트가 소셜 로그인을 클릭시 서버로 리..

CS/알고리즘

탐색 트리

탐색트리 이진탐색트리(binary search tree): 내부노드에 (키, 원소) 쌍을 저장하며 다음의 성질을 만족하는 이진트리 u, v, w는 모두 트리노드며 u와 w가 각각 v의 왼쪽과 오른쪽 부트리에 존재할 때 다음이 성립 key(u) < key(y)

CS/알고리즘

비교 정렬과 사전

비교 정렬 알고리즘 비교 정렬의 안정성 키-원소 항목들을 정렬할 때 중요한 이슈: 동일 키가 어떻게 처리되느냐 L = ((k0, e0), ..., (kn-1, en-1))을 항목들의 리스트라 하자 두 개의 항목 (ki, ei)와 (kj, ej)에 대해 ki = kj며 정렬 전에 (ki, ei)가 (kj, ej)보다 앞서 있었다면 (즉, i k) return NoSuchKey else L.advance(i) 3. return NoSuchKey 이진탐색 이진탐색(Binary search): 키로 정렬된 배열에 기초한 리스트로 구현된 사전에 대해 findElement 작업을 수행 재귀할 때마다, 후보 항목들의 수가 절반으로 줄어든다. 입력 크기의 로그 수에 해당하는 수의 재귀를 수행한 후 정지 참고: 스무고개..

AWS, CI&CD

Blue-Green 배포 중 트러블 슈팅

CodeDeploy 배포 중 생긴 문제! [stdout]#6 [backend 2/2] COPY build/libs/*.jar /app.jar [stdout]#6 ERROR: lstat /var/lib/docker/tmp/buildkit-mount4102538440/build/libs: no such file or directory 문제 원인 : Dockerfile의 COPY 부분에 없는 파일을 복사하고자 할때 발생 # 이전 도커파일 FROM openjdk:17-jdk ARG JAR_FILE=build/libs/*.jar COPY ${JAR_FILE} /app.jar ENTRYPOINT ["java", "-jar", "/app.jar"] build/libs/*.jar 위치에 jar 파일이 생성되므로 위와 ..

koeyhk
개발 블로그