graph TD
A[Service Layer] --> B[Persistence Layer]
B --> C["Data Access Object (DAO)"]
C --> D[Database Connection Pool]
D --> E[Database]
E --> D
D --> C
C --> B
B --> A
Persistence Layer(영속성 계층)는 소프트웨어 아키텍처에서 애플리케이션 데이터가 데이터베이스 또는 파일 시스템과 같은 영구 저장소에 저장되고, 필요 시 이를 검색하거나 수정하는 계층을 말합니다. Persistence Layer는 비즈니스 로직과 데이터 저장소 간의 중간 다리 역할을 하며, 데이터 접근과 관리를 책임집니다.
Persistence Layer는 데이터 저장소와 애플리케이션의 다른 계층 간의 분리와 추상화를 제공합니다. 주요 역할은 다음과 같습니다:
Persistence Layer는 주로 다음 요소들로 구성됩니다:
DAO (Data Access Object)
예시:
public interface UserDao {
void saveUser(User user);
User getUserById(int id);
}
Repository
예시:
public interface UserRepository extends JpaRepository<User, Long> {}
ORM (Object-Relational Mapping)
예시 (JPA 사용):
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
Data Source
예시 (Spring Boot 설정):
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: user
password: pass
Transaction Management
@Transactional 어노테이션을 자주 사용.예시:
@Transactional
public void updateUser(User user) {
userRepository.save(user);
}
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으로 사용. |
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));
}
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByEmail(String email);
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User getUserById(Long id) {
return userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
}
}