본문 바로가기

전체 글

(78)
좋은 개발자란 무엇인가(좋은 문제정의는 어떻게 하는가)? 좋은 개발자란?흔히 좋은 개발자라고 하면 다음과 같은 특성을 떠올리기 쉽습니다.DB 설계를 잘하는 개발자기술에 대해 깊이 이해하는 개발자클린 코드를 작성하는 개발자개발 속도가 빠른 개발자테스트 코드와 모니터링을 꼼꼼히 챙기는 개발자앞으로 5년 후, AI가 지금의 개발 업무 대부분을 대신한다고 생각해봅시다.DB 설계, 클린 코드, 테스트 코드 작성, 모니터링 이 모든 건 이미 AI가 여러 번의 질문만으로 현재도 해결할 수 있습니다.그렇다면 AI로 대체되지 않는 개발자의 역량은 무엇일까요?개발자의 본질에 다가가서, 좋은 개발자란 '좋은 문제 정의를 하는 개발자' 라고 생각합니다. 문제 정의란?해결 방법을 찾는 문제가 있습니다.특정 조건을 넣어서 상품을 조회하는 기능이 있는데 이 쿼리가 너무 오래걸려요. 어떻..
클래스로더는 .class 파일을 어떻게 실행시키나? 자바는 "한 번 작성하면 어디서나 실행된다"는 철학으로 유명합니다. 이 철학의 중심에는 JVM 클래스 로딩 시스템이 있습니다.이번 글에서는 JVM이 .class 파일을 어떻게 메모리에 올리고 실행하는지, 그 핵심 매커니즘을 상세히 설명합니다. 1. 클래스 로딩이란 무엇인가?자바 프로그램은 .java 소스 파일을 컴파일하면 .class 파일(바이트코드)이 생성됩니다.JVM은 이 .class 파일을 메모리에 로드하고 실행하는데, 이 과정을 클래스 로딩(Class Loading)이라고 부릅니다.굳이 java파일을 class 파일로 변환하는 이유는, JVM이 이를 읽을 수 없어서가 아니라 효율성, 이식성, 보안성을 위해서 JVM이 읽기 쉬운 파일로 변환한다고 보시면 됩니다. 자바 프로그램의 실행 흐름 개요자바 ..
SSL/TLS 통신은 어떻게 만들어졌는지? 대칭키/비대칭키/해시/인증서 이 글에서는 복잡한 보안 방식을 걷어내고, 백엔드 개발자가 네트워크 통신에서 사용하는 암호화에 대해 필수적으로 알아야 하는 기본 내용을 간단히 설명하겠습니다. 보안의 기본 컴포넌트해시 함수란?해시는 HashCode, Set, Map 등에서 널리 사용되는 개념으로, 보안에서도 핵심적인 역할을 합니다.해시 함수는 계산 식을 나타내며, 해시 알고리즘 f(x) = y 에 대해서 다음 조건을 충족해야 합니다.같은 입력값은 같은 출력값을 가짐 (확정성)결과값만으로 입력값을 역추적할 수 없음 (단방향성)다른 입력값은 다른 출력값을 가짐 (충돌 저항성)예를 들어 체크섬(Checksum)을 알아봅시다. 문자열 "abc" 를 ASCII 로 변환하면 97, 98, 99 가 됩니다.3개의 값을 10으로 나머지 연산과 덧셈을 ..
JPA의 진짜 설계 의도: 왜 N+1 문제를 방치하였나? 이 글에서는 객체와 테이블 간 구조적 차이를 JPA가 어떻게 해소하는지, 그리고 그 과정에서 왜 'N+1 문제'가 발생하게 되는지를 다룹니다. 1. JPA란 무엇인가?JPA는 자바 객체와 관계형 데이터베이스(RDB) 간의 매핑을 자동화하여 개발 생산성을 높여주는 ORM(Object-Relational Mapping) 기술입니다.쉽게 말해, Java는 객체(Object), DB는 테이블(Table)을 중심으로 구성되기 때문에, 이 둘을 자연스럽게 이어주는 다리가 바로 JPA입니다. 2. 객체와 관계형 데이터 간의 연관관계 매핑객체지향에서 객체는 다른 객체와 관계를 맺으며 동작합니다. 예를 들어, 고객이 쿠폰을 여러 개 소유하고 있다고 해보겠습니다.class Customer { String name; ..
이 코드 누가 짰어? 신입과 팀장의 시선으로 풀어보는 레거시 코드 이 글에서는 신입 개발자에게 레거시란 어떤 것이고 신입과 팀장의 각각의 시선으로 어떻게 레거시를 다루어야 하는지 정리하려 합니다.특히, 이를 어떻게 다뤄야 팀과 본인의 성장, 그리고 서비스에 긍정적인 영향을 줄 수 있는지 고민해보는 계기가 되길 바랍니다. 신입 개발자: 이해할 수 없는 코드와의 첫 만남신입으로 처음 팀에 들어와 레거시 코드를 접하게 되면, 머리가 하얘집니다.public 이 붙은 인터페이스 메서드... 굳이 왜?주석은 왜 이렇게 많고, 메서드 네이밍은 왜 이렇게 모호하지?if 안의 if 안의 if... 이건 대체 누가 짠 거야?Enum 대신 final int를?Bean 등록을 왜 다 XML로 하지?테스트 코드는 어디 갔지?메서드가 200줄이 넘어..?처음엔 당황스럽고, "이런 코드에서 내가..
캐시와 메모리 모델: 자바 멀티스레드 핵심 3가지 이슈 멀티스레딩 환경에서는 예상치 못한 성능 저하나 버그가 발생할 수 있습니다.이 글에서는 흔히 간과하기 쉬운 false sharing, 메모리 가시성, 그리고 명령어 재정렬 이슈를 다룹니다. 1. false sharing - L1, L2 캐시 무효화 문제CPU 캐시는 일반적으로 다음과 같이 계층 구조를 가집니다L1 Cache : ALU에 가장 밀접한 위치에 있는 캐시로, 매우 빠르지만 용량이 작고, 코어 간 공유되지 않습니다.L2 Cache : L1보다 느리지만 용량이 더 크며, 역시 코어 간 공유되지 않습니다.L3 Cache : 여러 코어가 공유하는 캐시이며, 비교적 느리지만 수 MB 수준의 데이터를 보관합니다.캐시에서는 데이터를 cache line 단위로 관리합니다. 대부분의 x86/ARM 아키텍처는 6..
JVM 메모리 참조 – GC와 참조 상태의 변화 흐름 과거에 GC에 대한 내부 메모리영역과 최적의 GC 튜닝에 대해서 알아보았습니다.https://youseong.tistory.com/30 자바의 Garbage Collection 이해와 성능 최적화 방법1. Garbage Collection이란?Garbage Collection(GC)는 동적으로 할당된 메모리 중 필요하지 않은 부분을 해제하는 JVM의 기능입니다.더 이상 사용하지 않는 객체의 메모리 자원을 해제하여 메모리의 여유 공youseong.tistory.com 이번 글에서는 GC 과정 중 객체의 참조 상태가 어떻게 변화하는지에 대해 다룹니다. 객체 상태에 대한 이해객체 참조 상태는 총 4가지로 간단하게 설명하면 다음과 같습니다.Strong Reference : 직접 접근이 가능한 객체 참조 상태,..
대규모 채팅 서비스 개발에 대한 회고 이 글에서는 Kafka 기반의 대규모 채팅 서비스를 직접 설계하고 구현하며 마주친 문제와, 이를 어떻게 해결했는지를 기록합니다.인프라 아키텍처부터 코드 레벨의 구조 개선, 서비스의 생명주기 까지 순차적으로 회고합니다. 1. 서비스 구성을 위해 정해야 할 것각 노드간 통신을 어떻게 해야할지?단일 노드 사용 시 성능 한계와 노드 다운에 대한 안정성 문제가 있어, 멀티 노드로 구성하겠습니다. 그럼 멀티 노드간에 사용자에 대한 통신 문제를 아래 '짱구' 와 '철수' 예제로 보겠습니다.(Node는 서버 또는 Pod를 의미하며, client는 현재 연결된 connection을 의미합니다.) 위와 같이 Node를 구성 할 경우 '짱구'와 '철수'는 각기 다른 Node를 통신하기에 메시지 송수신이 불가능합니다. 짱구와..