제네릭의 핵심 개념과 설계 철학
·
Engineering Notes/Java & Spring
들어가며지난 28일, 자바 정규 수업을 들었다. 제네릭과 관련한 내용이었는데, 제네릭 사용 시 Type Argument를 정확히 일치시켜야 한다고 하더라. 2주라는 짧은 시간 안에 자바를 가르치다 보니 어쩔 수 없는 부분이었겠지만, 아쉽게도 '왜?'는 빠져있었다. 제네릭의 탄생제네릭이 도입되기 이전 시대에서, List와 Map 같은 자바 컬렉션은 모든 종류의 객체를 담을 수 있는 Object 타입으로 설계되었다. Object 클래스는 최상위 클래스로서, 언뜻 보면 유연하지만 그만큼 치명적인 단점을 안고 있었다. 예를 들어 아래와 같은 원시 타입 리스트가 있다고 하자.List items = new ArrayList();items.add("ssafy");items.add(14); 현재 리스트에는 문자열도, ..
동적 배열의 재할당과 힙 오버플로우
·
Engineering Notes/Java & Spring
동적 배열과 재할당자바에서 ArrayList는 대표적인 동적 배열이다. 내부적으로는 일반 배열을 사용하지만, 요소가 추가되거나 제거될 때 필요에 따라 배열의 크기를 자동으로 조절한다. 이러한 특징으로 개발자가 배열의 크기를 정할 필요 없이 유연하게 사용 가능하다는 장점이 있다.내부적으로는 용량 부족을 감지하고 현재 용량보다 더 큰 (일반적으로 1.5배) 배열을 생성해 모든 요소를 복사한다. 이후 새로운 배열을 참조하도록 변경하는 과정을 거친다. ArrayList의 경우, 배열의 인덱스는 int 타입으로 관리된다. int 타입의 최댓값은 2^31 - 1이니, 이론적으로는 약 21억 개의 요소를 가질 수 있다고 판단하기 마땅하다. 그러니 실제로 21억 개의 요소를 담아보자.import java.util.*;..
현대 소프트웨어 아키텍처에 대한 고찰
·
Engineering Notes/Java & Spring
싱글톤 패턴의 출현설계를 하다 보면, 애플리케이션 전반에 걸쳐 유일하게 존재해야 하는 객체가 있다. 싱글톤 패턴은 불필요한 리소스 낭비를 방지할 뿐 아니라, 관리를 용이하게 한다는 점에서 한때 각광받던 디자인 패턴 중 하나다. 어디서든 쉽게 접근해서 쓸 수 있다는 점도 개발자들에게 충분히 매력적으로 느껴졌을 것이다. 마치 전역 변수처럼 편의성을 제공하면서도 최소한의 객체 지향 원칙을 지키는 듯 보였으니 말이다. 하지만 싱글톤 패턴의 가장 고질적인 문제는 강한 결합에 있었다. 싱글톤에 의존하는 클래스들은 싱글톤의 존재를 직접적으로 알게 되고, 이는 곧 테스트를 매우 어렵게 만든다는 말과 같다. 싱글톤의 상태가 전역적으로 공유되기 때문에, 예측 불가능한 사이드 이펙트가 발생하기 쉬웠으며, 병렬 처리 환경에서..
Spring Initializr & Dependencies
·
Engineering Notes/Java & Spring
Spring Initializr는 스프링 프로젝트를 생성할 때 유용한 웹페이지다. 간단한 게시판 기능을 만들기 위해 의존성을 몇 가지 추가하였는데, 어떤 의존성들을 추가했으며 왜 추가했는지 알아보자.Spring WebSpring Web은 RESTful 애플리케이션을 구축하고 Spring MVC를 사용하여 웹 애플리케이션을 개발하는 데 필요한 핵심 기능을 제공한다. 기본적으로 내장된 Tomcat 서버를 포함하고 있어 별도의 웹 서버 설정 없이 바로 실행 가능하다. 가장 먼저 개발할 Comment API는 사용자의 요청(댓글 등록, 댓글 조회 등)을 처리하고 응답(JSON 데이터)을 반환하는 웹 애플리케이션이다. Spring Web은 이러한 웹 요청을 처리하고, 컨트롤러를 통해 비즈니스 로직을 연결하며, 뷰..
Variable Hiding / Shadowing
·
Engineering Notes/Java & Spring
자바 상속과 관련하여과거, 김영한님의 자바 강의를 통해 상속의 개념과 다형성, 메서드 오버라이딩에 대해 학습했다. 비슷한 내용으로 글도 올렸었는데, 이번에 정보처리기사 실기를 벼락치기 하는 과정에서 무언가 착각을해도 단단히 착각했다는 것을 깨달았다. 자바에서는 상속 관계에 있는 클래스들 간에 이름이 같은 멤버가 있을 때, 변수 숨김 또는 메서드 오버라이딩이 동작하게 된다. 내가 착각하고 있던 부분은 변수 또한 메서드 오버라이딩처럼 동작할 거란 막연한 생각이었다. 아래 예시를 보자.public class Main { public static void main(String[] args) { Base a = new Derivate(); Derivate b = new Derivate(); ..
자료구조 힙(Heap), 자바에 TCO가 없는 이유는?
·
Engineering Notes/Java & Spring
들어가며자바에서는 java.util.PriorityQueue라는 표준 라이브러리에서 우선순위 큐(최소 힙)를 편리하게 제공하고 있다. 그럼에도 불구하고 힙의 동작 원리를 직접 파고들어 구현 방법까지 알아두는 것은 단순히 라이브러리 사용을 넘어, 자료구조에 대한 더 깊은 이해를 돕는다.힙(Heap)은 우선순위 큐 구현부터 다익스트라, 프림 알고리즘 등 다양한 곳에 활용되는 중요한 자료구조다. 이번 포스트에서는 "힙이란 무엇이고, 어떻게 동작하며, 왜 그렇게 동작하는지" 그리고 "배열을 사용한 직접 구현 과정과 최적화 가능성"까지, 여러 궁금증을 바탕으로 알기 쉽게 설명하고자 한다.힙(Heap)이란 무엇인가?힙은 완전 이진 트리의 한 종류이며, 다음과 같은 중요한 특징을 지닌다.힙 속성(Heap Proper..
JPA 프로젝트에서 타임스탬프 자동화를 위한 세 가지 전략
·
Engineering Notes/Java & Spring
타임스탬프타임스탬프(Timestamp)는 어떤 사건이나 데이터가 발생한 정확한 시간을 기록한 값이다. 예를 들어 특정 데이터가 생성된 시점이나 수정된 시점을 저장하는 데 사용된다. 타임스탬프는 왜 남겨야 할까?1. 데이터가 언제 생성되고 수정되었는지가 기록되기 때문에 변경 내역을 명확히 알 수 있다. 따라서 시스템 장애나 보안 사고 발생 시, 언제 어떤 변경이 있었는지를 추적하고 원인을 규명할 수 있다.예를 들어, 은행 시스템에서 고객 계좌 정보가 잘못 변경되었다고 가정하자. 타임스탬프가 남아 있다면 누가 언제 계좌 정보를 수정했는지 정확히 알 수 있고, 문제가 발생한 시점을 추적하고 원인을 파악해 빠른 대응이 가능하다. 단순히 기록을 넘어 실시간 문제 대응 및 복구 작업의 도구로 활용될 수 있다. (E..
Spring Boot 드라이버 인식 오류 (driver-class-name)
·
Engineering Notes/Java & Spring
📢 해결법이 궁금하신 분은 맨 밑줄만 보세요.도커로 MySQL 띄우고 연결하는 과정에서 드라이버 인식 오류가 발생했다.application.yml에서 MySQL 드라이버를 못 찾고 자꾸 mysql 패키지를 생성하겠냐는 알림이 떠서 난감했다.# 오류 발생 구문driver-class-name: com.mysql.cj.jdbc.Driver사실 스프링 부트는 드라이버명을 적어주지 않아도 알아서 찾아준다.그러나, 적었을 때 발생한 오류에 대해 해결하고 싶었다. (단순히 생략해서 해결하고 싶지 않았음) AI한테 물어보니 Gradle 빌드 파일을 다시 확인하라더라.의존성 주입이 안 된 것 아니냐는 의미였는데 내가 실수했을 리 없었다.Gradle 리프레시를 안 해서 그렇다는 답변도 받았는데, 역시나 말이 안 된다. ..