์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํ์ฌ ์ํ์ ์กฐํํ ์ ์๋ ๊ฒ์ํ์ ๋ง๋ค์ด๋ณด์
1. product ํ๋ก์ ํธ ์์ฑ
1) ๊ธฐ๋ณธ ์ ํ
๋ฉ์ด๋ธ ๋ฐฉ์ ์ฌ์ฉํ ๊ฒ์ด๋ฉฐ ์๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑ ์์ ํจ๊ฒ ๋ง๋ค์ด ์ค ๊ฒ์ด๋ค.
2) Tomcat Jasper ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
jspํ์ด์ง๋ ์คํ๋ง์ด ์ง์ํ์ง์์ ๋ฐ๋ก ์ถ๊ฐํด์ผ๊ฒ ๋ค.
-pom.xml ์ ์ถ๊ฐ
<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jasper -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper</artifactId>
<version>9.0.22</version>
</dependency>
๋ค์ ์คํํด๋ณด๋ฉด jasperrk ์ถ๊ฐ ๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
์์๋ก ํด๋๋ฅผ ์ง์ ํด์ ๋ง๋ค์ด ์ค๋ค.
- ์ค์ ํ์ผ ์์ (yml)
server:
port: 8080
servlet:
context-path: /
spring:
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
๋ฌธ์์ ๊ฐ๋ ์ฑ์ ์ํด ymlํ์ผ๋ก ์์ ํ jspํ์ด์ง๋ฅผ ์ธ์ํ๊ธฐ ์ํ ์ค์ ์ฝ๋๋ฅผ ๋ฃ๋๋ค.
์ด๋ ๋ด๋ถํฐ์บฃ์ ํฌํธ๋ฒํธ์ context-path๋ฅผ ํจ๊ป ์ค์ ํด ์ฃผ์๋ค.
-productController
package com.seoha.product.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class ProductController { @GetMapping({"","/"}) public String index() { return "index"; } }
indexํ์ด์ง๋ฅผ ๋ง๋ค์ด์ ๋์คํจ์ฒ๊ฐ ์ ๋์ ์ฑ๋๊ฐ jasper๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ค์ ์ด ๋ง๊ฒ ๋์๋์ง ํ์ธ
3) mysql, mybatis ์ค์ ํ๊ธฐ
- mysql์ ์ฌ์ฉ์์ ํ ์ด๋ธ์ ํจ๊ป ๋ง๋ ๋ค.
์ฌ์ฉ์๋ ์์์ ๋ง๋ค์๋ spring์ ์ฌ์ฉํ๊ณ ํ ์ด๋ธ๋ง ๋ง๋ค์ด์ผ๊ฒ ๋น
CREATE TABLE product(
id int AUTO_INCREMENT PRIMARY KEY,
name varchar(100) not null,
price int not null,
orderCount int,
type varchar(100)
)ENGINE=InnoDB DEFAULT CHARSET = utf8;
- model ๋ง๋ค๊ธฐ
์์ด๋๋ DB์์ ์คํ ๋ฅผ ๊ฑธ์ด์คฌ๊ธฐ๋๋ฌธ์ ์์ฑ์๋ ๋กฌ๋ถ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ์ง์๊ณ id๋ง ๋นผ๊ณ ๋ฐ๋ก ์์ฑ์๋ฅผ ๋ง๋ค์ด์ฃผ์๋น. builder๋ฅผ ์ธ ๊ณํ์ ์์ง ์์๊ฑฐ ๊ฐ์ง๋ง ํน์ ๋ชจ๋ฅผ ๊ธฐ๋ฅ์ ์ํด ๋น๋๋ฅผ ๊ฑธ์ด๋๋๋น.
package com.seoha.product.model;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@Data
public class Product {
private int id;
private String name;
private int price;
private int orderCount;
private String type;
@Builder
public Product(String name, int price, int orderCount, String type) {
super();
this.name = name;
this.price = price;
this.orderCount = orderCount;
this.type = type;
}
}
- ymlํ์ผ์ ์ถ๊ฐ
datasource:
url: jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul
username: spring
password: bitc5600
driver-class-name: com.mysql.cj.jdbc.Driver
jsp๋ก mysqlํ ๋๋ ๋ค๋ฅธ๊ฒ ์๋ค! ์ฌ๊ธฐ์๋ ์๋ฒํ์์กด์ ์ค์ ํด์ค๋ค!
- config ํจํค์ง ๋ง๋ค์ด์ mybatis์ค์ ํ์ผ ๋ณต๋ถํ๊ธฐ
- DataAccessConfig
๋ณต๋ถ๋ง ํ๋ฉด ๋๋๋ฐ ๋ฒ ์ด์คํจํค์ง๋ repository ํจํค์ง๋ฅผ ๋ฐ๋ผ๋ณผ์์๊ฒ ์ ํ ํด์ค๋ค.
๋ ๋งคํผ์ xmlํ์ผ์ ๋ง๋ค์ด์ค๋ค
package com.seoha.product.config;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
@Configuration
@MapperScan(basePackages = "com.seoha.product.repository")
public class DataAccessConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
return sessionFactory.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
- DataSourceConfig
package com.seoha.product.config;
import javax.sql.DataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DataSourceConfig {
@ConfigurationProperties(prefix="spring.datasource")
public DataSource dataSource(){
return DataSourceBuilder.create().build();
}
}
-mapper/product.xml
๋ ํ์ ์ ๋ง๊ฒ ๋ฟ๋ฆฌ๊ธฐ๋ง ํ๋ฉด ๋๊ธฐ์ selete๋ง ์ฌ์ฉ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace="com.seoha.baseball.repository.BaseballRepository">
<select id="findAll" resultType="com.seoha.baseball.model.Baseball">
select * from baseball
</select>
</mapper>
- com.seoha.product.repository.ProductRepository ์ธํฐํ์ด์ค ๋ง๋ค๊ธฐ
package com.seoha.product.repository;
import java.util.List;
import com.seoha.product.model.Product;
public interface ProductRepository {
List<Product> findAll();
}
4. jspํ์ด์ง์ ์ถ๋ ฅํ๊ธฐ
-productController์ถ๊ฐ
๊ฐ๋จํ๊ฒ ๋ง๋ ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ ๋ณด๋ฅผ ๋ชจ๋ธ์ ์ ์ฅํ์๋น
@Controller
public class ProductController {
@Autowired
private ProductRepository productRepository;
@GetMapping({ "", "/" })
public String index(Model model) {
List<Product> products = productRepository.findAll();
model.addAttribute("products", products);
return "product";
-product์ ๋ฟ๋ฆฌ๊ธฐ
<table border="1">
<tr id="title">
<th>id</th>
<th>name</th>
<th>price</th>
<th>orderCount</th>
<th>type</th>
</tr>
<c:forEach var="product" items="${products}">
<tr class="item">
<td>${product.id}</td>
<td>${product.name}</td>
<td>${product.price}</td>
<td>${product.orderCount}</td>
<td>${product.type}</td>
</tr>
</c:forEach>
</table>
์ด๋ ๊ฒ ์คํ๋ง์ ์ด์ฉํด์ ๋ฟ๋ ค๋ณด์๋น
'java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
AJAX ์ฌ์ฉ๋ฒ (0) | 2021.02.27 |
---|---|
์คํ๋ง - ์ํ ์กฐํ ๊ฒ์ํ ๋ง๋ค๊ธฐ(2) (0) | 2021.02.27 |
์คํ๋ง - ์ ํจ์ฑ๊ฒ์ฌ, ํ์ผ์ ๋ก๋ (0) | 2021.02.27 |
์คํ๋ง mysql ์ฐ๊ฒฐํ๊ธฐ (0) | 2021.02.27 |
JSP๋ฅผ ์ด์ฉํ ์ ํ ์๊ฐ ํํ์ด์ง ๋ง๋ค๊ธฐ (0) | 2021.02.27 |