정적 중첩 클래스는 정말 필요할까?
·
언어/Java
궁금증중첩 클래스 중 정적 중첩 클래스(static nested class), 내부 클래스(Inner Class)의 차이를 살펴보며 다음과 같은 궁금증이 생겼다. 캡슐화를 위해 내부 클래스를 쓴다면, 실제 인스턴스와 연관 있는 내부 클래스(Inner Class)를 쓰면 되지, 왜 굳이 외부 인스턴스와 무관한 정적 중첩 클래스(static nested class)를 써야 할까?" 왜?! 정적 중첩 클래스를 사용할까? 1. 불필요한 외부 인스턴스 참조 제거(메모리 누수 방지)내부 클래스는 컴파일 시 자동으로 외부 클래스의 참조(this$0)를 갖는다.이건 때때로 GC가 외부 클래스 인스턴스를 회수하지 못하게 만들 수 있음특히 콜백 구조나 멀티스레딩 상황에서는 의도치 않은 메모리 누수(leak)로 이어질 수 ..
HTTPS 통신 방식
·
Backend/소소한 백엔드 개발 이야기
현대 웹에서는 암호화를 위해 HTTPS 프로토콜을 사용해 통신이 이루어진다. 하지만, HTTPS 프로토콜을 통해서 암호화가 된다는 사실만 알고 있을 뿐 내부적으로 어떤 인증체계를 가지고 있는지 알지 못한다. 이번 글에서 HTTPS 통신이 내부적으로 어떤 인증체계를 갖추고 있는지 한번 알아보자.사전 지식 암호 기술에 대한 이해 대칭키 하나의 키로 암호화/복호화를 모두 하는 방식이다. 암호화 : 보안성을 부여한다. 일상생활에서 키를 사용하는 방식과 동일하다. 대칭키는 효율이 좋기 때문에, HTTPS 방식에서 데이터를 암호화 하는데 사용된다. 대칭키가 노출되는 순간 암호화는 의미가 없어지기 때문에 키를 저장, 전달하는 방식이 매우 중요하다!(대칭키는 매우 중요한 개인정보로 취급된다.)비대칭키 한쌍의 키(공개키..
JWT(JSON Web Token)
·
Backend/소소한 백엔드 개발 이야기
참고 링크 : https://jwt.io/introductionJWT 소개JSON 웹 토큰(JWT)은 RFC 7519 공개 표준으로, 당사자 간에 정보를 JSON 객체 형태로 안전하게 전송하기 위한 간결하고 자기완결적인(compact and self-contained) 방법을 정의한다. 이 정보는 디지털 서명되어 있기 때문에 그 진위를 확인하고 신뢰할 수 있다. JWT는 비밀키(HMAC 알고리즘 사용) 또는 RSA나 ECDSA 알고리즘을 사용하는 공개키/개인키 쌍을 이용하여 서명될 수 있다. JWT가 당사자 간의 비밀성(secrecy)을 제공하기 위해 암호화될 수도 있지만, 여기서는 서명된 토큰에 중점을 둔다. 서명된 토큰은 그 안에 포함된 정보 항목(또는 내용, 기술 용어로는 클레임이라고도 한다)의 무..
POJO(Plain Old Java Object)
·
Backend/Spring
스프링 백엔드 개발자를 위한 관점으로 POJO(Plain Old Java Object) 를 정리해보자. POJO 란 무엇인가? POJO는 "Plain Old Java Object"의 약자로, 특정 프레임워크나 기술에 종속되지 않은 순수한 자바 객체를 의미한다. 스프링 개발에서 POJO는 매우 중요한 개념이다. 스프링 프레임워크 자체가 POJO 중심의 개발을 강력하게 지원하기 때문이다.자바의 기본에 충실: 특정 규약(예: 특정 클래스 상속, 특정 인터페이스 구현 강제) 없이, 자바 언어 명세에 따라 작성된 객체이다.독립성: 객체가 특정 프레임워크 API나 환경에 직접적으로 의존하지 않아, 객체 자체의 생명주기나 동작 방식이 프레임워크에 의해 크게 좌우되지 않는다.POJO는 객체지향의 핵심 원칙, 특히 객체..
왜 List<String>은 List<Object>가 될 수 없을까? (제네릭과 와일드카드가 공존하는 이유)
·
언어/Java
🧩 공변(covariant)과 무공변(invariant)이란?먼저 개념부터 짚고 가자.공변이란 String이 Object의 하위 타입이라면,List도 List의 하위 타입으로 간주하는 성질이다.하지만 자바 제네릭은 무공변이다.즉, 타입 인자가 다르면 하위 타입으로 인정하지 않는다.String extends Object // ✅ OKList → List // ❌ No이 때문에 다음 코드도 허용되지 않는다.List list = new ArrayList(); // ❌ 컴파일 에러🔒 왜 제네릭은 무공변으로 설계되었을까?이유는 단 하나, 타입 안정성(type safety) 때문이다.다음처럼 컴파일이 허용된다고 가정해보자.List list = new ArrayList();lis..
왜 불변 객체를 써야 할까?
·
언어/Java
왜 불변 객체가 중요한가? 개발을 하다 보면 객체의 상태를 바꾸는 일이 매우 흔하다.그러나 이 상태 변경이 언제, 어디서, 왜 발생했는지를 추적하다 보면 복잡해지고,대부분의 버그는 “예상하지 못한 상태 변화”에서 비롯된다. 이 때문에 많은 개발자들이 다음과 같이 말한다.“가능한 한 객체는 불변(immutable)하게 만들어라.” 그렇다면 불변 객체란 무엇이며,왜 그렇게들 불변을 강조하는가?✅ 불변 객체란?한 번 생성되면 내부 상태가 절대로 바뀌지 않는 객체를 의미한다. String name = "gugbab2";String upper = name.toUpperCase(); // name은 그대로, upper는 "경호"의 대문자→ String은 대표적인 불변 객체이다.toUpperCase()를 호출해도 원..
happens-before란 무엇인가?
·
언어/Java
자바에서 멀티스레드 환경을 다루다 보면 자주 듣게 되는 말이 있다.바로 "happens-before" 관계다.이것은 단순한 실행 순서를 말하는 게 아니다.“스레드 간의 메모리 정합성”을 보장하는 논리적 순서의 규칙이다.🔍 happens-before란?happens-before는 자바 메모리 모델(Java Memory Model, JMM)에서“A 작업이 B 작업보다 먼저 일어났음을 메모리 차원에서 보장하는 관계”를 말한다.즉, A happens-before B라면 → A의 메모리 변경 결과는 B에서 반드시 보인다.단순한 코드 순서가 아니라, 메모리 가시성(visibility)과 관련된 개념이다.🧱 대표적인 happens-before 관계 6가지동일 스레드 내 코드 순서int x = 1;int y = x..
ABA 문제란? - CAS 에서 터질 수 있는 진짜 함정
·
언어/Java
Java에서 동시성 프로그래밍을 하다 보면 CAS(Compare-And-Swap)라는 개념을 자주 접하게 된다.그러나 CAS가 항상 안전한 것은 아니다. 그중 대표적인 함정이 바로 ABA 문제이다.🔍 ABA 문제란?ABA 문제는 값이 A였다가 B로 바뀌었다가 다시 A로 돌아왔을 때 발생한다.CAS는 값이 같으면 문제없이 통과시키는 구조이기 때문에중간에 값이 변경되었다는 사실을 인식하지 못한다.즉, 값은 같지만 의미상으로는 완전히 다른 데이터일 수 있음에도 이를 구분하지 못하는 것이 ABA 문제의 핵심이다.🧪 왜 위험할까?CAS는 다음과 같은 방식으로 작동한다:if (value == expected) { value = newValue;}이때, 다른 스레드가A → B → A로 값을 변경해버리면,CA..