| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
- dfs
- String
- 따배씨
- 정수론
- C
- sorting
- Algospot
- JavaScript
- Python
- 생활코딩
- C언어
- web
- server
- Algorithm
- 종만북
- udemy
- php
- Math
- 따라하면서 배우는 C언어
- 백준
- 따라하며 배우는 C언어
- BASIC
- graph
- Java
- BOJ
- BFS
- greedy
- Cleancode
- 인프런
- DP
- Today
- Total
목록전체 글 (428)
몽상실현개발주의
트랜잭션(Transaction)은 데이터베이스에서 하나의 논리적 작업 단위를 의미합니다.예를 들어 “A 계좌에서 B 계좌로 1만 원 송금” 같은 작업은 출금과 입금이 함께 이루어져야 하죠.이런 트랜잭션이 지켜야 할 4가지 기본 원칙을 ACID라고 합니다.이는 단순히 DB 이론이 아니라, 안정적인 시스템을 설계하기 위한 최소 조건이기도 합니다.🧩 1️⃣ Atomicity — 원자성"트랜잭션은 전부 성공하거나 전부 실패해야 한다." 원자성은 트랜잭션이 쪼갤 수 없는 하나의 단위로 실행되어야 한다는 의미입니다.즉, 일부만 성공하는 ‘반쪽 성공’은 절대 허용되지 않습니다. 예시A 계좌에서 10,000원 출금B 계좌에 10,000원 입금입금이 실패하면 출금도 롤백되어야 함Spring/JPA에서의 구현@Trans..
스프링 개발을 하다 보면 “커넥션이 열리면 세션이 생성된다”라는 말을 자주 듣습니다.하지만 정확히 무엇이 생성되고, 내부에서 무슨 일이 일어나는지 잘 모르는 경우가 많습니다.이 글에서는 스프링 서버 ↔ DB 서버 구조를 중심으로 커넥션 / 세션 / 세션 컨텍스트 / 스레드의 관계를 정리해 보았습니다.1️⃣ 커넥션(Connection)은 물리적 통신선이다Spring → DB 사이에는 TCP/IP로 맺어진 소켓 연결이 존재합니다.이게 바로 커넥션입니다.클라이언트(Spring 애플리케이션)가 getConnection()을 호출하면DB 서버와 TCP 소켓이 연결됩니다.이건 단순히 데이터를 주고받는 통로이며,자체적으로는 아무런 상태도 저장하지 않습니다.즉, 커넥션은 “전선(통신선)”과 같습니다.2️⃣ 세션(Ses..
Entity의미: 고유 식별자(ID)를 가진 도메인 객체. 특징 데이터베이스 테이블과 매핑되는 경우가 많음 (JPA Entity). equals/hashCode는 식별자 기준으로 비교. 상태 변경 가능 (mutable). 예시@Entitypublic class Employee { @Id private String id; private String name; private String department;}VO (Value Object)의미: 값 그 자체를 표현하는 객체. 값이 같으면 같은 객체로 취급. 특징 불변(Immutable)으로 설계 권장. 별도의 식별자 불필요. 도메인에서 의미 있는 속성을 묶음. 예시public class Address { priva..
MyBatis는 왜 서비스 레이어가 뚱뚱해질 수밖에 없는가?2. 서비스 비대화를 막는 5가지 보완 패턴과 코드 예시MyBatis를 쓰면 서비스가 두꺼워지기 쉽습니다.하지만 아래 5가지 패턴을 적용하면 비대화를 완화할 수 있습니다. 1. Application Service ↔ Domain Service 분리Application Service: 트랜잭션 경계, 순서 제어 Domain Service: 비즈니스 규칙, 검증 ➡️ 서비스에는 오케스트레이션만 남기고, 규칙은 도메인 서비스로 분리 @Service@RequiredArgsConstructorpublic class CreateAppointmentUseCase { private final AppointmentOrchestrator orchestra..
MyBatis는 왜 서비스 레이어가 뚱뚱해질 수밖에 없는가?1. JPA와 비교하며 살펴보는 Transaction Script 패턴의 함정1. 접근 철학의 차이MyBatisSQL Mapper → SQL 직접 작성, VO/DTO 매핑.여러 테이블 조인, 후속 로직을 서비스에서 직접 오케스트레이션.서비스 코드가 절차적 스크립트처럼 길어짐.➡️ 서비스가 뚱뚱해지는 구조적 성향JPAORM → 엔티티와 관계를 선언해두면 findById, findAll로 객체 그래프 조회.서비스는 비즈니스 규칙에만 집중.데이터 조립은 프레임워크가 처리.➡️ 서비스가 얇아짐2. MyBatis 서비스 코드 예시사원 발령 등록을 MyBatis로 작성하면:EmpVo emp = empMapper.findById(empId);if (emp =..
1. CQRS 기본 개념CQRS(Command Query Responsibility Segregation)는 쓰기(Command)와 읽기(Query)를 명확히 분리하는 설계 원칙이다.Command상태를 변경하는 작업 (INSERT, UPDATE, DELETE)부작용 있음일반적으로 반환값은 없음 (또는 성공 여부, ID 등 최소한)Query상태를 조회하는 작업 (SELECT)부작용 없음데이터를 반환하는 것에만 집중👉 핵심: 한 메서드 안에서 조회와 수정이 섞이지 않도록 분리한다.2. 잘못된 예시 (CQRS 위배)public Employee findAndUpdate(String empId) { Employee e = employeeRepository.findById(empId).orElseThrow(..
데이터베이스를 쓰다 보면 “조회 요청에도 트랜잭션을 열어도 괜찮을까?”라는 질문이 자주 나옵니다. 특히 스프링 같은 프레임워크는 `@Transactional`을 쉽게 붙일 수 있어서, 무심코 모든 요청을 트랜잭션으로 감싸는 경우도 많죠. 결론부터 말하면: 👉 단순 SELECT 한 번만 하고 바로 끝낸다면 큰 문제는 없다.👉 하지만 트랜잭션을 오래 열어두면 락보다 커넥션·Undo Log 유지가 문제가 된다. 1. Undo Log란 무엇인가?InnoDB 같은 엔진은 `UPDATE/DELETE/INSERT`를 할 때 기존 데이터를 Undo Log 에 기록합니다. 이유는 MVCC(다중 버전 동시성 제어) 때문입니다. 어떤 트랜잭션은 최신 데이터를 보지만, 아직 끝나지 않은 다른 트랜잭션은 시작 당시의..
Java 컬렉션 프레임워크는 데이터를 그룹으로 관리하고 조작하는 데 사용되는 인터페이스와 클래스를 제공하는 중요한 구성 요소입니다. 이번 포스트에서는 Java의 주요 컬렉션 인터페이스와 그들의 상속 관계에 대해 알아보겠습니다.주요 컬렉션 인터페이스Collection Interface:모든 컬렉션 클래스가 구현해야 하는 기본 인터페이스입니다.주요 메서드: add(), remove(), size(), clear(), contains(), isEmpty(), iterator(), 등.List Interface:순서가 있는 요소의 컬렉션을 정의합니다. 중복 요소를 허용합니다.구현 클래스: ArrayList, LinkedList, Vector, Stack.주요 메서드: get(), set(), add(), rem..