Java
-
애그리거트 이해를 통한 도메인 설계Tech 2025. 6. 22. 19:13
애그리거트는 복잡한 도메인 모델을 효율적으로 관리하는 단위입니다. 이 글에서는 애그리거트의 개념과 활용에 대해 알아보겠습니다.≡ 목차 애그리거트의 정의와 중요성 애그리거트란 무엇인가 복잡한 도메인 관리의 필요성 애그리거트의 주요 기능 애그리거트 루트 역할 이해하기 애그리거트 루트의 기능 도메인 규칙과 일관성 유지 주문 애그리거트의 예 애그리거트 간 관계 설정하기 1-n 및 m-n 관계의 이해 애그리거트 경계 설정 관계 설정 시 주의사항 도메인 이벤트와 트랜잭션 관리 도메인 이벤트의 역할 애그리거트의 트랜잭션 범위 동시성 관리 결론 애그리거트를 팩토리로 활용하기 팩토리 역할의 이해 애그리거트의 객체 생성 도메인 로직 응집도 높이기 함께보면 좋은글! 비개발자를 위한 ..
-
Java HashMap의 원리와 해시충돌 해결법Tech 2025. 6. 21. 12:02
Java에서 HashMap은 매우 중요한 자료구조입니다. 이 글에서는 HashMap의 동작 원리와 해시충돌 해결 방법에 대해 설명합니다.≡ 목차 HashMap의 기본 개념 이해하기 Key-Value의 매핑 원리 삽입 삭제 검색의 시간 복잡도 해시 조작을 위한 해시 함수 해시 충돌의 정의와 종류 해시 충돌이란 무엇인가 Open Addressing 방식 Separate Chaining 방식 Java HashMap의 내부 구조 배열과 버킷 구조 이해하기 해시버킷과 노드 형 배열 해시 함수의 작용 방식 결론 해시 버킷 관리 방식 이진 트리로의 변환 기준 트리에서 링크드 리스트로 변화 메모리 관리의 중요성 HashMap 사용 시 주의점 충돌 빈도를 줄이는 팁 키 설계 시 유의 ..
-
Java Record를 활용한 불변 객체의 이해Tech 2025. 6. 21. 11:39
Java Record는 간결하게 불변 객체를 정의할 수 있는 강력한 도구입니다. 앞으로의 개발에 어떻게 도움이 되는지 함께 살펴보겠습니다.≡ 목차 Java Record란 무엇인가 기본 정의와 예시 기존 자바 클래스와의 비교 자동 생성되는 메서드들 Record의 불변성 이해하기 불변 속성의 중요성 변경 불가능한 필드 정의 동시성 문제 방지 Record vs Lombok 비교 두 기술의 근본적인 차이 유연성과 불변성 자동 생성 메서드의 차이점 Java Record의 실제 활용 데이터 전송 객체 정의 데이터 모델로서의 활용 예시 코드로 보는 활용법 결론과 정리 Java Record의 주요 장점 프로그래밍에 미치는 영향 향후 활용 가능성 함께보면 좋은글! ChatGPT C..
-
Spring Boot와 Vscode로 프로젝트 시작하기Tech 2025. 6. 13. 13:42
Spring Boot로 복잡한 웹 애플리케이션을 쉽게 개발할 수 있는 방법을 알아보겠습니다. Vscode와 함께 프로젝트를 설정하는 과정은 효율성을 높이는 중요한 단계입니다.≡ 목차 Spring Boot 프로젝트 생성 방법 Gradle로 프로젝트 시작하기 Spring Initializr 설정 단계 필수 의존성 선택하기 Vscode에서 프로젝트 관리 프로젝트 구조 이해하기 Vscode의 유용한 기능 활용 터미널 사용법 Spring Boot 실행 방법 Java Application으로 실행하기 Spring Boot Dashboard 활용 디버깅 및 오류 처리 build.gradle 파일 수정 의존성 추가 및 관리 플러그인 설정 프로젝트 빌드 방법 프로젝트 발전 방향 기타 프레..
-
BFS and DFS with JavaTech/Algorithm 2024. 4. 6. 19:28
BFS(Breadth-First Search, 너비 우선 탐색)와 DFS(Depth-First Search, 깊이 우선 탐색)는 그래프를 탐색하는 두 가지 기본적인 방법입니다. 너비 우선 탐색 (BFS) BFS는 그래프의 가장 가까운 노드부터 탐색하는 방식입니다. 즉, 시작 노드로부터 거리에 따라 순차적으로 탐색합니다. BFS는 큐(Queue)를 사용하여 구현합니다. 특징: 모든 노드를 방문할 때까지 각 노드를 거리 순으로 방문합니다. 사용 경우: 최단 경로를 찾거나, 그래프의 모든 노드를 방문하는 경우에 유용합니다. 깊이 우선 탐색 (DFS) DFS는 그래프의 노드를 깊이 우선으로 탐색하는 방식입니다. DFS는 스택(Stack) 또는 재귀 함수를 사용하여 구현합니다. 특징: 하나의 경로를 끝까지 탐색한..
-
BFS and DFS with JavaTech/Algorithm 2024. 3. 24. 17:08
BFS(Breadth-First Search, 너비 우선 탐색)와 DFS(Depth-First Search, 깊이 우선 탐색)는 그래프를 탐색하는 두 가지 기본적인 방법입니다. 너비 우선 탐색 (BFS) BFS는 그래프의 가장 가까운 노드부터 탐색하는 방식입니다. 즉, 시작 노드로부터 거리에 따라 순차적으로 탐색합니다. BFS는 큐(Queue)를 사용하여 구현합니다. 특징: 모든 노드를 방문할 때까지 각 노드를 거리 순으로 방문합니다. 사용 경우: 최단 경로를 찾거나, 그래프의 모든 노드를 방문하는 경우에 유용합니다. 깊이 우선 탐색 (DFS) DFS는 그래프의 노드를 깊이 우선으로 탐색하는 방식입니다. DFS는 스택(Stack) 또는 재귀 함수를 사용하여 구현합니다. 특징: 하나의 경로를 끝까지 탐색한..
-
Blocking IO 와 Non-Blocking IOTech/SpringBoot 2023. 10. 29. 13:46
Blocking I/O Blocking I/O는 I/O 작업이 완료될 때까지 해당 스레드가 대기하는 방식입니다. 예를 들어, 파일에서 데이터를 읽는 작업을 수행하는 경우, 데이터 읽기가 완료될 때까지 스레드는 블록되어 다른 작업을 수행할 수 없게 됩니다. 스레드의 상태 Blocking I/O 작업 중에는 스레드가 "Blocked" 상태가 되며, 이 상태에서는 CPU가 해당 스레드를 실행하지 않습니다. 스레드는 I/O 작업이 완료될 때까지 대기합니다. CPU의 상태 스레드가 블록된 동안 CPU는 다른 스레드나 프로세스의 작업을 실행할 수 있습니다. 만약 다른 실행 가능한 스레드가 없다면, CPU는 유휴 상태가 될 수 있습니다. CPU 유휴 상태 방지 CPU의 유휴 상태를 방지하기 위해서는 Non-Block..
-
Java Heap 메모리 할당 과정 시퀀스Tech/SpringBoot 2023. 10. 29. 13:31
Client가 JVM에게 새 객체를 생성하라는 요청을 합니다. JVM은 HeapMemory에 충분한 메모리가 있는지 확인합니다. 만약 메모리가 충분하지 않다면, HeapMemory는 GarbageCollector를 호출하여 불필요한 객체를 제거하고 메모리를 회수합니다. 메모리 회수 후, HeapMemory는 JVM에게 메모리가 충분함을 알립니다. JVM은 HeapMemory에 객체를 할당하고 초기화합니다. 마지막으로, JVM은 Client에게 객체의 참조를 반환합니다.
-
Spring boot Private field and method TestTech/SpringBoot 2022. 5. 22. 12:45
ReflectionTestUtils를 이용하여 private field or method 를 테스트 할 수 있다. public class Student { private int id; private String getFirstNameAndId(){ return getFirstName() + " " + getId(); } } @SpringBootTest class StudentTest { @Autowired Student student; @BeforeEach void studentBeforeEach(){ student.setFirstName("Eric"); student.setLastName("Roby"); student.setEmailAddress("asdfa@asdf.com"); student.setS..
-
Spring boot Throwing Exception testTech/SpringBoot 2022. 5. 22. 12:05
@SpringBootTest class StudentRepositoryTest { @Autowired Student student; @Autowired StudentGrades studentGrades; @MockBean private StudentRepository studentRepository; @Autowired private StudentService studentService; @Autowired private ApplicationContext context; @DisplayName("Throw runtime error") @Test void throwRuntimeError() { Student nullStudent = (Student)context.getBean("Student"); doTh..