💡Remark DFS 재귀 호출 시 변동이 있는 매개 변수를 넣을 때 주의해야 한다. 그 이유는 재귀 호출을 할 때에는 매번 하나의 root 에서 살을 붙이는 방식을 사용하는데, root 자체에 변화를 주면 안되고 root 에 살을 하나 붙인 값에 대해 재귀 호출하고, 다시 root 그대로에 다른 살 하나를 붙인 값을 재귀 호출하는 식으로 root 에 변화가 생겨서는 안되고 매개 변수에만 변화되는 모양을 추적할 수 있게 넣어주어야 하기 때문이다. 문제 https://school.programmers.co.kr/learn/courses/30/lessons/42839 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 ..
Introduction 새로운 프로젝트를 생성하면서 그동안의 Swagger 을 사용한 문서화 방식 대신 Spring REST docs 를 활용해보고자 했고, 이전에 사용하지 않은 플러그인을 추가했다. 개요 Gradle 로 빌드 시 발생한 에러를 자세히 읽어본 후 관련 코드를 찾아보다가 플러그인 중 ''org.asciidoctor.convert'' 가 추가된 것을 발견할 수 있었다. 해결 구글링을 하는 도중 asciidoctor 는 Spring Rest Docs 에서 사용하는 플러그인이라는 사실을 알게 되었다. Spring Rest Docs 공식 문서에서는 다음과 같이 build.gradle 파일을 작성하라고 되어 있다. plugins { (1) id "org.asciidoctor.jvm.convert" ..
Goal 캐시를 적용하여 같은 키워드 사용하여 검색 시 캐시에 저장된 쿼리문과 엔티티를 사용하도록 하여 검색 속도 개선 캐싱 적용하기 위한 준비 * 환경 - Spring Boot 3.x - Hibernate 6.x 우선 Hibernate 의 버전을 확인하고 버전에 맞는 EhCache 의존성을 build.gradle 에 추가해주었다. 출처의 첫 번째 링크를 참조해서 JCache 와 EhCache 의 의존성을 모두 추가 후 yml 파일을 설정해 1. L2 캐시를 사용하며 2. 콘솔 로그에서 L2 캐시가 적용이 올바르게 되었는지 확인하겠다고 명시했다. 아래는 build.gradle 에 추가한 dependencies 이다. implementation 'org.hibernate.orm:hibernate-jcach..
Introduction 프로젝트를 하던 중, DB 에서 테이블을 조회하는 코드가 중복이 많다는 것을 알게 되었다. 이후 중복을 없애기 위해 디자인 패턴을 적용하자고 마음을 먹고 전략 패턴을 적용해보았다. 패턴 적용 전 코드 public SearchPageGetResponse findTracksWithKeyword(Pageable pageable, String searchKey, String memberEmail) { Member member = validateMember(memberEmail); Page tracks = trackRepository .findAllByTrackTitleContainingOrAlbumAlbumTitleContainingOrArtistArtistNameContaining(ke..
기본 클래스를 찾거나 로드할 수 없다는 에러가 자꾸 발생해, 에러를 해결하고자 구글링을 계속 해야 했다. 에러 상황 해결 우선 스택 오버플로우에 Settings-> Build, Execution, Deployment-> Build Tools-> Gradle 에서 설정을 바꾸라는 식의 조언이 있어서 참고했지만 에러는 여전했다. 하지만 도무지 원인을 알 수 없었다. 분명 main 클래스를 건드리긴 했지만, 이름을 변경한 것이 아닌데 왜 인식을 하지 못하고 있을까? 그러던 중 걸리는 것이 딱 하나 있었는데, 프로젝트가 위치한 폴더 명이 한글로 되어있다는 점이었다. 이전에도 한글로 한 적이 있었던 것 같았지만 지푸라기라도 잡는 심정으로 폴더명을 영어로 변경해보았고 바로 해결되었다 🤣 결론 프로젝트 폴더명은 영어..
Introduction Spotify Web API 를 사용하던 도중, Album 과 Track 은 불러오는데에 성공하면서도 Artist 를 불러오지 못하는 문제가 발생하였다. 💥 문제 발생 아무리 코드를 둘러봐도 문제점을 발견하지 못했고, 빈 값으로 가져오는 이유가 명확하게 찾아지지 않았다. 혹시나 tracks/{offset}/artists/name 의 경로 설정이 다를 수도 있겠다고 판단이 되어서 로직 수정이 아닌 오타를 찾는 데에 집중했다. 하지만 찾을 수 없었다. 온갖 수정을 하던 차에 Json 데이터 값에서 key artist 의 value 를 추출하여 JsonNode 객체에 할당할 때 문제가 있을 수도 있으니 추출하는 코드를 변경하고 있었다. 그리고 기존 at 메서드 사용에서 get 메서드를 ..
GitLab 에서의 CI/CD 전형적인 배포의 단계들 1. 프로젝트가 빌드 준비를 마치면 Dockerfile 을 작성한다. 2. 파이프라인에서 사용하는 환경변수들을 설정한다. 3. 1번에서 작성한 Dockerfile 로 docker build 와 docker push 를 하는 YAML 파일로 파이프라인을 작성한다. 4. YAML 파일을 업데이트하면 파이프라인이 자동으로 실행되는 것을 목록에서 볼 수 있다. 5. 작성한 파이프라인이 성공적으로 실행되면 Container Registry 에 Docker 이미지가 생성되어 있음을 볼 수 있다. 📃 Note 여기까지가 Continuous Delivery 에 포함된다. Continuous Delivery, 지속적 제공이란 배포 직전 단계까지의 과정을 자동화하여 구..
🔍 Soft Delete 데이터베이스에서 row 를 실제로 삭제하지는 않아야 하는 상황에서 사용한다. 실질적으로 DB 에는 남겨두고, 프론트에서 접근하지 못하도록 숨기는 방식으로 pseudo-delete 를 구현하는 것을 soft delete 의 정의라고 할 수 있다. 현재 프로젝트에서는 포스트가 삭제되었는데 댓글과 좋아요가 삭제된 포스트 아이디에 대한 댓글과 좋아요로 남아 있으면 논리적으로 오류이므로 soft delete 방식을 사용한다. 댓글 엔티티와 좋아요 엔티티 모두에 deleted\_at 컬럼을 추가해서 삭제될 때 현재 시간이 기록되도록 쿼리를 튜닝해준다. 좋아요를 눌렀고, 댓글을 달았다는 기록은 남긴 채 대상 포스트가 사라졌다는 사실을 알고는 있도록 할 때 soft delete 를 사용한다고 ..
- Total
- Today
- Yesterday
- Spring Boot
- @RequestBody
- docker
- 서버 호스팅
- 인증/인가
- JOIN FETCH
- gitlab
- ResponseEntity
- JPQL
- 가상 서버
- DTO
- 알고리즘
- Java Data Types
- google cloud
- 도커
- N+1
- Jackson
- 코테
- ci/cd
- LazyInitializationException
- 기지국 설치
- 역직렬화
- DeSerialization
- 깃랩
- JPA
- 코딩 테스트
- json web token
- 지연 로딩
- 프로그래머스
- spring security
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |