Create Maven Web Application
Add Dependencies - pom.xml File
SLF4J (Simple Logging Facade for Java) with JCL (Jakarta Commons Logging) bridge:
<groupId>org.slf4j</groupId>
**와 **<artifactId>jcl-over-slf4j</artifactId>
**를 사용하는 의존성은 Jakarta Commons Logging API 호출을 SLF4J로 전달하는 "브릿지" 또는 "어댑터" 이다.Logback:
<groupId>ch.qos.logback</groupId>
**와 **<artifactId>logback-classic</artifactId>
**를 사용하는 의존성은 로그백(Logback) 로깅 프레임워크의 클래식 모듈Project Structure
AppInitializer - Register a DispatcherServlet using Java-based Spring configuration
PersistenceJPAConfig - Spring Data JPA and Hibernate Configuration using Java-based Spring configuration
@Transactional
어노테이션이 붙은 메소드의 트랜잭션을 자동으로 관리database.properties
파일로부터 환경 속성을 로드하는 데 사용. 이 파일에는 데이터베이스 연결 정보와 같은 중요한 구성 속성이 포함net.javaguides.springmvc
패키지를 스캔하여 스프링 빈을 자동으로 감지하고 등록net.javaguides.springmvc.repository
패키지에 정의된 JPA 리포지토리를 스프링에 등록LocalContainerEntityManagerFactoryBean
**을 생성하고 구성하는 빈을 정의. 이 빈은 JPA 엔티티 매니저 팩토리를 생성하고, 데이터 소스와 엔티티 패키지를 설정DriverManagerDataSource
**를 생성하고 구성하는 빈을 정의. 이 메소드는 데이터베이스 연결에 필요한 정보(드라이버 클래스 이름, URL, 사용자 이름, 비밀번호)를 환경에서 로드하여 설정JpaTransactionManager
**를 생성하고 구성하는 빈을 정의. 이 트랜잭션 관리자는 JPA 엔티티 매니저 팩토리를 사용하여 트랜잭션을 관리PersistenceExceptionTranslationPostProcessor
빈을 등록WebMvcConfig - Spring MVC Bean Configuration using Java-based Spring configuration
JPA Entity - Customer.java
Spring MVC Controller Class - CustomerController.java
이 클래스는 **CustomerController
**라는 Spring MVC 컨트롤러를 정의하고 있습니다. 이 컨트롤러는 고객과 관련된 웹 요청을 처리
/customer
**로 시작해야 함을 나타냄CustomerService
타입의 객체를 자동으로 주입. 이 서비스는 고객 정보와 관련된 비즈니스 로직을 처리/customer/list
URL로 GET
요청이 들어오면 실행. 고객 목록을 조회하고, 모델에 **customers
**라는 속성으로 추가한 후, **list-customers
**라는 뷰 이름을 반환/customer/showForm
URL로 GET
요청이 들어오면 실행. 새 고객을 추가할 수 있는 폼을 표시하기 위해 빈 Customer
객체를 모델에 추가하고, customer-form
뷰 이름을 반환. 또한, 로그를 출력하여 메소드가 호출되었음을 디버그 레벨로 기록./customer/saveCustomer
URL로 POST
요청이 들어오면 실행. 폼에서 전송된 데이터를 Customer
객체로 바인딩하고, 이를 저장한 후 고객 목록 페이지로 리다이렉트./customer/updateForm
URL로 GET
요청과 함께 customerId
파라미터가 전송되면 실행. 해당 ID의 고객 정보를 조회하여 모델에 추가하고, customer-form
뷰를 반환./customer/delete
URL로 GET
요청과 함께 customerId
파라미터가 전송되면 실행. 해당 ID의 고객 정보를 삭제하고, 고객 목록 페이지로 리다이렉트Service Layer - CustomerService.java
List<Customer> getCustomers():
void saveCustomer(Customer theCustomer):
Customer
객체를 저장하거나 업데이트. 신규 고객을 추가하거나 기존 고객의 정보를 수정하는 데 사용.Customer getCustomer(int theId) throws ResourceNotFoundException:
ResourceNotFoundException
**을 던진다. 이는 고객 정보를 가져올 때 해당 고객이 데이터베이스에 없을 경우에 대한 예외 처리를 명시.void deleteCustomer(int theId) throws ResourceNotFoundException:
ResourceNotFoundException
예외를 던다.Service Layer - CustomerServiceImpl.java
**CustomerServiceImpl
**은 고객 데이터에 대한 비즈니스 로직을 처리하며, 이 로직은 주로 **CustomerRepository
**를 통해 데이터베이스 작업을 수행
CustomerRepository
인터페이스에 대한 의존성 주입을 자동으로 수행. Spring은 이 어노테이션을 통해 **CustomerRepository
**의 구현체를 **CustomerServiceImpl
**에 주입.CustomerRepository
**의 findAll()
메소드를 호출.CustomerRepository
**의 save(theCustomer)
메소드를 호출.CustomerRepository
**의 findById(id)
메소드를 호출하며, 결과가 존재하지 않을 경우 **ResourceNotFoundException
**을 던진다.CustomerRepository
**의 deleteById(theId)
메소드를 호출.Spring Data JPA Repository - CustomerRepository.java
Custom Exception - ResourceNotFoundException.java
이 코드는 사용자 정의 예외 **ResourceNotFoundException
**을 정의하는 Java 클래스
ResourceNotFoundException
**은 Exception
클래스를 상속받아 예외 처리 계층 구조에 통합serialVersionUID
필드를 선언해두면, 클래스가 Serializable
인터페이스의 규약을 준수하게 되며, JVM(Java Virtual Machine)이 클래스의 버전을 식별할 수 있게 해준다. 예외 객체가 직렬화되고 역직렬화될 때, **serialVersionUID
**는 클래스 버전의 호환성을 유지하는 데 사용.ResourceNotFoundException
**의 생성자는 리소스 식별자를 매개변수로 받고, 이를 문자열로 변환하여 부모 Exception
클래스의 생성자에 전달. 리소스 식별자가 **null
**이 아니라면, toString()
메소드를 호출하여 식별자의 문자열 표현을 얻고, 이를 예외 메시지로 사용. 리소스 식별자가 **null
**일 경우에는 **null
**을 전달JSP Views - customer-form.jsp
JSP Views - list-customers.jsp