'스프링 프레임워크 첫걸음'을 읽고 어플리케이션 제작에 필요한 레이어와 Spring Framework 기능 적용에 대해 정리한 글입니다 💭
도메인 레이어에서는 비즈니스 로직과 데이터 모델을 정의합니다.
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
}
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUsername(String username);
}
@RequiredArgsConstructor
@Service
public class UserService {
private final UserRepository userRepository;
public User registerUser(String username, String password) {
// 비즈니스 로직
return userRepository.save(user);
}
}
인프라스트럭처 레이어는 데이터페이스와 ORM을 포함합니다.
도메인 레이어의 도메인 객체가 인프라스트럭처 레이어를 활용해서 데이터베이스에 접속할 수 있습니다.
O/R Mapper
ORM은 객체지향 프로그래밍 언어와 관계형 데이터베이스의 테이블을 매핑하는 기술입니다. Spring Data JPA와 Hibernate가 이러한 ORM 기술을 구현하는 데 도움을 줍니다.
데이터베이스와의 연결을 위해서는 Spring Boot 제공하는 application.properties 설정 파일에 입력합니다. 이 내용을 바탕으로 데이터베이스 연결과 Hibernate 설정이 자동으로 이루어집니다.
(Spring Boot는 HikariCP, Tomcat JDBC Connection Pool 등 다양한 DataSource 구현체를 지원하며, 설정 파일에 명시된 정보를 기반으로 적절한 구현체를 선택하고 설정합니다.)
커스텀 레포지토리 구현
Spring Data JPA가 제공하는 JpaRepository 외에도 복잡한 비즈니스 로직이 필요한 경우 커스텀 레포지토리 인터페이스를 만들 수 있습니다.
// 1. 원하는 커스텀 레포지토리 인터페이스를 만든다
public interface CustomUserRepository {
List<UserActivity> findUserActivitiesByCustomCriteria(Long userId, LocalDate startDate, LocalDate endDate);
}
// 2. 구현 클래스를 만든다
public class CustomUserRepositoryImpl implements CustomUserRepository {
@PersistenceContext
private EntityManager entityManager;
@Override
public List<UserActivity> findUserActivitiesByCustomCriteria(Long userId, LocalDate startDate, LocalDate endDate) {
// 복잡한 쿼리 로직
}
}
// 3. 1에서 만든 커스텀 레포지토리를 기존 레포지토리에 추가로 상속한다
public interface UserRepository extends JpaRepository<User, Long>, CustomUserRepository {
}
(여기서 Entity Manager는 JPA의 핵심 인터페이스로 데이터베이스와 상호작용하는 도구입니다. 엔티티의 생명주기를 관리하고 데이터베이스 작업을 수행하는데 사용합니다.)
어플리케이션 레이어는 사용자와 상호작용하기 위해서 필요한 컨트롤러, 뷰, 폼 등을 포함합니다.
application.properties 파일에 입력하면 데이터베이스 연결을 관리하는 DataSource 객체를 생성하고 JPA 설정을 자동으로 구성