100일 챌린지/빅데이터기반 인공지능 융합 서비스 개발자

service-api

ksyke 2024. 10. 17. 10:04

목차

    SERVICE

    pom.xml

    java version up

            <java-version>1.8</java-version>
            ...
            ...
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <compilerArgument>-Xlint:all</compilerArgument>
                        <showWarnings>true</showWarnings>
                        <showDeprecation>true</showDeprecation>
                    </configuration>

    spring version up

    <org.springframework-version>5.3.39</org.springframework-version>

    spring (jdbc,tx,aop,test) 추가

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${org.springframework-version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>${org.springframework-version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>${org.springframework-version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${org.springframework-version}</version>
            </dependency>

    aspectj 추가

            <!-- AspectJ -->
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjrt</artifactId>
                <version>${org.aspectj-version}</version>
            </dependency>    
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>${org.aspectj-version}</version>
            </dependency>

    servlet 버전업

            <!-- Servlet -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.1</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>

    junit 버전업

            <!-- Test -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13</version>
                <scope>test</scope>
            </dependency>

    lombok,mybatis,dbcp,h2,jacksonbind 추가

            <!-- user add libs -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.34</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>2.0.6</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.6</version>
            </dependency>
            <dependency>
                <groupId>commons-dbcp</groupId>
                <artifactId>commons-dbcp</artifactId>
                <version>1.4</version>
            </dependency>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>1.4.200</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.15.2</version>
            </dependency>

    dept.model

    DeptVo

    package com.semiproject.test49.dept.model;
    
    import lombok.AllArgsConstructor;
    import lombok.Builder;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public class DeptVo {
        private int deptno;
        private String dname,loc;
    }

    DeptDao(Interface)

    package com.semiproject.test49.dept.model;
    
    import java.util.List;
    
    public interface DeptDao {
        List<DeptVo> pullList();
        DeptVo getList(int idx);
        int addList(DeptVo bean);
        int setList(DeptVo bean);
        int rmList(int idx);
    }

    DeptDaoImpl

    package com.hotels.api01.model;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.stereotype.Repository;
    
    //@Repository
    public class DeptDaoImpl implements DeptDao {
    	@Autowired
    	JdbcTemplate jdbcTemplate;
    	RowMapper<DeptVo> rowMapper =new RowMapper<DeptVo>() {
    		
    		@Override
    		public DeptVo mapRow(ResultSet rs, int rowNum) throws SQLException {
    			return DeptVo.builder()
    					.deptno(rs.getInt("deptno"))
    					.dname(rs.getString("dname"))
    					.loc(rs.getString("loc"))
    					.build();
    		}
    	};
    	@Override
    	public List<DeptVo> pullList(){
    		return jdbcTemplate.query("select * from dept", rowMapper);
    	}
    	
    	@Override
    	public void addList(DeptVo bean) {
    		jdbcTemplate.update("insert into dept (deptno,dname,loc) values (?,?,?)"
    				,bean.getDeptno(),bean.getDname(),bean.getLoc()); 
    	}
    
    	@Override
    	public DeptVo getList(int deptno) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	@Override
    	public int setList(DeptVo bean) {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    
    	@Override
    	public int rmList(int deptno) {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    }

    .config

    RootConfig

    package com.hotels.api01.config;
    
    import javax.sql.DataSource;
    
    import org.apache.commons.dbcp.BasicDataSource;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.EnableAspectJAutoProxy;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.transaction.TransactionManager;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    @Configuration
    @ComponentScan(basePackages = {"com.hotels.api01"})
    @MapperScan("com.hotels.api01.model")
    @EnableAspectJAutoProxy
    @EnableTransactionManagement
    public class RootConfig {
    	
    	@Bean
    	public DataSource dataSource() {
    		BasicDataSource dataSource=new BasicDataSource();
    		dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    		dataSource.setUrl("jdbc:mysql://localhost:3306/xe");
    		dataSource.setUsername("scott");
    		dataSource.setPassword("tiger");
    		return dataSource;
    	}
    	
    	@Bean
    	public JdbcTemplate jdbcTemplate() {
    		JdbcTemplate template=new JdbcTemplate();
    		template.setDataSource(dataSource());
    		return template;
    	}
    	
    	@Bean
    	public TransactionManager transactionManager() {
    		DataSourceTransactionManager transaction;
    		transaction=new DataSourceTransactionManager(dataSource());
    		return transaction;
    	}
    
    	@Bean
    	public SqlSessionFactory sqlSessionFactory() throws Exception {
    		SqlSessionFactoryBean factory=new SqlSessionFactoryBean();
    		factory.setDataSource(dataSource());
    		return factory.getObject();
    	}
    }

    ServletConfig

    package com.hotels.api01.config;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    import org.springframework.web.servlet.view.InternalResourceViewResolver;
    
    @EnableWebMvc
    @ComponentScan(basePackages = {"com.hotels.api01"})
    public class ServletConfig implements WebMvcConfigurer{
    	
    	@Override
    	public void configureViewResolvers(ViewResolverRegistry reg) {
    		InternalResourceViewResolver viewResolver=null;
    		viewResolver=new InternalResourceViewResolver();
    		viewResolver.setPrefix("/WEB-INF/views/");
    		viewResolver.setSuffix(".jsp");
    		reg.viewResolver(viewResolver);
    	}
    	
    	@Override
    	public void addResourceHandlers(ResourceHandlerRegistry reg) {
    		reg.addResourceHandler("/resources/**")
    			.addResourceLocations("/resources/");
    	}
    }

    WebConfig

    package com.hotels.api01.config;
    
    import javax.servlet.Filter;
    
    import org.springframework.web.filter.CharacterEncodingFilter;
    import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
    
    public class WebConfig 
    	extends AbstractAnnotationConfigDispatcherServletInitializer{
    
    	@Override
    	protected Class<?>[] getRootConfigClasses() {
    		return new Class[] {RootConfig.class};
    	}
    
    	@Override
    	protected Class<?>[] getServletConfigClasses() {
    		return new Class[] {ServletConfig.class};
    	}
    
    	@Override
    	protected String[] getServletMappings() {
    		return new String[] {"/"};
    	}
    	
    	@Override
    	protected Filter[] getServletFilters() {
    		CharacterEncodingFilter filter=null;
    		filter=new CharacterEncodingFilter();
    		filter.setEncoding("utf-8");
    		filter.setForceEncoding(true);
    		return new Filter[] {filter};
    	}
    }

    HomeController

    package com.hotels.api01;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    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.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.hotels.api01.model.DeptDao;
    import com.hotels.api01.model.DeptVo;
    import com.hotels.api01.model.HotelsDao;
    
    @RestController
    public class HomeController {
    	@Autowired
    	DeptDao deptDao;
    	@Autowired
    	HotelsDao hotelsDao;
    	
    //	@RequestMapping("/")
    //	public String home() {
    //		return "home";
    //	}
    	
    	@RequestMapping(value = "/", method = RequestMethod.GET)
    	public ResponseEntity<?> home() {
    		return ResponseEntity.ok(deptDao.pullList());
    	}
    	@RequestMapping(value = "/hotels/", method = RequestMethod.GET)
    	public ResponseEntity<?> hotels() {
    		return ResponseEntity.ok(hotelsDao.pullList());
    	}
    	
    	@PostMapping("/")
    	public ResponseEntity<?> add(@ModelAttribute DeptVo bean){
    		deptDao.addList(bean);
    		return ResponseEntity.ok().build();
    	}
    }

    WEB

    pom.xml

    java version up

            <java-version>1.8</java-version>
            ...
            ...
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <compilerArgument>-Xlint:all</compilerArgument>
                        <showWarnings>true</showWarnings>
                        <showDeprecation>true</showDeprecation>
                    </configuration>

    spring version up

    <org.springframework-version>5.3.39</org.springframework-version>

    servlet version up

            <!-- Servlet -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.1</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>

    junit 버전업

            <!-- Test -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13</version>
                <scope>test</scope>
            </dependency>

    lombok,jacksonbind 추가

            <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.34</version>
                <scope>provided</scope>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.15.2</version>
            </dependency>

    projname.model

    DeptVo

    package com.semiproject.test50.model;
    
    import lombok.AllArgsConstructor;
    import lombok.Builder;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class DeptVo {
    	private int deptno;
    	private String dname,loc;
    }

    projname

    HomeController

    package com.semiproject.test50;
    
    import java.net.URI;
    
    import org.springframework.http.HttpEntity;
    import org.springframework.http.HttpMethod;
    import org.springframework.http.RequestEntity;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.util.LinkedMultiValueMap;
    import org.springframework.util.MultiValueMap;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.client.RestTemplate;
    import org.springframework.web.util.UriComponentsBuilder;
    
    import com.fasterxml.jackson.core.JsonFactory;
    import com.semiproject.test50.model.DeptVo;
    
    @Controller
    public class HomeController {
    	
    	@GetMapping("/")
    	public String index() {
    		return "index";
    	}
    	@GetMapping("/intro")
    	public void intro() {}
    	
    	@GetMapping("/emp/")
    	public String emp() {
    		return "emp";
    	}
    	@GetMapping("/dept/")
    	public String dept(Model model) {
    		RestTemplate template=new RestTemplate();
    		String msg=template.getForObject("http://localhost:8080/day49/api/dept/", String.class);
    		model.addAttribute("list", msg);
    		return "dept";
    	}
    	@PostMapping("/dept/")
    	public String dept(String dname, String loc) {
    		RestTemplate template=new RestTemplate();
    		URI url=UriComponentsBuilder
    				.fromUriString("http://localhost:8080")
    				.path("/test49/api/dept/")
    				.queryParam("dname", dname)
    				.queryParam("loc", loc)
    				.build().toUri()
    				;
    		template.postForLocation(url, null);
    		return "redirect:./";
    	}
    	@GetMapping("/dept/add")
    	public String add() {
    		return "add";
    	}
    	@GetMapping("/dept/{deptno}")
    	public String detail(@PathVariable int deptno,Model model) {
    		RestTemplate template=new RestTemplate();
    		DeptVo msg=template.getForObject("http://localhost:8080/test49/api/dept/"+deptno, DeptVo.class);
    //		ResponseEntity<DeptVo> msg=template.getForEntity("http://localhost:8080/day49/api/dept/"+deptno, DeptVo.class);
    //		System.out.println(msg.getHeaders());
    //		System.out.println(msg.getBody());
    		model.addAttribute("bean", msg);
    		return "detail";
    	}
    	@PostMapping("/dept/{deptno}")
    	public String edit(@PathVariable int deptno,@ModelAttribute DeptVo bean) {
    		RestTemplate template=new RestTemplate();
    		
    		MultiValueMap<String, String> headers=new LinkedMultiValueMap();
    		headers.add("Content-Type", "application/json");
    //		
    		String body="{\"dname\":\""+bean.getDname()
    						+"\",\"loc\":\""+bean.getLoc()+"\",\"deptno\":"+bean.getDeptno()+"}";
    //		
    		HttpEntity requestEntity=new HttpEntity<String>(body, headers);
    //		ResponseEntity<String> msg=template.exchange("http://localhost:8080/day49/api/dept/"+deptno
    //				, HttpMethod.PUT, requestEntity, String.class,new Object[] {});
    //		System.out.println(msg.getBody());
    		
    		URI url=UriComponentsBuilder.fromUriString("http://localhost:8080")
    				.path("/test49/api/dept/"+deptno).build().toUri();
    		template.exchange(url, HttpMethod.PUT, requestEntity, String.class);
    		return "redirect:./";
    	}
    	@GetMapping("/hotels/")
    	public String hotels(Model model) {
    		RestTemplate template=new RestTemplate();
    		List<HotelsVo> msg=template.getForObject("http://localhost:8080/api01/hotels/", List.class);
    		model.addAttribute("list", msg);
    		return "hotels";
    	}
    }

    /WEB-INF/views/

    /template/menu.jspf

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    	<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    	<c:set value="${pageContext.request.contextPath }" var="root"/>
    	<ul>
    		<li><a href="${root }/">home</a></li>
    		<li><a href="${root }/intro">intro</a></li>
    		<li><a href="${root }/emp/">emp</a></li>
    		<li><a href="${root }/dept/">dept</a></li>
    	</ul>

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <%@ include file="template/menu.jspf" %>
    <div class="container">
    	<div class="jumbotron">
    		<h2>index page</h2>
    	</div>
    </div>
    	
    </body>
    </html>

    dept.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <%@ include file="template/menu.jspf" %>
    <div class="container">
    	<div class="jumbotron">
    		<h2>dept page</h2>
    	</div>
    	<table>
    		<thead>
    			<tr>
    				<th>deptno</th>
    				<th>dname</th>
    				<th>loc</th>
    			</tr>
    		</thead>
    		<tbody>
    		</tbody>
    	</table>
    	<p><a href="add">입력</a></p>
    </div>
    <script type="text/javascript">
    var arr=${list};
    var table=document.querySelector('table');
    var tbody=table.querySelector('tbody');
    tbody.innerHTML=arr.map(
    		ele=>'<tr><td><a href="./'+ele.deptno+'">'+ele.deptno
    				+'</a></td><td>'+ele.dname
    				+'</td><td>'+ele.loc+'</td><tr>'
    		).reduce((a,b)=>a+b);
    </script>
    </body>
    </html>

    hotels.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    
    </head>
    <body>
    <div class="container">
    	<div class="jumbotron">
    		<h2>hotels page</h2>
    	</div>
    	<table>
    		<thead>
    			<tr>
    				<th>hotel_id</th>
    				<th>hotel_name</th>
    				<th>location</th>
    			</tr>
    		</thead>
    		<tbody>
    		<!-- 
    		 -->
    			<c:forEach items="${list }" var="bean">
    				<tr>
    					<td>${bean.hotel_id }</td>
    					<td>${bean.hotel_name }</td>
    					<td>${bean.location }</td>
    				</tr>
    			</c:forEach>
    		</tbody>
    	</table>
    	<p><a href="add">입력</a></p>
    </div>
    <!-- 
    <script type="text/javascript">
    var arr=${list};
    var table=document.querySelector('table');
    var tbody=table.querySelector('tbody');
    tbody.innerHTML=arr.map(
    		ele=>'<tr><td><a href="./'+ele.hotel_id+'">'+ele.hotel_id
    				+'</a></td><td>'+ele.hotel_name
    				+'</td><td>'+ele.location+'</td><tr>'
    		).reduce((a,b)=>a+b);
    </script>	
     -->
    </body>
    </html>