SpringBoot
필요해서 만든 크롬 확장 프로그램
필요해서 만든 크롬 확장 프로그램
2025.03.18크롬을 쓰고 여러 개의 화면을 쓰다 보니 동일한 중복탭이 많이 생기고 가끔 렉이 걸리는 경우가 발생했다. 동일한 중복탭이 생겼을 때 하나를 남기고 모두 닫는 확장 프로그램을 만들었다. 사람들에게 공유하기 위해서는 5$를 내야 하기에 나는 그렇게 하고 싶지는 않기 때문에 그냥 코드를 공유한다. 우선 js를 사용해야 하고, 로직 자체는 아래와 같다. 1. 탭에서 검색했을 때 기존 탭들과 url과 id 비교2. 같은 url이 존재할 경우 모달을 띄우고 닫을 지 말지 확인3. 닫기 할 경우 가장 최근의 탭을 제외하고 모두 닫기 코드 구현은 모달 때문에 2개의 js 파일이 필요하고 우선 현재 열린 탭들의 url을 확인하는 것은 아래와 같다.chrome.tabs.onUpdated.addListener((ta..
로컬 Minikube로 외부에 서비스 하기
로컬 Minikube로 외부에 서비스 하기
2025.03.18사이드 프로젝트를 간단히 진행하면서 쿠버네티스에 익숙해지기 위해 Minikube로 환경을 구성해 보기로 했다. 외부에서 서비스를 노출해야 했지만, Minikube만으로는 이를 해결할 수 없어서 방법을 공유하려고 한다.(minikube 설치는 생략한다.) 인프라 세팅 편리성을 위해서 무료 도메인이 필요한데, 나 같은 경우 무료 도메인 발급 여기에서 무료로 생성한다. 그후에 도메인을 내 IP와 연결해 주면 된다. 그 후에 공유기를 사용하고 있다면, 공유기에서 80이나 ssl을 사용한다면 443 포트를 열어줘야 한다. 나 같은 경우 netis 공유기를 사용하기에 http://192.168.1.1/ 로 접근해서 고급 설정 -> 방화벽에서 80 포트를 허용해 줬다. 다음은 minikube 셋팅이다. mini..
테스트 코드를 위해 실제 코드에 영향이 가도 될까??
테스트 코드를 위해 실제 코드에 영향이 가도 될까??
2022.12.26개발을 하며, "테스트 코드를 위해 프로덕션 코드에 영향을 줘도 될까?"라는 고민이 테스트 코드를 작성하다 보니 생겼습니다. 고민해본 예시는 다음과 같습니다. Querydsl을 사용하며 Projection을 사용할 때 Setter를 만들지 않고, field 주입을 이용해 객체를 생성할 수 있습니다. 팀 내에서 field 주입만 사용하고 있기에 Getter만 생성해서 사용했습니다. 문제는 테스트 코드를 작성하며, 모든 값을 채우는 All 생성자나 Setter가 없기에 객체를 생성한 후 Reflection을 이용해서 값을 채워야 했습니다. 결국 Builder나 All 생성자가 없어 Service 계층의 테스트 코드는 Reflection이 덕지덕지 붙고 말았습니다.. 어떤 상황이 있는지 알아봤고, 본론으로 테..
Spring Boot JPA 1차 캐시 정리
Spring Boot JPA 1차 캐시 정리
2022.12.21개요 우리는 JPA를 사용하며, 어떠한 이점을 누릴 수 있는지에 대한 질문을 받는다면, 1차 캐시를 빼고 말하기 어렵습니다. "1차 캐시가 어떻게 동작하는데??"라고 질문받는다면, "영속성 콘텍스트에 보관되고, 사용하면 돼!"라고만 답하는 사람이 있을 겁니다.. (저 역시도 얼마 전까지는..) 하지만 일을 하다 보니 느끼는 것이 어떻게 사용하는 것이 아닌 왜 사용하고, 어떻게 적용 돼 사이드 이펙트가 있을 것인지에 대해서 집중하게 됐습니다. 그래서 1차 캐시가 어떻게 동작하는지에 대해서 알아보겠습니다. (1차 캐시를 날리는 @Modfiying clearAutomatically를 사용하며, 부족함을 느끼게 돼 정리하게 됐습니다.) 1차 캐시란? 우선 동작을 알아보기 전에 1차 캐시가 무엇인지 알아보겠습니다..
Springboot JPA Querydsl 동적 정렬 OrderSpecifier
Springboot JPA Querydsl 동적 정렬 OrderSpecifier
2022.12.06SQL 동적 정렬이란? 하나의 API에서 정렬 조건을 동적으로 변경해, 정렬 혹은 정렬 + 페이징을 진행하는 것을 의미합니다. 예시를 보며, 필요한 상황이 언제이며, 어떻게 해결하는지 알아가 보겠습니다. 어떤 경우에 필요할까? 우리는 Querydsl만을 통해서가 아닌 Springboot Data JPA를 통해서도 쉽게, 페이징과 정렬을 할 수 있습니다. 하지만 문제 되는 경우는 같은 API 호출임에도 불구하고, 내림 차순 or 오름 차순과 같이 동적으로 정렬이 바뀌는 경우가 존재합니다. 물론 API를 2개 만들어 호출하면 문제없습니다. 하지만 리소스, 동작이 동일한데 API를 분리하는 것은 복잡성을 증가시킬 뿐입니다. 2가지의 방법으로 해결할 수 있습니다. 테스트 셋팅 Person이라는 Entity가 존..
Spring JPA @OneToOne N+1 문제 (Fetch = Lazy)
Spring JPA @OneToOne N+1 문제 (Fetch = Lazy)
2022.11.29N+1 문제란? 어떠한 값을 얻기 위해 JPA를 이용하여 1개의 쿼리를 사용하는 것을 의도했지만, 개발자의 의도와는 다르게 N개의 쿼리가 더발생하는 문제입니다. JPA를 공부한 적이 있는 사람이라면, @xxxToOne(fetch = FetchType.EAGER)로 설정돼 있는 것들을 @xxxToOne(fetch = FetchType.LAZY)로 설정하면 된다는 것을 들어보셨을 수도 있습니다. 저 역시도 이렇게 알고 있었지만, 프로젝트를 진행하며 겪은 N+1 문제를 살펴보겠습니다. 테이블 Parent와 Child가 1:1 관계를 가졌을 때 문제가 발생하므로 해당 케이스만 살펴보겠습니다. 여기서 연관관계의 주인은 Child로 설정하겠습니다. Parent @Entity @NoArgsConstructor(acc..