전체 글 56

WinForms로 파일 탐색기 구현하기 (1)

어쩌다보니 C#을 다루는 직장으로 이직하게 되었다. 요즘 대부분의 웹/앱 개발에서는 개발자가 직접 코드 타이핑을 하는 경우는 거의 없지만 아직 게임 개발이나 SCADA 프로그램 개발쪽은 변화 속도가 많이 느린 것 같다.조만간 과제를 하나 부여받을 예정인데, 그때 AI를 최대한 사용하지 않고 프로그램을 만드는 과제를 받을 예정이다. 따라서, 오랜만에 직접 타이핑하며 코드를 따라가며 학습하는 정통적인 방식으로 돌아와봤다. 또한, C# 뿐만 아니라 개인적으로 다른 언어나 토이 프로젝트로 구현하는 코드에 대해서 가끔씩 이렇게 개발 과정 따라가기 시리즈로 올려볼 예정이다.1. Visual Studio 설치 및 프로젝트 생성우선, Visual Studio를 설치한다. C# 언어의 경우 만능 툴인 VS Code와 J..

TLS, mTLS, 그리고 클라우드 배포에서 HTTPS가 동작하는 방식

배포할 때 HTTPS는 늘 따라다니지만, 정작 그 내부에서 무슨 일이 일어나는지 깊게 들여다본 적은 별로 없었다. TLS와 mTLS 개념을 정리하면서 "그러면 내가 AWS와 Railway에 배포할 때는 비밀 키를 만든 적이 없는데, 어떻게 HTTPS가 동작했지?"라는 의문까지 풀어본 내용을 정리한다.1. TLS의 기본 — 무엇을, 왜, 어떻게1.1 TLS란TLS(Transport Layer Security)는 두 통신 주체 사이에 흐르는 데이터를 암호화하고, 상대방이 정말로 그 상대방이 맞는지 인증하기 위한 프로토콜이다. 이름은 "Transport Layer"가 들어가지만, OSI 모델 기준으로는 TCP(전송 계층) 위, 애플리케이션 계층 아래에서 동작한다. 이름은 "전송 계층을 보호한다"는 의미로 붙은..

CS/네트워크 2026.05.13

Zustand Persist 사용 시 인증 상태가 초기화되는 문제 해결하기

프로젝트에서 관리자 페이지를 구현하던 중 이상한 현상을 마주쳤다. 분명 로그인된 상태인데, 관리자 페이지에 접근하거나 새로고침을 하면 로그인 페이지로 튕겨나가는 것이다. 이 글에서는 문제의 원인과 해결 과정을 정리하고, 그 과정에서 알게 된 Hydration 개념에 대해 공유하려 한다.문제 상황현재 프로젝트에서는 Zustand의 persist 미들웨어를 사용해 인증 정보를 localStorage에 저장하고 있다. 로그인 후 관리자 페이지(/admin)에 접근하면 AdminGuard 컴포넌트가 인증 여부를 체크하는 구조다.그런데 이미 로그인된 상태에서 관리자 페이지로 직접 접근하거나 새로고침을 하면, 매번 로그인 페이지로 리다이렉트되는 문제가 발생했다.콘솔 로그를 찍어보니 원인이 보였다.[AdminGuar..

외부 API 키워드 검색 시 공백 인코딩 이슈

지난번과 마찬가지로 개인적으로 구현 중인 사이트의 작업 도중 발생한 이슈를 정리하려 한다. 이번 작업은 스트리머 85명의 데이터를 핸들링해야 하기 때문에 기존 API처럼 관리자가 하나씩 다루는 게 아닌 배열 형태로 제공하면 서버에서 순차적으로 처리하는 벌크 작업을 만들다 마주한 트러블슈팅이다.문제 상황 스트리머 벌크 등록 기능을 구현하던 중, 일부 스트리머만 검색되지 않는 현상이 발생했다.// 치지직 채널 검색 API 호출public ChzzkApiResponses.ChannelSearchResponse searchChannels(String keyword) { String encodedKeyword = URLEncoder.encode(keyword, StandardCharsets.UTF_8); ..

JPA LazyInitializationException - "no session" 에러 해결기

블로그를 작성하기에 앞서 아래 내용은 필자의 직업이 아닌 개인적인 취미로 만드는 프로젝트에서 겪은 경험임을 먼저 알려드립니다.문제 상황스케줄러에서 VOD를 수집하는 로직이 있었는데, 갑자기 모든 스트리머에 대해 다음 에러가 발생했다.VOD 수집 실패: eventId=6, streamerId=112, error=Could not initialize proxy - no session문제 코드@Scheduled(cron = "0 10 * * * *", zone = "Asia/Seoul")public void collectPendingVods() { // 1. 참여자 목록 조회 List participations = participationRepository.findByEvent_Sta..

Next.js Link의 Prefetch - 왜 클릭하지 않았는데 요청이 발생할까?

🤔 이상한 404 에러의 등장프로젝트 개발 중, 이벤트 목록 페이지에서 콘솔을 확인하다가 이상한 현상을 발견했다.GET https://www.moavod.com/events/4 404 (Not Found)GET https://www.moavod.com/events/4?_rsc=1r34m 404 (Not Found) 문제는 아직 이벤트 상세 페이지를 만들지도 않았고, 사용자가 링크를 클릭하지도 않았다는 것이다. 그런데 왜 /events/4 경로로 요청이 발생하는 걸까?백엔드 API 에서는 정상적으로 데이터를 받아오고 있었고, 이 404 에러는 프론트엔드 자체 경로에서 발생하는 것이었다."혹시 내 코드에 버그가 있나?" 싶어 확인해봤지만, 단순히 컴포넌트만 있을 뿐이었다.이 현상은 Next.js의 Pr..

JPA N+1 문제(추가 쿼리 497번 -> 1번)

오랜만에 블로그로 돌아왔다. 최근에는 한 스타트업의 백엔드 개발자로 합류하게 되었는데, 운이 좋게도 JPA라는 ORM까지 다룰 기회가 생겼다. 그리고 JPA의 가장 대표적인 문제인 N+1 문제를 마주하게 되었다.참고로, 회사가 소유한 코드와 도메인 구조를 온전히 공유할 수 없기에 적당히 비슷한 예시를 들어 설명하겠다.문제 현상QueryDSL로 주문 목록을 조회하는 API를 개발하면서 N+1 문제를 겪었다.엔티티 구조는 다음과 같았다.@Entity@Getter@ToString(onlyExplicitlyIncluded = true)@EqualsAndHashCode(onlyExplicitlyIncluded = true)public class Order { @Id @GeneratedValue(str..

Value Object란?

최근에 프로젝트 요구사항을 정리하면서 한 팀원이 VO 도입에 대한 의견을 냈다. 기존에 잘못 들어있던 지식 때문에 다시 알아보았는데, 얻어간 부분이 많아 블로그에 정리한다.또한, AI 중에 클로드 AI가 글 작성이 좋다라는 소문을 들어 한번 사용해봤다. 아래 정리 내용 대부분은 클로드를 이용해 정리한 내용인 점도 참고바란다.VO는 뭐고 DTO는 뭐죠?필자가 처음에 지식이 잘못 잡혀있던 부분이 이 부분이었다. 처음에는 DTO의 대체 = VO 라고 생각했기에 DTO와의 장단점을 비교하는 방향으로 자료를 찾아봤다.(왜 이렇게 지식이 잡혀있었을까...)결론부터 말하면 VO와 DTO는 사용되는 곳도 사용하는 이유도 다르다!도메인 : 말 그대로 Entity, DB 모델의 핵심DTO(Data Transfer Obje..

Spring Security 권한 설정 이슈

작은 프로젝트를 하나 진행하면서 겪은 트러블슈팅이 있다. 이를 정리하고자 한다.문제 현상우선, 현상이 발생한 도메인은 리뷰이다. 인터넷 서점을 만드는 프로젝트였고 각 도서의 리뷰 목록을 불러오는 GET 요청과 구매한 도서의 리뷰를 작성하는 POST 요청의 API PATH는 다음과 같았다.GET : /api/v1/books/{bookId}POST : /api/v1/books/{bookId}교보문고, yes24 등 인터넷 서점에서는 비로그인 사용자도 각 도서의 상세정보와 리뷰를 확인할 수는 있게 구현되어 있다. 그래서 처음에 SecurityConfig의 설정권한을 다음과 같이 설정했다.// Whitelistpublic interface Whitelist { String[] PATHS = { ..

Tailwind CSS 4버전 이후의 커스텀 컬러, 폰트 설정방법

며칠 전에 작은 팀 프로젝트가 하나 끝났다. 2주라는 짧은 시간동안 진행된 프로젝트라 트러블슈팅을 정리하지 못해 마무리가 된 지금 기억을 더듬어 하나씩 정리하려 한다. 우선, 개발 1일차에 맞은 첫 번재 트러블슈팅은 FE 프로젝트의 커스텀 컬러와 폰트를 지정하는 일이었다.사실 검색만하면 쉽게 할거라 생각했는데, 예상하지 못한 변수가 있었다.FE 프로젝트 환경일단 우리 팀의 FE 프로젝트 환경은 다음과 같다.Next.js - 15.3.4 버전Tailwind CSS - 4버전다른 검색결과와의 차이점구글이나 GPT 검색을 통해 폰트와 컬러 설정방식을 검색하면 아마 tailwind.config.ts 파일의 설정 방법을 소개해줄 것이다.다만, Tailind CSS의 4버전 이전과 이후에서는 설정하는 방식이 달라져..