반응형

분류 전체보기 87

카프카(Kafka) 기본 개념 정리 – 컨슈머와 리스너는 어떻게 다를까?

목차1. 카프카(kafka)란 무엇인가?2. 초보 개발자가 가장 많이 헷갈리는 질문3. 컨슈머와 리스너의 진짜 역할4. 실제 동작 구조를 하나의 흐름으로 정리해보면5. 헷갈리는 개념들을 한 번 더 정리하면6. 카프카를 처음 도입하는 팀이라면카프카(Kafka) 기본 개념 정리 – 컨슈머와 리스너는 어떻게 다를까?최근에 회사 프로젝트에서 카프카(Kafka)를 도입하면서 가장 많이 부딪힌 부분이 바로 “컨슈머(Consumer)와 리스너(Listener)가 뭐가 다른가?”였다.설계 문서를 보면 둘 다 메시지를 받고 처리하는 것처럼 보이는데, 실제로는 서로 완전히 다른 역할을 담당한다.초보 개발자들이 가장 헷갈려 하는 부분이기도 해서, 처음 접하는 사람 기준으로 정리해본다. 1. 카프카(Kafka)란 무엇인가? ..

Spring 2025.12.05

[Spring Boot] JUnit5 + Mockito 단위 테스트 기초 정리

목차0. 서론1. 단위 테스트에서 우리가 하고 싶은 일2. 아주 쉬운 예제로 시작해 보기3. Mockito 기본 세팅4. @Test, @DisplayName, @Nested – 테스트 구조 잡기5. Mockito 기본 동작 – when/thenReturn, verify, verifyNoInteractions6. 정리: 테스트 코드 작성 흐름7. 마무리 0. 서론@Mock, @InjectMocks, @ExtendWith, @Nested, @DisplayName까지 한 번에요즘 스프링 개발을 하다 보면 “테스트 코드도 같이 작성해 주세요”라는 말을 자주 듣는다.문제는 제대로 배워본 적이 없어서, 처음 테스트 코드를 보면 주술처럼 느껴진다는 점이다. @ExtendWith(MockitoExtension.cla..

Spring 2025.11.27

Git Rebase vs Merge, HEAD·base·hash까지 한 번에 이해하기

목차왜 리베이스를 쓰나?그림으로 보는 rebase와 mergeHEAD / base / hash — 꼭 알아야 할 내부 개념실전: 팀에서 쓰는 안전한 절차(FF-only 기준)리베이스 vs 병합, 언제 어떤 걸 쓰나?자주 묻는 질문(FAQ)용어 정리(초급 개발자용)1) 왜 리베이스를 쓰나?히스토리를 직선(Linear)으로 정리하고 싶을 때충돌을 커밋 단위로 깔끔하게 해결하고 싶을 때저장소가 Fast-forward only 정책일 때(merge 커밋 없이 병합) 핵심 한 줄 : 내(feature) 커밋들을 최신 dev 뒤로 다시 붙여 병합을 깔끔하게 만든다. 2) 그림으로 보는 rebase와 merge아래 그림들을 순서대로 넣으세요.2-1. 분기된 상태 (리베이스/병합 전)이 상태에서 feature는 예전..

형상관리 2025.11.13

[DDD] Value Object의 동일성과 동등성 완벽 이해하기 Value 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
반응형