Persistence Layer(영속성 계층)는 소프트웨어 아키텍처에서 애플리케이션 데이터가 데이터베이스 또는 파일 시스템과 같은 영구 저장소에 저장되고, 필요 시 이를 검색하거나 수정하는 계층을 말합니다. Persistence Layer는 비즈니스 로직과 데이터 저장소 간의 중간 다리 역할을 하며, 데이터 접근과 관리를 책임집니다.
1. Persistence Layer의 역할
Persistence Layer는 데이터 저장소와 애플리케이션의 다른 계층 간의 분리와 추상화를 제공합니다. 주요 역할은 다음과 같습니다:
- 데이터 저장 및 검색
- 데이터베이스에 데이터를 저장하거나 불러오는 작업을 담당합니다.
- 데이터 접근 로직 캡슐화
- 데이터베이스의 구조와 접근 방식을 추상화하여 애플리케이션 코드에서 직접적으로 의존하지 않도록 만듭니다.
- 비즈니스 계층과 데이터 계층 분리
- 데이터 접근 로직을 Persistence Layer로 이동함으로써 비즈니스 로직과 데이터 로직을 분리합니다.
- 데이터 무결성 유지
- 트랜잭션 처리와 같은 작업을 통해 데이터의 일관성을 보장합니다.
- ORM (Object-Relational Mapping) 지원
- 객체지향 언어(Java 등)와 관계형 데이터베이스 간의 데이터 매핑을 처리합니다.
2. Persistence Layer의 구성 요소
Persistence Layer는 주로 다음 요소들로 구성됩니다:
1. DAO (Data Access Object)
- 데이터베이스와 상호작용하는 인터페이스.
- SQL 쿼리나 저장 프로시저를 실행하여 데이터를 저장, 수정, 삭제, 검색.
예시:
public interface UserDao {
void saveUser(User user);
User getUserById(int id);
}
2. Repository
- Spring Data JPA 등에서 자주 사용되는 접근 방식으로, DAO보다 추상화된 계층.
- 주로 JPA를 사용해 CRUD 작업을 제공합니다.
예시:
public interface UserRepository extends JpaRepository<User, Long> {}
3. ORM (Object-Relational Mapping)
- 객체지향 프로그래밍 언어와 관계형 데이터베이스 간의 데이터 변환을 처리.
- Hibernate, JPA(Java Persistence API) 등이 대표적인 ORM 기술.
예시 (JPA 사용):
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
4. Data Source
- 데이터베이스 연결을 설정하고 관리.
- JDBC 또는 JNDI를 사용하여 데이터 소스를 정의.
예시 (Spring Boot 설정):
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: user
password: pass
5. Transaction Management
- 트랜잭션을 관리하여 데이터 무결성을 보장.
- Spring Framework의 @Transactional 어노테이션을 자주 사용.
예시:
@Transactional
public void updateUser(User user) {
userRepository.save(user);
}
3. Persistence Layer의 기술 및 도구
Persistence Layer는 다양한 기술 및 도구를 활용해 구현할 수 있습니다:
기술/도구 | 설명 |
JDBC | Java에서 데이터베이스와 직접 상호작용하는 저수준 API. |
Hibernate | Java의 대표적인 ORM 프레임워크. |
JPA | Java에서 ORM을 위한 표준 인터페이스. Hibernate로 구현 가능. |
Spring Data JPA | JPA를 더욱 간단하게 사용할 수 있는 Spring Framework 모듈. |
MyBatis | SQL Mapper 프레임워크로, SQL과 매핑된 객체 간의 상호작용을 제공. |
Dapper | .NET 환경에서 경량 ORM으로 사용. |
4. Persistence Layer 설계 시 고려사항
- 성능 최적화
- 적절한 캐싱 메커니즘 사용 (e.g., Hibernate의 1차/2차 캐시).
- 복잡한 쿼리를 실행하기 전에 필요한 데이터만 가져오는 전략 필요.
- 데이터 무결성
- 트랜잭션 관리 및 동시성 문제 해결.
- 데이터베이스 레벨의 무결성 제약(Unique, Foreign Key 등)을 활용.
- 확장성
- DAO와 Service 계층 간 인터페이스를 통해 유연한 설계.
- 데이터 저장소 변경 시에도 최소한의 수정으로 대응 가능하도록 추상화.
- 테스트 가능성
- Mock 데이터베이스 또는 In-Memory 데이터베이스(H2)를 사용해 유닛 테스트 구현.
- 보안
- SQL 인젝션 방지 (PreparedStatement 또는 ORM 사용).
- 민감한 데이터 암호화 및 접근 제어 설정.
5. Persistence Layer 구현 예제
(1) DAO 패턴
public class UserDaoImpl implements UserDao {
private JdbcTemplate jdbcTemplate;
public UserDaoImpl(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public User getUserById(int id) {
String sql = "SELECT * FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
}
}
(2) JPA를 활용한 Repository
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByEmail(String email);
}
(3) Service와 연계
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User getUserById(Long id) {
return userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
}
}
'Spring' 카테고리의 다른 글
JPA/Hibernate 관련 설정 (application.properties) (0) | 2025.01.13 |
---|---|
JPA(Java Persistence API) 개요 (0) | 2025.01.13 |
Transaction(트랜잭션)과 TCL(Transaction Control Language) (0) | 2025.01.11 |
MariaDB 엔진 - InnoDB vs MyISAM (0) | 2025.01.10 |
Swagger (REST API 문서화) (0) | 2025.01.10 |