[Java] gc에서 사용하지 않는 객체를 어떻게 구분하는가
·
Java/Java Concept
개요오늘은 Java의 핵심 개념 중 하나인 Garbage Collector(GC)가 사용하지 않는 객체를 어떤 기준으로 구분하는지 정리해보려고 합니다.그동안은 GC를 단순히 "더 이상 필요 없는 객체를 자동으로 제거해 주는 기능" 정도로만 이해하고 있었지만, 한 스타트업의 기술면접을 계기로 객체의 생존 여부를 판단하는 방식과 Reachability 개념을 좀 더 깊이 있게 살펴보게 되었습니다.이번 글에서는 GC가 불필요한 객체를 어떻게 구분하는지와 자바의 참조 타입을 기반으로 동작 과정을 하나씩 정리해 보겠습니다. 정리 내용은 내용이 너무 유익해서 해당 링크를 전적으로 참고하였습니다. GC ReachabilityGC(Garbage Collection)에서 사용하지 않는 객체를 구분하는 기준은 핵심적으..
[CS] float 타입 변수의 연산은 왜 부정확할까
·
CS
개요오늘은 업무 중에 직접 겪었던 문제를 계기로, 그 과정에서 생긴 궁금증을 조금 더 깊이 파헤쳐보려고 합니다. 업무 시스템에서 값을 계산하는 과정에서 float 타입 변수들끼리 연산을 수행했는데, 예상과 달리 계산 결과의 정확도가 깨지게 되었습니다. 디버깅을 진행하면서 실제 연산 결과가 기대한 값과 다르다는 것을 확인할 수 있었습니다. 해당 문제는 다음과 같은 단순한 계산 과정에서 발생했습니다.출장비 = 식비 + 숙박비세 변수(출장비, 식비, 숙박비) 모두 float 타입이었고, 단순한 덧셈 연산이었음에도 불구하고 결과 값에 오차가 발생했습니다. 컴퓨터는 숫자를 포함한 모든 데이터를 이진법(2진수)으로 표현하고 처리합니다. 하지만 이진법으로는 모든 실수를 정확하게 표현할 수 없습니다. 특히 10진수 소..
[Spring] Mybatis Framework에 대해서 알아보자
·
Java/Spring
개요MyBatis는 JPA처럼 Hibernate와 같은 ORM 구현체가 SQL을 자동으로 생성해 주는 방식이 아니라, 개발자가 직접 XML 파일에 SQL을 작성하고 그 결과를 Java 객체에 매핑하는 SQL Mapper 프레임워크입니다. 이러한 특성 덕분에 JPA에 비해 복잡한 SQL을 세밀하게 제어할 수 있다는 장점이 있으며, 도메인 로직이나 쿼리 튜닝이 중요한 환경에서 이점을 누릴 수 있습니다. 이 글에서는 MyBatis의 기본 개념과 주요 구성 컴포넌트를 살펴보고, 컴포넌트 기반으로 동작과정을 순수 MyBatis와 Mybatis-Spring과 비교해서 보겠습니다. Mybatis개발자가 직접 SQL을 작성하고, 해당 SQL 결과를 자바 객체로 매핑시켜주는 Persistence Framework입니다...
2025년 12월 회고록
·
일상/회고록
원래 첫 회사 입사 후 매달 회고록을 작성하려고 했지만 아쉽게도 실천하지 못했네요. 돌이켜 봤을 때, 현재 회사에서 얻어간 것들이 너무 많았으며 정말 가치 있는 시간들이었던 것 같습니다. 비록 블로그에 포스팅하지는 않았지만, 개인적으로는 Notion에 꾸준히 정리해 왔고, 이 기록들이 앞으로도 분명 도움이 될 지식이라고 생각하고 있습니다. 그래서 이번에는 첫 회사에서 보낸 2년 반의 시간, 그리고 그 경험을 바탕으로 이직에 성공하기까지의 과정을 조금 더 자세히 정리해 회고록으로 남겨보려 합니다. 저는 보안 설루션 회사에서 웹 풀스택 개발 업무를 담당해 왔습니다. 처음에는 백엔드 개발을 중심으로 커리어를 쌓고 싶었지만, 풀스택 업무를 맡게 되면서 생각보다 많은 장점을 경험할 수 있었습니다. 웹 개발에 있어..
[Linux] OpenStack VM에서 wget 명령어로 local 서버 파일 다운로드
·
Linux
개요OpenStack 환경에서 배포나 테스트 작업을 위해 local 환경에서 패키징한 WAR 파일을 VM으로 옮겨야 했습니다. 보통은 scp 명령을 떠올리지만, 실제로는 SSH 공개키 인증 문제, 키페어 불일치, Security Group 설정 문제 등이 겹치면 생각보다 번거롭습니다. 기존에는 pem key를 이용해서 로컬 서버에서 원격 서버로 파일을 전송하려고 했지만, 권한 문제로 인해 파일 전송에 실패하였습니다.PS C:\> scp -i .\br2_rocky9_zt_1104.pem .\project.war rocky@192.168.239.190:/projectBad permissions. Try removing permissions for user: BUILTIN\\Users (S-1-5-32-545..
[Spring] SSL/TLS certificate 무중단 hot-reload 구현 과정
·
Java/Spring
개요사내 웹 솔루션은 HTTPS 요청 처리 시 SSL 인증서를 기반으로 동작합니다. 따라서 인증서의 유효기간이 만료되면, 각 사이트 담당 엔지니어가 직접 인증서를 갱신하는 절차를 수행해야 합니다. 이 과정에서 인증서가 잘못 적용되거나 구성 오류가 발생할 경우, 시스템 전체 장애로 이어질 수 있는 위험이 존재합니다. 이를 예방하기 위해 인증서를 자동으로 갱신하고, 애플리케이션 재시작 없이 즉시 반영(hot-swap)할 수 있는 기능을 도입했습니다. 일반적으로 hot-swap은 시스템의 전원을 끄지 않고 구성 요소를 교체하여 계속 사용할 수 있는 기능을 의미합니다. 웹 애플리케이션 관점에서는 애플리케이션을 중단하지 않고 구성 요소를 변경하고 즉시 반영할 수 있는 기능을 의미합니다. Spring Boot 3...
[백예린 단독 콘서트] <Flash and Core> In Inspire Arena 후기
·
일상/리뷰
2025/10/26일에 오랜만에 열린 백예린 단독 콘서트를 다녀왔습니다. (3번째) 친구가 표를 구해줘서 함께 가게 되었는데, 평소 즐겨 듣던 백예린 음악이 꽤나 있어서 기대를 품고 갔습니다. 음색 좋은 가수의 노래를 라이브로 들으면 어떤 느낌일지 감이 안 잡혔습니다. 장소는 저희 집에서 조금 멀리 있는 인스파이어 아레나에서 진행되었습니다. https://map.naver.com/p/search/%EC%9D%B8%EC%8A%A4%ED%8C%8C%EC%9D%B4%EC%96%B4%20%EC%95%84%EB%A0%88%EB%82%98/place/1997613956?placePath=%3Fentry%3Dpll%26from%3Dnx%26fromNxList%3Dtrue&placeSearchOption=entry%..
[CS] Socket Communication
·
CS
오늘은 네트워크 프로그래밍에서 중요한 소켓 통신(Socket Communication)에 대해 알아보겠습니다. 먼저 소켓 통신이 무엇인지 간단히 살펴본 뒤, 네트워크에서 통신이 성립되는 과정인 TCP 3-way Handshake 절차를 설명드리겠습니다. 이어서 소켓 통신에서 Client와 Server의 역할과 흐름이 어떻게 구분되는지 살펴본 후, Java에서 이를 구현하는 예제를 통해 구체적인 통신 과정을 정리해 보겠습니다.소켓 통신 (Socket Communication)네트워크에서 두 컴퓨터 간의 실시간 양방향 통신을 제공하는 기술양방향 통신: 상호 간의 데이터를 송수신하는 기술두 컴퓨터 간에 IP주소 + 포트번호의 조합으로 네트워크 간의 연결을 수행하며 수신자는 데이터를 요청하면 서버에서 응답을 제..
[CS] Concurrency, Parallelism
·
CS
동시성 (Concurrency)Task들이 빠르게 전환되면서 실행되어 동시에 실행되는 것처럼 보이는 것싱글 코어(cpu 내에서 실제로 연산 및 명 실행을 담당하는 장치)에서는 여러 작업이 동시적으로 실행되며 Task 간 Context Switch가 발생하면서 여러 작업들을 동시에 실행하는 것처럼 보입니다.Context Switch: CPU/코어에서 실행 중이던 프로세스/스레드가 다른 프로세스/스레드로 교체되는 현상유휴 시간(idle time)을 최소화하여 CPU 활용도를 높이는 것이 목표입니다. (유후 시간: 컴퓨터가 작동 가능한대도 작업을 하지 않는 시간)두 개 이상의 작업이 싱글 코어 or 다중 코어 CPU의 동일한 코어에서 실행되는 경우, 동시에 동일한 리소스에 접근할 수 있습니다.데이터 읽기 작업..
[Effective Java] 10장. 예외
·
Java/Effective Java
[item-69] 예외는 진짜 예외 상황에만 사용하라예외는 반드시 예외 상황에서만 사용하며 일상적인 제어 흐름용으로 사용해서는 안됩니다.잘 설계된 API라면 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없어야 합니다.이를 위해서 상태 검사 메서드를 제공하거나 옵셔널 또는 특정 값을 반환하도록 하면 됩니다.try-catch 블록 안에 들어가면 JVM이 적용할 수 있는 최적화 범위가 제한됩니다.잘못된 예외 사용 예시try { int i = 0; while(true) range[i++].climb();} catch (ArrayIndexOutOfBoundsException e) {}표준적인 관용구 // 표준적인 관용구로 작성한 예for (Mountain m : range) m...