1️⃣ 왜 문서화 주석이 중요한가?자바에서는 /** ... */ 형식의 주석을 JavaDoc 주석이라고 부름이건 단순한 설명이 아니라,컴파일러가 인식해서 공식 문서로 변환할 수 있는 API 계약 문서/** * 두 정수의 합을 반환한다. * * @param a 첫 번째 정수 * @param b 두 번째 정수 * @return 두 수의 합 */public int sum(int a, int b) { return a + b;} → javadoc 도구로 자동 HTML 문서 생성 가능 → IDE에서 마우스 올리면 바로 표시됨 2️⃣ “공개된 API”란 무엇인가?"공개된 API"란 단순히 public만 뜻하지 않음외부에서 사용할 수 있는 모든 요소public 클래스, public 메서드라이브러리에서 외부에 ..
java
1️⃣ 마커란 무엇인가?"마커"란, 추가 메서드 없이 단순히 '특정 속성을 표시'하는 용도의 구조를 말함 자바에는 두 종류가 있음종류예시특징마커 인터페이스 Serializable, Cloneable타입 수준에서 표시마커 애노테이션@Override, @Deprecated소스 코드 수준에서 표시 둘 다 "이 객체는 ~한 성격을 가진다"는 의미를 전달하지만,적용 범위와 역할이 다름 2️⃣ 마커 인터페이스의 대표 예시자바 표준 라이브러리에서 이미 여러 예시를 볼 수 있음public interface Serializable {}public interface Cloneable {} 이 인터페이스들은 메서드를 하나도 가지지 않음그저 "이 객체는 직렬화/복제가 가능하다"는 타입 표시(marker)로만 쓰임 3️⃣ ..
1️⃣ 제네릭은 유연하지만, 타입 제약은 단단하다자바의 제네릭은 타입 안정성을 높이는 대신,타입 불일치에 매우 예민함List objList = new ArrayList();List strList = new ArrayList();objList = strList; // ❌ 컴파일 에러 직관적으로는 "String은 Object의 하위 타입이니까 괜찮지 않나?" 싶지만,List은 List의 하위 타입이 아님 왜냐하면, List에 Integer를 추가할 수도 있기 때문즉, 제네릭 타입은 "불변" 2️⃣ 이때 등장하는 것이 “한정적 와일드카드”?은 와일드카드(wildcard)로"어떤 타입이 올지 모른다"는 뜻 여기에 extends나 super를 붙이면 "한정(bound)"할 수 있음표현의미예시? extends TT..
1️⃣ 중첩 클래스(Nested Class)란?자바에서는 클래스 안에 클래스를 정의할 수 있음이걸 중첩 클래스(nested class)라고 함 종류는 크게 네 가지이다 👇 종류static 여부외부 클래스 참조주 사용처정적 멤버 클래스OX독립적인 유틸리티내부 로직 캡슐화비정적 멤버 클래스XO외부 인스턴스와 강하게 연결로컬 클래스XO메서드 내부의 임시 클래스익명 클래스XO짧은 1회성 구현 2️⃣ 비정적 멤버 클래스의 문제점비정적 멤버 클래스는 무조건 외부 클래스의 인스턴스에 묶여서 존재함class Outer { class Inner { void hello() { System.out.println("Hello from " + Outer.this); } ..
1️⃣ 왜 clone은 위험할까? 자바의 Cloneable 인터페이스와 Object.clone() 메서드는 객체의 복사를 쉽게 해줄 것 같지만, 실제로는 아님복사가 얕게(shallow) 이루어짐CloneNotSupportedException 예외를 신경써야 함상속 구조에서 불변식을 깨뜨리기 쉬움즉, 잘못 사용하면 버그가 생기기 쉽고, 안전한 복제를 위해선 주의 깊은 설계가 필요함 2️⃣ 얕은 복사로 생기는 문제class Person implements Cloneable { String name; List phones; @Override public Person clone() { try { return (Person) super.clone(); // ..
React로 단일 페이지 애플리케이션(SPA)을 개발하고 Spring Boot를 통해 배포하는 과정에서, 사용자들이 특정 페이지로 이동한 후 새로고침을 하면 404 오류가 발생하는 경우가 있습니다. 이는 React와 Spring Boot가 라우팅을 처리하는 방식의 차이에서 비롯된 문제로, 많은 개발자가 마주하는 흔한 이슈입니다. 이번 포스팅에서는 문제의 원인을 분석하고, 이를 효과적으로 해결하는 방법을 상세히 설명하겠습니다. 문제 상황: 새로고침 시 404 오류 발생 React 애플리케이션에서 BrowserRouter를 사용하여 클라이언트 사이드 라우팅(Client-Side Routing)을 처리할 때, 새로고침 시 다음과 같은 404 오류가 발생할 수 있습니다.GET https://example.co..
Redis는 Java 애플리케이션에서 캐싱, 세션 관리, 실시간 데이터 저장소로 자주 사용됩니다. Redis 클라이언트에서 데이터를 저장하거나 가져올 때, 데이터는 반드시 직렬화되어야 합니다. 직렬화 방식은 성능과 코드의 유지보수에 큰 영향을 미치기 때문에 잘 선택해야 합니다. 이번 포스팅에서는 Java에서 Redis 직렬화 시 자주 사용하는 방법들을 비교하고 각 방식의 특징과 예제를 설명합니다. JdkSerializationRedisSerializerJDK 기본 직렬화는 Java 표준 라이브러리에서 제공하는 java.io.Serializable 인터페이스를 사용하여 객체를 바이트 스트림으로 변환하는 방식입니다. 이 방식은 사용하기 편리하지만, 다소 무거운 오버헤드가 있을 수 있습니다. 장점:Java ..
MongoDB는 NoSQL 데이터베이스로, 그 유연성 덕분에 Spring Boot와 자주 함께 사용됩니다. Spring Boot에서는 Spring Data MongoDB를 통해 MongoDB 연동을 쉽게 할 수 있습니다. Spring Data MongoDB는 두 가지 주요 방식을 제공합니다. 바로 MongoTemplate와 MongoRepository 입니다. 이번 포스팅에서는 이 두 가지 방법을 비교하고, 어떤 상황에서 각각을 사용하는 것이 좋은지 살펴보겠습니다. MongoRepository와 MongoTemplate[MongoRepository] MongoRepository는 레파지토리 패턴을 기반으로 한 인터페이스입니다. 기본적인 CRUD 메서드를 자동으로 제공합니다. Spring Data JPA와..
데이터 지속성(Data persistence)은 대부분의 애플리케이션에서 매우 중요합니다. 애플리케이션이 데이터를 지속적으로 저장할 필요는 없지만, 비디오 게임, 소셜 미디어 플랫폼 또는 블로깅 웹사이트와 같은 다양한 분야의 대규모 애플리케이션에서는 흔히 사용하는 관행입니다. Java에서 데이터 지속성은 시간이 지남에 따라 많은 관심을 받았으며, 눈에 띄는 발전을 이뤄왔습니다. 처음에는 JDBC API를 직접 사용하는 것에서 시작하여, 점점 더 추상화되고 개발자가 사용하기 쉬운 표준화된 메커니즘으로 발전해왔습니다. 이러한 진화 과정에서 많은 지속성 기술이 개발되었으며, 이들 간의 차이는 종종 개발자들 사이에서 혼란을 일으킬 수 있습니다. 이러한 기술로는 Hibernate, JPA, Spring Data ..
1. Nulls와 OptionalsBad Practice: 메서드에서 바로 null을 리턴하는 건 NPE를 유발할 수 있습니다.public String getString() { return null;}Good Practice: null에 대한 명확한 핸들링과 에러 방지를 위해 Optional을 사용합니다.public Optional getString() { return Optional.empty();} 2. String.valueOf()로 String 변환Bad Practice: + 연산자를 사용해 문자열을 합칩니다.double d = 3.14525;String s = "" + d;Good Practice: 내장 메서드를 활용합니다.double d = 3.14245;String s = String.val..