이 프로젝트는 자바 소스 기반으로 Spring을 설정하므로 web.xml과 Spring Configuration 파일이 필요하지 않다.
database.properites
# datasource
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost
jdbc.user=scott
jdbc.pass=tiger
# hibernate
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
hibernate.show_sql=false
hibernate.hbm2ddl.auto=create
hibernate.cache.use_second_level_cache=false
hibernate.cache.use_query_cache=false
config - DispatcherServletJava
package spring_jpa.config;
import javax.servlet.Filter;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
//web.xml 역할
public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
//오라클 한글 처리
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return new Filter[] {characterEncodingFilter};
}
@Override
protected Class <?> [] getRootConfigClasses() {
return new Class[] {
JPAConfig.class
};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {
WebMvcConfig.class
};
}
@Override
protected String[] getServletMappings() {
return new String[] {
"/"
};
}
}
config- JPAConfig
package spring_jpa.config;
import java.util.Properties;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:database.properties" })
@ComponentScan({ "spring_jpa" })
@EnableJpaRepositories(basePackages = "spring_jpa.repository")
public class JPAConfig {
@Autowired
private Environment env;
public JPAConfig() {
super();
}
/**
* LocalContainerEntityManagerFactoryBean은
* EntityManagerFactoryBean을 Spring에서 사용하기 위한 클래스이며
*
* JPA는 여러 구현체가 존재하기 때문에 구현체별 설정을 지원하기 위한 클래스로
* 예제에서는 hibernate를 사용하기 때문에 HibernateJpaVendorAdapter를 사용한다.
* @return
*/
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setPackagesToScan(new String[] {"spring_jpa.entity"});
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
entityManagerFactoryBean.setJpaProperties(additionalProperties());
return entityManagerFactoryBean;
}
/**
* 하이버네이트 설정 정보
* @return
*/
final Properties additionalProperties() {
final Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", env.getProperty("hibernate.cache.use_second_level_cache"));
hibernateProperties.setProperty("hibernate.cache.use_query_cache", env.getProperty("hibernate.cache.use_query_cache"));
// hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true");
return hibernateProperties;
}
/**
* DB연결을 위한 데이터소스 정의
* @return
*/
@Bean
public DataSource dataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
dataSource.setUrl(env.getProperty("jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.user"));
dataSource.setPassword(env.getProperty("jdbc.pass"));
return dataSource;
}
/**
* 트랜잭션매니저 설정
* @param emf
* @return
*/
@Bean
public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) {
final JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
/**
* PersistenceExceptionTranslationPostProcessor는
* @Repository 클래스들에 대해 자동으로 예외를 Spring의 DataAccessException으로 일괄 변환.
* @return
*/
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
config - WebMvcConfig.java
package spring_jpa.config;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages={"spring_jpa"})
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver resolver =
new InternalResourceViewResolver();
resolver.setViewClass(JstlView.class);
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
// TODO Auto-generated method stub
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
// TODO Auto-generated method stub
}
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
// TODO Auto-generated method stub
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
// TODO Auto-generated method stub
}
@Override
public void addFormatters(FormatterRegistry registry) {
// TODO Auto-generated method stub
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// TODO Auto-generated method stub
}
@Override
public void addCorsMappings(CorsRegistry registry) {
// TODO Auto-generated method stub
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// TODO Auto-generated method stub
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// TODO Auto-generated method stub
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
// TODO Auto-generated method stub
}
@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
// TODO Auto-generated method stub
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// TODO Auto-generated method stub
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
// TODO Auto-generated method stub
}
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
// TODO Auto-generated method stub
}
@Override
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
// TODO Auto-generated method stub
}
@Override
public Validator getValidator() {
// TODO Auto-generated method stub
return null;
}
@Override
public MessageCodesResolver getMessageCodesResolver() {
// TODO Auto-generated method stub
return null;
}
}
controller - EmpController.java
package spring_jpa.controller;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import spring_jpa.entity.Emp;
import spring_jpa.service.EmpService;
@Controller
@RequestMapping("/")
public class EmpController {
private static final Logger LOG = LoggerFactory.getLogger(EmpController.class);
@Autowired
private EmpService empService;
@GetMapping("/list")
public String listemps(Model theModel) {
List <Emp> theEmps = empService.getEmps();
theModel.addAttribute("emps", theEmps);
return "empList";
}
@GetMapping("/showForm")
public String showFormForAdd(Model model) {
Emp emp = new Emp();
model.addAttribute("emp", emp);
return "empForm";
}
@PostMapping("/saveEmp")
public String saveEmp(@ModelAttribute("emp") Emp emp) {
empService.saveEmp(emp);
return "redirect:/list";
}
@GetMapping("/updateForm")
public String showFormForUpdate(@RequestParam("empno") int empno,
Model model) {
model.addAttribute("emp", empService.getEmp(empno));
return "empForm";
}
@GetMapping("/delete")
public String deleteEmp(@RequestParam("empno") int empno) {
empService.deleteEmp(empno);
return "redirect:/list";
}
}
entity - Emp.java
package spring_jpa.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "emp1")
public class Emp {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "empno")
private int empno;
@Column(name = "ename")
private String ename;
@Column(name = "addr")
private String addr;
@Column(name = "job")
private String job;
@Override
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + ", addr" + addr + ", job=" + job + "]";
}
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
repository - EmpRepository.java
package spring_jpa.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import spring_jpa.entity.Emp;
@Repository("empRepository")
public interface EmpRepository extends JpaRepository <Emp, Integer> {}
service - EmpService.java
package spring_jpa.service;
import java.util.List;
import java.util.Optional;
import spring_jpa.entity.Emp;
public interface EmpService {
public List <Emp> getEmps();
public void saveEmp(Emp emp);
public Optional<Emp> getEmp(int empno) ;
public void deleteEmp(int empno);
}
service - EmpServiceImpl
package spring_jpa.service;
import java.util.List;
import java.util.Optional;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import spring_jpa.entity.Emp;
import spring_jpa.repository.EmpRepository;
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpRepository empRepository;
@Override
@Transactional
public List <Emp> getEmps() {
return empRepository.findAll();
}
@Override
@Transactional
public void saveEmp(Emp emp) {
empRepository.save(emp);
}
@Override
@Transactional
public Optional<Emp> getEmp(int empno) {
return empRepository.findById(empno);
}
@Override
@Transactional
public void deleteEmp(int empno) {
empRepository.deleteById(empno);
}
}
'☕Java > Spring' 카테고리의 다른 글
[20210820] Lombok을 이용한 로그인, 게시판 2 - Lombok 애너테이션 정리 (0) | 2021.08.20 |
---|---|
[20210819] Lombok을 이용한 로그인, 게시판 예제 (0) | 2021.08.19 |
Spring Framework vs. Spring Boot 차이 (0) | 2021.08.13 |
Spring Web MVC 구조 (0) | 2021.08.11 |
[20210810] JPA를 이용한 DB 접근 (0) | 2021.08.10 |