본문 바로가기
☕Java/Spring

[20210817] JPA 사원관리 시스템 예제

by 캔 2021. 8. 17.

이 프로젝트는 자바 소스 기반으로 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);
    }
}