Create a Maven Web Application
Add Dependencies - pom.xml File
Spring ORM (spring-orm
)
spring-orm
의존성은 Spring 프레임워크의 일부로, Spring의 데이터 접근/퍼시스턴스 계층을 담당${spring.version}
**은 프로젝트에서 사용하는 Spring 프레임워크의 버전을 나타내며, 이는 보통 프로젝트의 pom.xml
파일 내의 <properties>
섹션에서 정의Hibernate Core (hibernate-core
)
hibernate-core
의존성은 Hibernate ORM 프레임워크의 핵심 라이브러리를 포함MySQL Connector/J (mysql-connector-java
)
mysql-connector-java
의존성은 MySQL 데이터베이스와 Java 프로그램 사이의 연결을 가능하게 하는 JDBC 드라이버5.1.47
**은 사용되는 MySQL Connector/J 드라이버의 버전으로, 이 버전은 특정 MySQL 서버 버전과의 호환성 및 특정 기능을 보장Create a Project Structure
Configure DispatcherServlet using Java-based Spring configuration
이전 예제들과 코드 동일
Spring and Hibernate Integration using Java-based Spring configuration
이 코드는 Spring Framework를 사용하여 Hibernate를 구성하는 Java 설정 클래스
database.properties
파일을 구성 소스로 사용하도록 지정. 이 파일에는 데이터베이스 연결 및 Hibernate 설정과 관련된 속성들이 포함되어 있다.@Transactional
어노테이션을 사용하여 메소드 레벨에서 트랜잭션 경계를 선언할 수 있다.Environment
타입의 environment
빈을 자동 주입. 이 객체는 프로퍼티 파일로부터 읽어들인 속성 값을 접근하는 데 사용LocalSessionFactoryBean
**을 생성하고 구성하는 빈을 정의. 이 빈은 Hibernate 세션 팩토리를 Spring 컨테이너에 등록하며, Hibernate 세션을 관리하는 데 사용. 데이터 소스 설정, 엔티티 패키지 스캔 위치, 그리고 Hibernate 속성 설정 등을 포함DataSource
객체를 생성하고 구성하는 빈을 정의. **DriverManagerDataSource
**는 간단한 데이터베이스 연결을 위한 구현체입니다. 데이터베이스 URL, 사용자 이름, 비밀번호 등은 **environment
**를 통해 프로퍼티 파일로부터 가져온다.Properties
객체를 생성하고, Hibernate의 다이얼렉트, SQL 출력 여부, SQL 포맷팅 여부, DDL 자동 실행 설정 등을 포함한다.HibernateTransactionManager
**를 구성하는 빈을 정의. 이 트랜잭션 매니저는 Hibernate 세션 팩토리와 통합되어 데이터베이스 트랜잭션을 관리한다.Create database.properties File
database.properties
파일에 사용될 수 있는 데이터베이스 연결 및 Hibernate 구성 속성
hibernate.show_sql = true:
true
**로 설정되면 Hibernate가 실행하는 모든 SQL 쿼리를 콘솔에 출력합니다. 개발 중에 유용한 디버깅 도구hibernate.format_sql = true:
true
**일 때), Hibernate는 출력되는 SQL 쿼리를 보기 좋게 포맷팅하여 출력hibernate.hbm2ddl.auto = update:
update
옵션은 애플리케이션 시작 시 데이터베이스 스키마를 업데이트 한다. 이는 모델 변경 사항이 있을 때 기존 스키마를 자동으로 업데이트하도록 한다.Spring MVC Bean Configuration using Java-based Spring configuration
이전 예제들과 코드 동일
JPA Entity - Customer.java
**Customer
**라는 이름의 엔티티 클래스를 정의
@Entity: 이 클래스가 JPA (Java Persistence API) 엔티티임을 나타낸다. 엔티티는 데이터베이스의 테이블과 매핑되어 데이터베이스에 영속적으로 저장되는 데이터를 나타낸다.
@Table(name = "customer"): 엔티티가 매핑될 데이터베이스 테이블의 이름을 지정한다. 이 경우, customer
테이블과 매핑된다.
@Id: 필드가 엔티티의 기본 키(primary key)임을 나타낸다.
@GeneratedValue(strategy = GenerationType.IDENTITY): 기본 키의 값을 데이터베이스가 자동으로 생성하도록 지정한다. IDENTITY
전략은 데이터베이스의 자동 증가(auto_increment) 기능을 사용하여 기본 키 값을 생성한다.
@Column(name = "column_name"): 엔티티 필드가 매핑될 데이터베이스 컬럼의 이름을 지정한다. 예를 들어, firstName
필드는 데이터베이스의 first_name
컬럼과 매핑된다.
Controller Layer
이 컨트롤러는 고객 정보에 대한 CRUD(Create, Read, Update, Delete) 작업을 웹 브라우저를 통해 수행할 수 있는 인터페이스를 제공
/customer
**로 설정. 예를 들어, **/customer/list
**는 listCustomers
메소드로 매핑.CustomerService
타입의 customerService
필드에 대한 의존성 주입을 자동으로 수행. 이를 통해 컨트롤러는 고객 관련 비즈니스 로직을 처리하는 서비스 계층의 메소드에 접근할 수 있다.CustomerService
를 통해 모든 고객 정보를 조회한 다음, 이를 모델 객체에 추가하여 뷰(list-customers
)에 전달Customer
객체를 생성하여 모델에 추가하고, 고객 정보 입력 폼 뷰(customer-form
)를 반환@ModelAttribute
**를 사용하여 폼 데이터를 Customer
객체로 바인딩하고, 이를 **CustomerService
**를 통해 저장한다. 저장 후에는 고객 목록 페이지로 리다이렉트한다.customerId
파라미터를 통해 전달된 고객 ID를 사용하여 해당 고객 정보를 조회하고, 이를 모델에 추가하여 폼 뷰(customer-form
)에 전달한다.customerId
파라미터를 통해 전달된 고객 ID를 사용하여 해당 고객 정보를 삭제하고, 고객 목록 페이지로 리다이렉트한다.Service Layer - CustomerService.java
이 코드는 **CustomerService
**라는 인터페이스를 정의하고 있으며, 고객 정보를 관리하기 위한 기본적인 서비스 계층의 메소드들을 선언
List<Customer> getCustomers(): 모든 고객 정보를 조회하여 반환하는 메소드. 이 메소드는 고객 목록을 보여주는 데 사용되며, Customer
객체의 리스트를 반환
void saveCustomer(Customer theCustomer): 새로운 고객 정보를 저장하거나 기존 고객 정보를 업데이트하는 메소드. 매개변수로 전달된 Customer
객체에 담긴 정보를 데이터베이스에 저장한다. 이 메소드는 고객 정보를 폼에서 입력받아 제출할 때 호출
Customer getCustomer(int theId): 특정 ID를 가진 고객 정보를 조회하는 메소드. 매개변수로 전달된 ID 값에 해당하는 고객 정보를 데이터베이스에서 찾아 Customer
객체로 반환한다. 이 메소드는 고객 정보를 수정하기 위해 특정 고객의 상세 정보를 조회할 때 사용
void deleteCustomer(int theId): 특정 ID를 가진 고객 정보를 삭제하는 메소드. 매개변수로 전달된 ID 값에 해당하는 고객 정보를 데이터베이스에서 삭제한. 이 메소드는 고객 정보를 삭제할 때 사용
Service Layer - CustomerServiceImpl.java
이 코드는 CustomerService
인터페이스의 구현체인 CustomerServiceImpl
클래스를 정의. 고객 정보 관리와 관련된 실제 비즈니스 로직을 수행하며, **CustomerDAO
**에 정의된 데이터 액세스 메소드를 사용하여 데이터베이스 작업을 수행
CustomerDAO
타입의 customerDAO
필드에 대한 의존성을 자동으로 주입. 즉, Spring 컨테이너는 **CustomerDAO
**의 구현체를 찾아 **CustomerServiceImpl
**에 연결CustomerDAO
**의 getCustomers()
메소드를 호출하여 결과를 반환CustomerDAO
**의 saveCustomer(theCustomer)
메소드를 호출하여 매개변수로 받은 Customer
객체를 데이터베이스에 저장하거나 업데이트한다.CustomerDAO
**의 getCustomer(theId)
메소드를 호출하여 해당 ID의 고객 정보를 데이터베이스에서 조회한 후 반환CustomerDAO
**의 deleteCustomer(theId)
메소드를 호출하여 해당 ID의 고객 정보를 데이터베이스에서 삭제헌다.DAO Layer - CustomerDAO.java