반응형

분류 전체보기 84

[DDD] Value Object의 동일성과 동등성 완벽 이해하기alue Object의 동일성과 동등성 완벽 이해하기

DDD(도메인 주도 설계)에서 Value Object(VO) 는 도메인 모델을 설계할 때 꼭 등장하는 개념입니다.하지만 많은 개발자들이 “VO가 뭐야?” 혹은 “동등성으로 비교한다는 게 무슨 뜻이야?”라는 부분에서 헷갈려하죠.오늘은 이 개념을 실제 코드와 함께 명확히 정리해보겠습니다. Value Object란? Value Object(VO) 는 고유한 ID가 없고,그 값 자체로 동일성을 판단하는 객체입니다.즉, 값이 같다면 다른 객체여도 “같은 것으로 본다”는 의미예요.대표적인 예로는 Money(금액), Address(주소), Email(이메일) 같은 객체가 있습니다. 동일성과 동등성의 차이자바에서는 객체를 비교할 때 두 가지 기준이 있습니다.구분의미자바 비교 방식동일성 (Identity)메모리 상..

Spring 2025.10.22

[DDD] 자바에서의 참조 공유와 (Value Object, Entity) 정리

들어가며DDD(Domain-Driven Design)를 공부하다 보면 “밸류(Value Object)는 불변 객체여야 한다”는 말을 자주 듣습니다.그런데 막상 자바 코드로 보면 “왜 불변이어야 하지?”, “참조 공유가 왜 문제지?” 같은 의문이 생기죠.이 글에서는자바의 참조 구조(Stack, Heap)참조 공유 문제의 원리불변 객체로 해결하는 이유DDD에서 밸류(Value Object)와 엔티티(Entity)의 차이를 실제 예제 코드와 함께 명확히 정리해보겠습니다.// 금액class Money { private int value; public Money(int value) { if (value 자바의 메모리 구조: Stack과 Heap자바는 데이터를 저장할 때 두 가지 영역을 사..

Spring 2025.10.17

[Java기술면접] ArrayList vs LinkedList 차이 및 시간 복잡도란?

시간 복잡도란?어떤 코드/알고리즘이 얼마나 빨리 동작하는지를 나타내는 단위예요.그런데 "몇 초" 같은 절대 시간이 아니라, 데이터 양(n)이 늘어날 때 연산 횟수가 얼마나 늘어나는지를 보는 거예요. 즉, 성능의 성장률을 나타낸 것. O(1), O(n) 이건 뭔데?O(...) 표기법 = Big-O 표기법이라고 부르고, 최악의 경우에 연산이 얼마나 걸리는지 표현한다.자주 나오는 예시O(1) : 데이터 개수와 상관없이 항상 일정한 시간.→ "한 번에 바로 찾는다."예: 배열에서 arr[5]처럼 인덱스로 값 꺼내기.O(n) : 데이터 개수(n)에 비례해서 시간이 늘어남.→ "처음부터 끝까지 다 뒤져야 한다."예: 배열에서 "값이 7인 원소 찾기" (최악의 경우 전부 확인해야 함).O(log n) : 데이터가 늘..

기술면접 2025.09.08

[Java 기술면접] ConcurrentModificationException 발생

이건 자바 면접에서 정말 자주 나오는 ConcurrentModificationException 문제이다. List list = new ArrayList(Arrays.asList("a","b","c"));for (String s : list) { if (s.equals("n")) { list.remove(s); // 여기서 문제 !! }} 1. 왜 오류가 날까? for-each 문은 내부적으로 Iterator를 사용해 리스트를 순회합니다.그런데 순회 도중에 list.remove(s)로 직접 리스트를 수정하면,Iterator가 감지 → ConcurrentModificationException 발생.즉, “Iterator로 순회 중인데, 너 몰래 리스트를 건드렸다”라는 상황이다. 2. 안전하게 ..

기술면접 2025.09.08

[SourceTree]소스트리 조직(organization) 저장소 403 오류 발생 해결

소스트리(Sourcetree)를 설치 후 깃허브(Github)의 저장소들을 클론(clone)할 때 문제가 발생하였습니다. 유효한 소스 경로 URL이 아닙니다.1. 문제발생소스트리(Sourcetree)를 설치 후 깃허브(Github)의 저장소들을 클론(clone)할 때 문제가 발생하였습니다. 유효한 소스 경로 URL이 아닙니다. 1. 문제발생분명히 존재하는 저장소인데 해당 URL을 찾지 못하는 것이 이상했습니다. 개인(private) 저장소들은 정상적으로 탐색되었기 때문에 조직(organization) 저장소라는 점이 수상했습니다. 문제 원인은 소스트리 어플리케이션이 조직에 대한 접근 승인이 되지 않았던 것이었습니다.2. 해결방법다음과 같은 과정을 통해 문제를 해결할 수 있습니다.Settings > ..

형상관리 2025.05.12

[Spring Security] 해시란? Salt란? BCrypt이해하기

안녕하세요, 이번 글에서는 실무에서도 많이 사용하는 BCrypt 해시 알고리즘에 대해 정리해보려고 합니다.단순히 라이브러리만 사용하는 것을 넘어서, 왜 써야 하는지, 어떻게 동작하는지 까지 이해하는 것이 목표입니다.비밀번호 저장은 "암호화"가 아니라 "해시"로많은 분들이 비밀번호를 암호화해서 저장한다고 말하지만, 정확히는 "해시(Hash)" 해야 합니다.구분해시 (Hash)암호화 (Encryption)방향성단방향 (복호화 불가)양방향 (복호화 가능)사용 목적비교용, 위조 방지데이터 보호비밀번호 저장에 적합?✅ 예❌ 아니오 암호화는 키가 유출되면 누구나 복호화할 수 있기 때문에 비밀번호 저장용으로는 부적절합니다.따라서 우리는 복호화가 불가능한 단방향 해시 함수를 사용해야 합니다.해시(Hash)란?입력값(비..

보안 2025.05.12

Spring Security 기반 CSRF 공격 실습 및 방어 방법 정리

유튜브 영상도 촬영하였습니다. 아래 영상을 참고하면서 블로그글을 참고해주세요. CSRF (Cross-Site Request Forgery)란? CSRF (Cross-Site Request Forgery) 사이트 간 요청 위조는 웹 애플리케이션의 취약점을 악용하는 공격 방식 중 하나로, 사용자가 의도하지 않은 요청을 수행하게 만드는 공격입니다. CSRF 공격의 목적은 사용자가 웹 애플리케이션에서 인증된 세션을 가지고 있는 상태에서, 공격자가 의도한 행동을 사용자로 하여금 실행하게 하는 것입니다. 이는 사용자가 현재 로그인한 세션을 이용하여 악의적인 요청이 서버에 전달되도록 하여, 사용자의 의도와 무관하게 데이터 변경, 거래 발생 등의 작업이 수행되게 만듭니다. CSRF(Cross-Site Requ..

Spring 2025.05.04

MySQL 8.0 'Access denied' 오류 해결법 — 인증 방식 변경 [우분투,mySQL8.0]

MySQL 8.0 'Access denied' 오류 해결법 — 인증 방식 변경(auth_socket → mysql_native_password)Spring Boot, MyBatis, DBeaver, 또는 JDBC로 MySQL 8.0에 연결하려고 할 때 다음과 같은 오류를 본 적 있나요?java.sql.SQLException: Access denied for user 'root'@'localhost'처음에는 비밀번호가 틀렸다고 생각할 수 있지만, MySQL 8.0부터 기본 인증 방식이 바뀌었기 때문에 발생하는 문제입니다. 문제 상황MySQL 8.0 이상 버전에서는 기본 사용자 인증 방식이 바뀌었습니다. 특히 우분투에서 apt로 설치하면, root 계정은 기본적으로 auth_socket 방식이 됩니다.이 방..

DB 2025.04.02

[MySQL] EXPLAIN 실행 계획 항목 정리

EXPLAIN 실행 계획 항목 정리표항목의미주요 값설명id실행 단계숫자 (1, 2, 3...)JOIN이 포함된 쿼리에서 실행 순서를 나타냄. 작은 숫자가 먼저 실행됨.select_type쿼리 유형SIMPLE, PRIMARY, SUBQUERY, DERIVED, UNION 등쿼리의 구조(기본, 서브쿼리, 유니온 등)를 나타냄.table참조하는 테이블테이블명현재 실행 계획에서 사용되는 테이블 이름을 나타냄.partitions사용된 파티션파티션명 또는 NULL테이블이 파티셔닝되어 있을 경우, 사용된 파티션을 표시함.type조회 방식 (성능 중요!)ALL, index, range, ref, eq_ref, const, system 등테이블을 검색하는 방식. ALL은 풀 테이블 스캔(느림), const는 즉시 검색(..

DB 2025.03.21

[DB MySQL] 옵티마이저(Optimizer)란? INDEX EXPLAIN 실행

옵티마이저(Optimizer)는 SQL 쿼리를 실행할 때 가장 효율적인 실행 계획을 선택하는 MySQL의 내부 엔진입니다.즉, MySQL이 쿼리를 실행할 때 "어떤 인덱스를 사용할지", "어떤 방식으로 데이터를 검색할지" 등을 결정하는 역할을 합니다.쉽게 말해, 옵티마이저는 쿼리 성능을 최적화해주는 엔진입니다.EXPLAIN 실행 시 type이 ALL로 나오는 경우EXPLAIN SELECT * FROM users WHERE age > 30;   - type = ALL이란?"풀 테이블 스캔(Full Table Scan)"이 발생한 상태입니다.즉, MySQL이 테이블의 모든 행을 검사하면서 age > 30 조건을 만족하는 데이터를 찾고 있습니다.인덱스를 사용하지 않기 때문에 성능이 매우 비효율적입니다.- "A..

DB 2025.03.20
반응형