드디어 쓰는 1일 차... 시작은 이러했다. 아직 연락하는 군대 동기가 있는데 취업도 했겠다, 한번 만나야겠다 싶어서 연락하니 제주도란다. 참고로 연락할 때마다 장소가 서울, 부산, 진천, 인천이었고... 제주도까지는 생각을 못해서 많이 당황했다. 제주공항 근처 게스트하우스에서 일하면서 한 달 살기를 하고 있다고 했다.이 친구도 볼 겸, 혼자 제주도 여행을 1박 2일로 다녀오기로 했다.원래 2박 3일로 잡았고 복귀날 다음날이 출근날이었다가 하루는 쉬려고 줄였는데 정말 잘한 결정이었다. 그 하루동안 하루 종일 누워있었다 ㅋㅋ 6/30 (월)주말동안 본가에 내려가서 가족들이랑 시간을 보내고, 근처에 있는 여수공항으로 아침 9시 반 비행기를 탔다.평일 아침, 그것도 여수공항이라 사람이 거의 없었다. 탑승 ..
전체 글
안녕하세요. PS풀이, 개발일지 및 일기, 소소한 이야기를 적어가는 윤재 입니다.취업했다. 그래서 첫 출근 전까지 하루 빼고 매일 약속 잡고 놀러 다녔다..... ㅋㅋ 그러다가 1박 2일로 제주도나 다녀올까 싶어서 혼자 월화 다녀왔다. 뭔가 일본은 너무 멀고 비싸고, 국내는 여행 기분이 안 나서 그 사이 어딘가로 제주도로 결정했다 ㅋㅋㅋ 마침 친구가 제주 한 달 살기를 하고 있어서 겸사겸사 밥 한 번 먹기로 했다. 남서쪽인 안덕/대정쪽 위주 + 제주시 공항 주변을 놀다가 왔다. 총 경비는 27만 원 들었다.항공권84,100숙박비 (1박)26,970관광패스 (제주올패스 24시간권)11,900관광85,500식비40,400교통16,950총액265,820 항공권은 본가 내려가서 가족들과 친척들, 고향친구들을 보고 제주로 넘어간 거라 여수공항->제주공항, 제주공항->김포공항으로 다녀왔다..
요번 거는 간단한거.. 근데 뭐가 문제인지 모르고 좀 헤맸다. 원래 알고리즘 풀 때 리스트랑 배열을 같이 쓰는 것을 안 좋아하는데, 오늘은 무슨 바람이 불었는지 이렇게 풀고 싶었다. public class Main { public static void main(String[] args) { List[] graph = new ArrayList[3]; Arrays.fill(graph, new ArrayList()); for (int i = 0; i 이런 식으로 List[] 로 이차원 배?열을 만들었다. 그리고 Arrays.fill로 각 배열 요소에 ArrayList를 넣어주었다. 그리고 (원래는 입력 받아 넣겠지만 패스하고) 반복문으로 각 인덱스에..
문제Spring Kafka를 이용해서 아웃박스 패턴을 간단히 만들어보고 있었다. 도커로 카프카를 띄우고, 프로듀서가 메시지를 잘 전송하는 것을 확인했는데 컨슈머가 브로커와 연결을 못하고 있었다. 상황도커 컴포즈로 카프카 실행하기services: kafka: image: bitnami/kafka:3.7.1 container_name: kafka ports: - "19092:19092" environment: - KAFKA_KRAFT_CLUSTER_ID=A616ADF4-FA94-440F-BE52-CC89ED7EC507 - KAFKA_CFG_NODE_ID=0 - KAFKA_CFG_PROCESS_ROLES=controller,broker - ..
요약@WithMockUser는 기본적인 인증만 제공한다. 하지만 우리는 도메인에 맞는 커스텀 UserDetails를 사용하는 상황이고, 이럴 경우 @WithMockUser만으로는 인증 객체의 테스트가 어렵다. 이 글에서는 그런 상황에서 커스텀 인증 어노테이션을 만들어 중복 없이 테스트하는 방법을 정리한다. 문제 @RestController@RequestMapping("/users")@RequiredArgsConstructorpublic class UserController { private final UserService userService; @GetMapping public UserRes getUser(@AuthenticationPrincipal UserDetails userDetai..
요약기존 구글 번역 기반의 느리고 문단이 깨지는 방식을 next-intl 도입으로 렌더링 평균 2.34초 → 0.71초로 70% 개선한 적용하였다. 문제 인턴으로 입사한 직후, 대표님으로부터 받은 첫 업무는 서비스 내 영문 페이지의 성능 개선이었다. 기존에는 별도의 영문 페이지가 존재하지 않았고, 사용자가 전환 버튼을 누르면 국문 페이지에 구글 번역 스크립트를 삽입하여 클라이언트에서 전체 번역을 수행하는 방식이었다. 이 방식은 국문 페이지가 먼저 렌더링된 뒤, 번역 스크립트가 로드되고 번역 요청이 수행된 후에야 화면이 바뀌는 구조라, 사용자 입장에서는 약 2초간 한글 화면을 계속 보게 되어 이질감을 느낄 수 있었다. 또한 번역 도중 줄바꿈이 깨지거나, 마우스 호버 시 구글 번역 UI가 노출되는 등의 문..
요약PNG 형식의 퍼블릭 이미지를 WebP 확장자로 변경하여 용량 95% 절감 (평균 2.46MB → 128KB, 총 29.53MB → 1.54MB) 문제 1 : public 이미지의 용량 비대 기존의 public 디렉터리에 있던 이미지들은 모두 PNG 확장자였고 기본적으로 MB 단위라서 불러오는데 체감 시간이 오래 걸렸다. 특히 가장 큰 이미지의 경우 11MB나 됐는데, 504 Gateway Timeout 에러가 발생했다. 이미지 로딩이 너무 오래 걸려서 타임아웃이 난거다. 물론 Next.js의 Image 컴포넌트가 브라우저 호환여부에 따라 webp로 변환해주기는 하나, 원본의 용량 자체가 커서 다소 불러오는데 시간이 걸렸다. 해결 1 : WebP 변환하여 용량 절감WebP 란?WebP는 구글이 2..
요약기존의 매 페이지마다 인증 처리를 하던 방식에서 Axios interceptor로 요청 전후를 공통 관심사로 묶어서 총 7페이지에서 순 141줄을 절감했다. 상황인증이 필요한 페이지에서 등록/수정/삭제 요청을 보낼 때마다 매 페이지에서 인증 처리를 구현하고 있었다. 해결Axios interceptor 도입하여 반복되는 인증 로직을 공통 관심사로 묶어 유지보수성과 일관성을 확보했다. Axios 란?Axios는 브라우저와 Node.js를 위한 Promise 기반 HTTP 클라이언트이다. 그러니까 브라우저든 Node.js든 동일하게 사용할 수 있는 웹 요청 라이브러리다. Axios Instance 란?Axios instance는 공통된 설정(예: baseURL, 헤더 등)을 사전에 정의해 재사용할 ..
요약SWR이라는 데이터 패치 라이브러리를 도입하여 외부에서 데이터를 불러올 때 로딩, 에러, 데이터를 단순하게 관리하고, 7페이지에서 총 순 93줄을 줄였다. 상황인턴으로 간 회사에서 코드를 보니 매 페이지마다 외부 요청 페이지에서 요청, 로딩, 에러를 일일이 useState, fetch로 구현하고 있었다. 해결SWR 라이브러리를 도입하였다. SWR란?SWR은 데이터 패치 리액트 훅이다. Stale-While-Revalidate이라는 HTTP 캐시 무효 전략을 기반으로 만들어진 라이브러리로, Stale-While-Revalidate은 우선 캐시된 데이터를 반환하면서 데이터를 요청하고, 응답받으면 이를 최신화하는 전략이다. import useSWR from 'swr'const fetcher = (url:..