학습 키워드
- 데이터베이스
- ERD
- ORM
- Spring Data JPA
- Entity
- 3 Layer Achitecture
- 영속성 컨텍스트
데이터베이스
여러 사람이 공유하고 사용할 목적으로 한 곳에서 관리되는 데이터의 조직화된 집합으로, 데이터를 소프트웨어에서 효율적으로 관리하기 위한 저장소입니다.
데이터 베이스의 종류
☑️ 관계형 DB(RDBMS)
- 가장 많이 사용하는 데이터베이스입니다.
- 데이터를 테이블 형태로 구조화하여 저장하고 관리하는 시스템입니다.
- 테이블 간의 관계를 이용하여 데이터를 연결합니다.
☑️ 비관계형 DB(NoSQL)
- 테이블이 아닌 key-value, document, graph 등의 다양한 형태로 데이터를 저장하고 관리합니다.
- 스키마가 고정되지 않고, 대규모 데이터 처리와 높은 확장성을 제공합니다.
RDBMS의 특징
1. 테이블
- 데이터가 테이블 구조에 저장되며 행과 열로 구성됩니다.
- 열은 데이터의 속성을 나타내고 타입을 가집니다.
- 행은 관계된 데이터의 묶음을 의미하고 tuple & record라고 합니다.
- 데이터 무결성
- 테이블은 특정 규칙과 제약조건을 통해 데이터를 저장함으로써 데이터의 무결성을 유지합니다.
2. 관계
- 테이블 간의 관계는 외래 키(Foreign Key)를 통해 설정됩니다.
- RDBMS는 다양한 유형의 관계를 지원합니다.
- 1:1 관계: 한 테이블의 한 행이 다른 테이블의 한 행과만 연결됩니다.
- 1:N 관계: 한 테이블의 한 행이 다른 테이블의 여러 행과 연결됩니다.
- N:N 관계: 두 테이블의 여러 행이 서로 연결될 수 있습니다.
3. SQL
- RDBMS에서 데이터를 정의하고, 관리하기 위한 표준 언어입니다.
- 데이터를 CRUD하는 작업을 수행합니다.
4. 키
- 기본 키(Primary Key)
- 테이블 내에서 각 행을 고유하게 식별하는 열 또는 열의 조합입니다.
- 기본 키는 중복되지 않으며, NULL 값을 가질 수 없습니다.
- 외래 키(Foreign Key)
- 한 테이블의 열이 다른 테이블의 기본 키를 참조하여 두 테이블 간의 관계를 설정하는 데 사용됩니다.
- 테이블 간의 데이터 무결성을 유지할 수 있습니다.
- 유일 키(Unique Key)
- 기본 키와 유사하지만, 하나의 테이블에서 여러 개가 존재할 수 있습니다.
- 중복된 값을 허용하지 않지만, NULL 값은 허용할 수 있습니다.
5. 트랜잭션(Transaction)
- RDBMS는 트랜잭션이라는 단위를 통해 데이터베이스 작업을 처리하며, 이를 통해 데이터의 일관성과 무결성을 유지합니다.
- 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durabillity)이라는 ACID 속성을 따릅니다.
- 원자성: 트랜잭션의 모든 작업이 성공적으로 완료되거나, 실패 시 모든 작업이 롤백됩니다.
- 일관성: 트랜잭션이 데이터베이스를 일관된 상태로 유지합니다.
- 고립성: 동시에 실행되는 트랜잭션 간의 영향을 최소화합니다.
- 지속성: 트랜잭션이 완료된 후 데이터의 변경 사항은 영구적으로 저장합니다.
6. 정규화
- 데이터의 중복을 줄이고, 일관성과 무결성을 유지하기 위해 데이터를 구조화하는 프로세스입니다.
- 여러가지 정규화 단계가 있으며, 각 단계는 데이터 중복을 줄이고 이상 현상을 방지하는 데 목적이 있습니다.
7. 데이터 무결성
- 엔터티 무결성
- 각 테이블의 기본 키(PK)가 중복되지 않고 NULL 값이 나닌 상태를 유지합니다.
- 참조 무결성
- 외래 키(FK)를 통해 참조되는 데이터가 유효성을 유지하도록 보장합니다.
- 도메인 무결성
- 각 열이 정의된 데이터 타입과 제약 조건에 따라 유효한 값을 유지하도록 합니다.
8. 인덱스
- 특정 열의 검색 성능을 향상시키기 위해 사용합니다.
- 인덱스는 테이블의 데이터를 정렬하고, 효율적으로 접근할 수 있도록 지원합니다.
- 인덱스가 많아지면 삽입 및 수정 작업의 성능에 영향을 미칠 수 있습니다.
ERD
데이터베이스의 구조를 시각적으로 표현하는 도구입니다.
ERD의 필요성
- 데이터베이스 구조를 한 눈에 파악할 수 있습니다.
- 설계를 진행하며 논리적인 오류를 미리 발견하고 수정할 수 있습니다.
- 데이터 구조를 문서홯여 다른 사람과의 소통을 원활하게 합니다.
- 데이터 구조의 근본적인 결함을 제거하여 기술적 부채를 사전에 방지합니다.
ORM
객체지향 프로그래밍 언어와 관계형 데이터베이스의 테이블을 자동으로 매핑하는 기술입니다.
ORM의 핵심
- 데이터베이스 종류에 관계없이 일관된 인터페이스를 제공합니다.
- ORM을 사용한다면, 추상화된 인터페이스를 활용하여 DB의 종류와 상관없이 코드 작성을 할 수 있습니다.
- 개발자가 직접 SQL을 작성하지 않고도 데이터베이스 조작이 가능합니다.
ORM을 사용한 패러다임 불일치 해결
데이터베이스의 데이터에는 String & Integer 같은 단일 값만 넣을 수 있습니다.
하지만, Java는 필드에 객체나 리스트도 넣을 수 있습니다.
이게 바로 대표적인 패러다임의 불일치입니다.
ORM은 이 점을 해결하여줍니다.
데이터 타입, 데이터 관계 표현 방식 등 DB와 Java는 다르기 때문에 모든 것이 어긋나게 되는데 이를 ORM이 중간에 인터페이스로 존재하여 여러 패러다임의 불일치를 해결해줍니다.
Spring Data JPA
Java와 데이터베이스 간의 패러다임 불일치 문제를 해결하여 데이터베이스 작업을 객체 지향적으로 수행할 수 있도록 지원하는 ORM입니다.
SQL을 직접 작성하지 않고도 객체 조작을 통해 DB 작업을 수행할 수 있도록 표준화된 인터페이스를 제공합니다.
JPA는 인터페이스이기 때문에 구현체가 있어야하는데 그 구현체는 보통 Hibernate라는 것을 사용합니다.
즉, Hibernate는 구현체이므로, 설정을 통해 어떤 RDBMS를 사용할지 결정할 수 있습니다.

JPA와 Spring Data JPA라는 것이 나오는데, JPA조차도 더 쉽게 사용하기 위해 Spring Data JPA를 사용하게 됩니다. 따라서, 일반적으로 JPA라고 말한다면 Spring Data JPA를 뜻하는 것입니다.
관련 용어 정리
- JDBC: 자바와 데이터베이스를 잇는 기본 통신 기술 (API)
- JPA: '이렇게 ORM을 만들어라'고 정해놓은 인터페이스
- Hibernate: JPA 설계도에 따라 만들어진 구현체
Entity
데이터베이스의 테이블과 1:1로 대응되는 Java클래스입니다.
관련 어노테이션
@Entity
- 이 클래스가 JPA 엔티티임을 선언합니다.
- 클래스 이름대로 실제 데이터베이스 테이블과 매핑됩니다.
@Entity
public class Member {
// 클래스 내용
}
@Table
- 엔티티와 매핑할 테이블 정보를 지정합니다.
- 클래스의 복수형으로 적어주는 것이 좋습니다. (예약어 회피)
@Entity
@Table(name = "members")
public class Member {
// 클래스 내용
}
@Id & @GenaratedValue
- @Id: 기본키를 매핑합니다.
- @GenaratedValue: 기본 키 자동 생성 전략을 지정합니다.
@Entity
@Table(name = "members")
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// ...
}
@Column
- 필드와 컬럼 매핑 정보를 지정합니다.
- @Column의 속성
name: 컬럼명
length: 문자 길이 제약조건
nullable: null 허용 여부
unique: 유니크 제약조건
@Entity
@Table(name = "members")
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, nullable = false)
private String email;
}
@NoArgsConstructor(access = AccessLevel.PROTECTED)
- Lombok의 기능으로, 기본 생성자를 만들어 줍니다.
- (access = AccessLevel.PROTECTED) 속성으로 외부에서의 접근을 막습니다.
3 Layer Achitecture
소프트웨어 시스템을 세 개의 논리적 계츠응로 분리하는 아키텍처입니다.

3 Layer Achitecture의 목적
☑️ 관심사 분리
- 각 계층은 고유한 책임만을 담당
- 변경 사항의 영향 범위를 최소화
☑️ 유지보수성 향상
- 코드의 가독성과 이해도를 증가
- 독립적인 테스트가 가능
☑️ 재사용성 증대
☑️ 확장성 개선
- 특정 계층만 변경하여 기능을 확장
- 새로운 기술의 도입이 용이
Controller Layer
- 일반 사용자가 애플리케이션과 상호작용하는 사용자 인터페이스 및 커뮤니케이션 계층입니다.
@RestController
public class HelloController {
// ...
}
✅ 해야할 일
- HTTP 요청 매핑
- 요청 파라미터 검증
- 예외 처리 및 에러 응답
❌ 하지 말아야 할 일
- 비즈니스 로직 처리
- 데이터베이스 직접 접근
- 복잡한 데이터 변환
Service Layer
@Service
public class HelloService {
// ...
}
✅ 해야할 일
- 비즈니스 규칙 구현
- 데이터 유효성 검증
- 여러 데이터 소스 조합
- 트랜잭션 경계 설정
❌ 하지 말아야 할 일
- HTTP 관련 처리
- 데이터베이스 쿼리 작성
- UI 관련 로직
Repository Layer
public interface UserRepository extends JpaRepository<User, Long> {
// ...
}
✅ 해야할 일
❌ 하지 말아야 할 일
- 비즈니스 로직 처리
- HTTP 응답 생성
- 사용자 인터페이스 관련 작업
Layer간 통신 규칙
✅ 허용되는 통신
- 상위 → 하위: 상위 계층이 하위 계층을 호출
- 같은 계층: 동일 계층 내 컴포넌트 간 통신
❌ 금지되는 통신
- 하위 → 상위: 하위 계층이 상위 계층 직접 호출
- 계층 건너뛰기
DTO(Data Transfer Object)
데이터를 전달하기 위한 순수 데이터 객체입니다.
Spring은 클라이언트의 요청을 받고, 이 요청을 Java 코드로 변환하여 처리합니다.
이 때, 사용자의 Request 데이터를 자바 코드에 담아 컨트롤러에 옮겨줄 객체가 필요한데, 이 객체가 바로 DTO입니다.
{
"title": "범죄도시11"
}
@Getter
public class CreateMovieRequest {
private String title;
}
@RestController
public class MovieController {
@PostMapping("/movies")
public void createMovie(@RequestBody CreateMovieRequest request) {
// ...
}
}
영속성 컨텍스트
영속성 컨텍스트는 엔티티를 영구 저장하는 환경을 뜻하며 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 합니다.
영속성 컨텍스트가 하는 일
- 엔티티를 임시로 보관
- 변경사항을 추적 (더티체킹)
- 데이터베이스와 동기화
엔티티의 생명주기
엔티티 객체가 생성되어 소멸하기까지 거치는 여러 상태의 변화 과정을 의미합니다.
☑️ 비영속
- 영속성 컨텍스트와는 아무런 관계가 없는 상태입니다.
☑️ 영속
- 엔티티가 영속성 컨텍스트에 의해 관리되는 상태입니다.