👩🏻‍💻 GCP to OCI 이전 구축기 및 504 Gateway Time-out 해결기 (feat. Swap Memory)
·
🖥️ ɪɴғʀᴀ
INTRO여느 때와 다름없는 평화로운 금요일결혼식을 한다고 2년 가까이 길었던 머리를단발로 싹-둑 자르고 파마를 하러 미용실에 방문했다.꾸벅꾸벅 졸고 있던 찰나, 휴대폰이 '징- 징-' 울렸다.무심코 화면을 켰는데 순간 내 눈을 의심했다.구글 클라우드 ~~~ 52,150원 결제 완료 카드사 결제 알림이 떠 있었다. "대체 내가 뭘 돌렸길래 5만 원이나 결제가 된 거지?"머리에 약을 바른 채 구글 클라우드 콘솔 앱을 켜고 한참을 뒤적거리며 찾아봤다.네트워크 트래픽 과금인가? 무료 티어 기준을 초과한 사용량이 무엇 때문인지 분명치 않았다.안 그래도 기존에 사용하던 GCP 무료 티어 서버는 너무 버벅거리고접근할 때마다 느려서 개발하고 테스트하기가 여간 불편한 게 아니었다.이 요금 과금 문자를 시작으로 평소 자..
🌱 인프런(인프랩) 방문기 | 공약은 반드시 지킨다 (feat. 카파도키아 파우치)
·
☃︎ 𝐃𝐢𝐚𝐫𝐲
공약의 시작2월 인프런 챌린지가 한창 진행 중이던 어느 날나는 생각나는 데로 공약을 걸었다."만약 제가 상금을 받게 되면, 3월 신혼여행에서 도라님 선물 사올게요." 챌린지를 열심히 하다 보면 그런 기분이 드는 순간이 있다.이걸 해낼 수 있을 것 같다는 근거 없는 자신감.그래서 던진 공약이었는데, 상금도 받고 꿈도 꾸지 못한 MVP가 되어버렸다.MVP가 되면 인프런 수강권 6개월권을 받는데정말 받아버렸다 !!!!!!!!!기쁘기도 했지만 솔직히 공약이 더 머릿속에 남았다.뭘 사다드려야 하지?!🥹 카파도키아에서 파우치를 샀다신혼여행지는 튀르키예였다. 인천 ➡️ 이스탄불 ➡️ 카파도키아 ➡️ 이스탄불 ➡️ 인천열기구 타고 하늘 뜨는 곳, 드라마 세트장 같은 절벽 마을들.정신없이 다니면서도 머..
👩🏻‍💻 실무 : Referer로 망분리를 시도했다가 배운 것들 (feat. Stateless vs Stateful)
·
🖥️ ɪɴғʀᴀ
⟡ 인트로OKTA로 인증 방식을 전환하면서 기존 SSO 인증서가 담당하던 내/외부망 구분 기능이 사라졌다.처음에는 HTTP Referer 헤더를 이용해 내부망 사용자를 판별하려 했으나,즐겨찾기 접속·OKTA 리다이렉트·forward 등 실제 운영 환경에서 Referer가 소실되는 경우가 너무 많아정상 내부망 사용자까지 차단되는 문제가 발생했다.결국 Stateless한 Referer를 버리고, 서버가 상태를 기억하는 세션 플래그(Session Flag) 방식으로 전환하여 문제를 해결했다. 이 글은 그 과정에서 Referer가 무엇이고 왜 접근 제어의 신뢰 기반이 될 수 없는지를 정리한 기록이다. ⟡ 개발환경AS-IS TO-BESSO PKI 인증서 기반 내/외부 구분OKTA SAML 인증 기반인증서..
💻 IP:8080은 이제 그만! 내 Spring Boot 프로젝트에 도메인과 HTTPS(무료) 자물쇠 달아주기🔒
·
🖥️ ɪɴғʀᴀ
🤔 배포는 했는데.. 뭔가 아쉽지 않나요?열심히 만든 Spring Boot 애플리케이션을 AWS나 GCP 같은 클라우드 VM에 배포하고 나면, 이런 주소를 받게 됩니다.👉 http://123.45.67.89:8080동작은 잘 하지만, 뭔가 진짜 서비스 같은 느낌이 안 듭니다. IP 주소 외우기도 힘들고, 접속하면 브라우저에 '주의 요함(안전하지 않음)'이라는 무시무시한 빨간 글씨가 뜨죠.오늘은 Nginx(리버스 프록시)와 Let's Encrypt(무료 SSL 인증서)를 이용해 내 프로젝트에 멋진 커스텀 도메인을 연결하고, 안전한 HTTPS 초록색 자물쇠를 다는 방법을 정리해보겠습니다! 🚀 🤖 전체 아키텍처: 어떻게 연결될까?우리가 구현할 통신 흐름은 다음과 같습니다.[사용자]..
👩🏻‍💻 Springframwork 실무 : JSP에서 JavaScript로 데이터 토스 ! ObjectMapper로 해결한 이야기
·
🌱 𝐅𝐫𝐚𝐦𝐞𝐰𝐨𝐫𝐤
배경 및 문제 정의Spring MVC 프로젝트에서 JSP 화면의 JavaScript에 서버 데이터를 전달해야 하는 상황이 생겼다. Controller에서 Model에 Java 객체를 담아 넘겼는데, JavaScript에서 이 데이터를 인식하지 못하는 문제가 발생했다.Java 객체를 그대로 Model에 담으면 JavaScript는 [MemberDto@abc123] 같은 toString() 결과만 볼 수 있었고,이를 JSON 형태로 변환해야 정상적으로 사용할 수 있다는 걸 알게 됐다.결국 Jackson 라이브러리의 ObjectMapper를 활용해 Java 객체를 JSON 문자열로 변환하는 방식으로 해결했다. 최종 해결 요약 Jackson 라이브러리의 ObjectMapper.writeVa..
Inflearn ✅ 내가 하는 공부 로드맵 (feat. 2년 차 주니어가 만든 두 가지 학습 로드맵 이야기)
·
☃︎ 𝐃𝐢𝐚𝐫𝐲
왜 로드맵을 두 개나 만들었나작년 말부터 다시 공부를 시작하면서 고민이 하나 생겼다.강의만 들을까, 책을 읽을까. 둘 다 장단점이 있었다.강의는 개념을 빠르게 이해할 수 있고 코드를 직접 보며 따라 칠 수 있다는 장점이 있다.특히 김영한 선생님 강의는 실습 위주라 손에 익히기 좋다.하지만 깊이 있는 내용은 책만한 게 없더라.특히 Real MySQL이나 이펙티브 자바 같은 책은 실무에서 막힐 때마다 찾아보는 레퍼런스가 되었다.그래서 두 개를 만들었다.강의 중심 로드맵: 빠르게 실무 감각을 익히고 싶을 때책+강의 로드맵: 제대로 깊게 공부하고 싶을 때 강의 로드맵 (21개 코스)강의 로드맵 보러가기이건 순수하게 강의만으로 구성했다.인프런에서 김영한 선생님 강의를 중심으로 Java 기초부터 Spring ..
👩🏻‍💻 Springframwork 실무 : 레거시 API 성능 개선기(feat. JPA) / N+1 문제와의 3라운드 사투🥊
·
🌱 𝐅𝐫𝐚𝐦𝐞𝐰𝐨𝐫𝐤
⟡ 배경·문제 정의회사에 입사하고 3개월쯤 지났을 때, 선배가 "이 API 좀 느린데 확인해볼래?"라며게시판 조회 API 하나를 던져주었다.로컬에서 테스트해보니 응답시간이 3초. 데이터가 겨우 100건인데 말이다.쿼리 로그를 켜보니 SELECT 문이 101번 실행되고 있었다.전형적인 N+1 문제였다.fetch join을 적용하면 되겠지 싶었지만, 현실은 그렇게 호락호락하지 않았다.결국 fetch join → @EntityGraph → @BatchSize + DTO 변환까지3번의 시도 끝에 응답시간을 300ms로 줄일 수 있었다. ⟡ 최종 해결 요약최종적으로 선택한 방식은 다음과 같다:Post 엔티티: @BatchSize(size = 100) 적용Service 계층: DTO 변환으로 엔티티 ..
👩🏻‍💻 Springframwork Mig 기록 : 레거시 프로젝트에 단위 테스트 도입하기(feat.실패하고 배운 이야기)
·
🌱 𝐅𝐫𝐚𝐦𝐞𝐰𝐨𝐫𝐤
2026년 새해가 밝았다.오늘도 난 퇴근 후 공부를 하고 난뒤, 업무를 하면서 겪었던 내용을 정리해 포스팅을 한다😳누구에겐 오늘이 뜻깊고 한해를 마무리하는 날 이지만, 나에겐 그리 특별하지 않다. 그냥 매일 똑같은 하루 같은 느낌이랄까.그래도 이 글을 읽는 분들은 행복한 날이 되길 바래본다❤️다들 새해 복 많이 받으세요🫶 ⟡ 인트로신입으로 입사해 처음 맡은 고도화 프로젝트에서 가장 큰 불안 요소는 테스트 코드가 전혀 없는 레거시 시스템이었다.코드를 수정할 때마다 전체 애플리케이션을 실행해서 수동으로 확인해야 했고, 사이드 이펙트를 발견하는 건 운에 맡겨야 했다.단위 테스트를 도입하려고 했지만 처음에는 방법을 몰라서 여러 번 실패했다.전체 Spring 컨텍스트를 로딩하는 느린 테스트,..
👩🏻‍💻 Springframwork Mig 기록 : Spring Boot에서 Jasypt 자동 암복호화가 동작하는 원리
·
🌱 𝐅𝐫𝐚𝐦𝐞𝐰𝐨𝐫𝐤
⟡ 개요회사에서 담당하고 있는 서비스의 마이그레이션 작업을 높은 완성도로 마무리하기 위한 목적과,퇴근 후 별도로 진행하는 학습 내용들을 스스로 정리하고 축적하기 위해 작성하는 기록입니다.초보 개발자 관점에서 정리하는 흐름이지만, 기술적 오류나 더 나은 방향이 있다면언제든지 피드백을 제안해 주시면 적극 반영하겠습니다.🫶 ⟡ 설정 파일 암호화는 왜 필요한가 ? 프로젝트를 진행하다 보면 application.yml에 DB 비밀번호나 API 키 같은 민감 정보를 작성하게 된다.문제는 이 파일을 Git에 커밋하는 순간, 저장소에 접근할 수 있는 모든 사람이 운영 환경의 접속 정보를 볼 수 있다는 점이다.Private 저장소라 해도 퇴사자, 협력사 직원, 내부 개발자 등 접근 권한을 가진 사람이 많으면..
👩🏻‍💻 Springframwork Mig 기록 : @RequiredArgsConstructor와 의존성 주입, 언제 안전하고 언제 위험한가
·
🌱 𝐅𝐫𝐚𝐦𝐞𝐰𝐨𝐫𝐤
⟡ 주제 정의 Spring 프로젝트에서 @RequiredArgsConstructor를 사용한 생성자 주입은 일반적인 패턴이다.하지만 이 방식이 모든 상황에서 안전한 것은 아니다.특히 HttpServletRequest 같은 request-scoped 빈을 주입할 때는 계층별로 다른 결과가 나타난다.이 글에서는 Spring 공식 문서를 기반으로 실무에서 마주치는 케이스들을 분석한다. ⟡ Spring 공식 문서의 의존성 주입 방식 Spring은 세 가지 의존성 주입 방식을 제공한다.// 1. 생성자 주입 (Constructor Injection)private final UserRepository userRepository;// 2. 필드 주입 (Field Injection)@Autowire..
👩🏻‍💻 Springframwork Mig 기록 : 폐쇄망 환경에서 Gradle 빌드 설정 🪏삽 질기
·
🌱 𝐅𝐫𝐚𝐦𝐞𝐰𝐨𝐫𝐤
⟡ 인트로신입으로 입사해 처음 맡은 고도화 프로젝트에서 폐쇄망 환경을 접했다.일반적인 개발 환경과 달리 외부 인터넷 연결이 차단된 상태에서 Gradle 빌드를 설정해야 했고,처음에는 단순히 설정만 바꾸면 될 줄 알았으나 의존성 관리의 복잡성을 직접 체감했음😳수동 다운로드부터 캐시 복사까지 여러 시행착오를 거쳐 최종적으로 로컬 Maven 저장소 기반의 안정적인 빌드 환경을 구축했는데이 글은 그 과정에서 겪은 실패와 해결 방법을 기록한 것이다. . ⟡ 개발환경AS-ISTO-BEJDK 1.7JDK 17Maven 2.9Gradle 8.8Spring Framework 4.2.5 (XML 기반)Spring Boot 3.3.2MyBatis 3.3.0MyBatis 3.5.13Tomcat 7E..
👩🏻‍💻 Springframwork Mig 기록 : 레거시 코드 고도화 작업 계획
·
🌱 𝐅𝐫𝐚𝐦𝐞𝐰𝐨𝐫𝐤
⟡ 개요 회사에서 담당하고 있는 서비스의 마이그레이션 작업을 높은 완성도로 마무리하기 위한 목적과,퇴근 후 별도로 진행하는 학습 내용들을 스스로 정리하고 축적하기 위해 작성하는 기록입니다.초보 개발자 관점에서 정리하는 흐름이지만, 기술적 오류나 더 나은 방향이 있다면언제든지 피드백을 제안해 주시면 적극 반영하겠습니다.🫶 ⟡ 개발환경AS-ISTO-BEJDK 1.7JDK 17Maven 2.9Gradle 8.8Spring Framework 4.2.5 (XML 기반)Spring Boot 3.3.2MyBatis 3.3.0MyBatis 3.5.13Tomcat 7Embedded TomcatMariaDBJSP, EL, JSTL 기반 SSR(Server Side Rendering)HTML, CSS, J..
김춘덕⸝ဗီူ⸜
'분류 전체보기' 카테고리의 글 목록