쿼리 최적화란 성능이 낮은 쿼리의 응답 속도를 개선하는 작업입니다. SELECT 에는 꼭 필요한 컬럼만 WHERE절에 가급적이면 별도의 연산을 하지않는 것을 권장여기서 Inefficient 쿼리의 경우, Full Table Scan을 하면서 모든 Cell 값을 탐색하고, 수식을 건 뒤, 조건 충족 여부를 판단해야 합니다. 반편 Improved 쿼리의 경우 기존에 r.value 가 가지고 있는 index를 그대로 활용할 수 있기 때문에 모든 필드 값을 탐색할 필요가 없어 Inefficient 쿼리 대비 더 짧은 러닝 타임을 가질 수 있다. -- Inefficient SELECT m.id, ANY_VALUE(m.title) title, COUNT(r.id) r_count FROM movie m INNER J..
RequestDto public record PostCreateRequestDto( Category category, @Size(max = 50, message = "제목은 최소 1자 이상, 최대 50자 까지 입력 할 수 있습니다.") @NotBlank(message = "제목은 필수 입력란입니다.") String title, @Size(max = 1000, message = "글 내용은 최소 1자 이상, 최대 1000자 까지 입력 할 수 있습니다.") @NotBlank(message = "글 내용은 필수 입력란입니다.") String content, List imageUrlList ) { } PostService public Long createPost(Long memberId, PostCreateRe..
오늘 깊게한 고민이다. 개요 팀 프로젝트 진행 중, Entity에 대한 생성을 어떻게 할 것인지 고민을 많이 했다. 우선 생성 방식은 정적 팩토리 메서드를 사용하기로 했다. 이유는 다음과 같다. 생성자를 쓰는 것보다 이름을 갖게 할 수 있어서 의미가 더욱 명확해진다. 말고도 더 많은 장점이 있지만 가장 큰 이유가 저거라고 판단했다. 근데 여기서 고민이 됐던게 // 1. public static User from(UserCreateRequestDto requestDto) { return User.builder() .username(requestDto.username()) .password(requestDto.password()) .build(); } // 2. public static User from(S..
Q. CI/CD에 대해서 설명해주세요 A. 지속적 통합 / 지속적 배포의 개념입니다. CI/CD가 탄생하게 된 배경부터 알아야하는데, 기존의 배포 작업 방식은 Push를 하고 PR을 올리고 Merge를 하고 SNAPSHOT 을 따서 서버에 파일을 보내고 돌아가던 서버를 끄고 다시 전달받은 파일로 서버를 구축하는 과정이 개발자 입장에서 상당히 까다로운 작업이었습니다. 그래서 CI/CD 개념을 도입을 해서 지속적으로 배포가 될 수 있게끔 만들었습니다. Q. CI/CD를 사용했을 때 기대효과가 있을까요? A. 사용자 불만사항이나 개선 사항에 대해서 지속적으로 수정을 할 수 있습니다. 예를 들어 결제 시스템에 오류가 나면 시간이 지날 수록 피해의 크기는 엄청 늘어나게 될 것입니다. 하지만 이런 오류를 고치려고 ..
개요 게시글에 이미지를 등록하는 기능을 구현하기 위해서 ERD 를 작성하는데, 이미지를 여러장 저장하게 하려면 어떻게 할까? 를 생각했다. 게시글을 조회 할 때 게시글 이미지 테이블을 조인해서 이미지를 갖고 오는 것이다. 이렇게하면 배열은 아니지만... 한 게시글에 여러장의 이미지를 저장하는 게 가능한데, 조인을 하기 때문에 성능적으로 굳이..? 싶었다. 그래서 검색을 해봤는데 배열 자료형을 문자열로 변환을 하고 저장을 한다고 한다. 꺼내 쓸 때는 문자열을 다시 파싱해서 배열 자료형으로 만들면 된다. MySQL Ver.5.7.8 / MariaDB Ver.10.2 이상 부터는 JSON이라는 타입을 지원 하는데 이걸 이용해서 Json 형식의 문자열 데이터를 저장하고 그걸 쓰면 된다. { "image":[ "..
오늘은 깃 액션으로 CI를 도전했다. 젠킨스와 깃 액션 중, 어떤 걸 할까 고민을 많이 했는데 깃 액션으로 하기로 했다. 이유는? GitHub와 통합 되어있음 젠킨스는 따로 서버를 열어야하고 WebHook을 사용해서 깃허브에서 푸쉬 된 걸 잡아주는 설정을 해야한다. 근데 깃허브는 그런 거 설정 안해도 된다. 따로 서버를 안 올려도 되니, 푸쉬하는 시간을 자유롭게 할 수 있음 템플릿 존재 깃허브 액션은 템플릿이 존재한다. 각종 상황에 맞게 템플릿을 선택하고 응용해서 사용이 가능 엄청 깊게 들어가지 않을 것이니, 템플릿이 존재하면 좋음 yml 파일로 설정 적응하면 읽기 쉬워진다. 엄청 읽는 거 근데 적응하는데 1시간도 안 걸린다. name: Gradle Package on: push: branches: [d..
통합 테스트 코드를 짜는 중에 환경 변수를 못읽어서 계속 스트레스 받고 있었다.. Application Run 때는 환경 변수를 잘 읽어오는데, 왜 안 되는 거냐...ㅠㅠ 검색해도 안 나오고, 해결법 같은 것들 아무리 해봐도 고쳐지지 않고 그래서 테스트 코드 돌릴 때만 properties에 쌩값 넣어서 작업 하고 있었는데 너무 불편해서 직접 인텔리제이 뒤져보면서 찾았다.. 문제 정의 (원인) 사실 수집 통합 테스트 환경 ActiveProfiles 셋팅을 해줬는데도, 환경 변수를 못 읽어서 실행이 안 되는 오류가 발생했다. java.lang.RuntimeException: Driver org.h2.Driver claims to not accept jdbcUrl, ${TEST_DB_URL} at com.za..
로컬에서 특정한 브랜치에 푸쉬를 한다. 깃허브에서 푸쉬가 된 걸 Jenkins가 Webhooks 으로 캐치를 해준다. CI 작업 (그레이들을 쓴다면 빌드) 후 통과면 ssh 명령어로 development.sh 실행 시키게 한다. development.sh 에는 순서대로 이거 해라~ 하는 명령어가? 서버 중지 -> jar 파일 삭제 -> 도커 허브 jar 다운로드 -> jar 파일 실행 (배포) 순이다. CI/CD 툴이 젠킨스만 있는 것은 아니다, GitAction도 있고, 코드 쉽도 있고... 오늘은 여기서 끝