์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- html
- ๋ฐ์ํ
- K๋ฐฐํฐ๋ฆฌ๋ ๋ณผ๋ฃจ์
- Python
- ์นํ์ด์ง๋ง๋ค๊ธฐ
- ์นํผ๋ธ๋ฆฌ์ฑ
- ๋ฆฌ์กํธ
- ๊น๋ฏธ๊ฒฝ์๋งํ์์
- css
- ์ํ
- JavaScript
- ์ปดํจํฐ๊ณผํ
- ๋ผํ๋ผ์ค์๋ง๋
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ฝ๋ฉ
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ์ค๋ธ์
- ํ๋ก๊ทธ๋๋ฐ
- ์๋ฐ
- ComputerScience
- ์ฑ
- Java
- ๋ ์
- ์ค๋ผํด
- database
- ๊ฐ๋ฐ
- K๋ฐฐํฐ๋ฆฌ
- ํ์ด์ฌ
- ์๋ฐ์คํฌ๋ฆฝํธ
- ๋ง์ผ๋ด๊ฐ์ธ์์๋ค์์ฐ๋ค๋ฉด
- Today
- Total
JiYoung Dev ๐ฅ
[Spring Boot] Spring Boot - react ์ฐ๋ ์ค๋น (2023.06.07) ๋ณธ๋ฌธ
[Spring Boot] Spring Boot - react ์ฐ๋ ์ค๋น (2023.06.07)
Shinjio 2023. 6. 7. 17:34
Spring Boot - React ์ฐ๋ ์ค๋น
1. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ์ค๋น
auto_increment
์๋์ผ๋ก ์ซ์ ๋ค์ด๊ฐ๋๋ก ํ๊ณ ์ถ์ ๋ ์ฌ์ฉ!
ํด๋นํ๋ ๊ฐ์ ์ฑ์ฐ์ง ์์ผ๋ฉด ๋จ
2. ํ๋ก์ ํธ ์์ฑ
3. application.properties ์์ฑ >> ๊ธฐ๋ณธ ์ค์
#context-root : ์๋ฒ์์์ ๋์ํ๋ ํ๋ก์ ํธ๋ฅผ ๊ตฌ๋ณํ๊ธฐ ์ํ ๊ฒฝ๋ก
#๋ฌด์กฐ๊ฑด slash๋ก ์์
server.servlet.context-path=/shop
#server port number
server.port=8090
#view(jsp) : prefix, suffix
spring.mvc.view.prefix=/WEB-INF/Views/
spring.mvc.view.suffix=.jsp
# EX. DB์ฐ๊ฒฐ์ ๋ณด
spring.datasource.url=jdbc:mysql://localhost:3306/Boot?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=fullstack
spring.datasource.password=12345
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
4. ๊ธฐ๋ณธ ๊ตฌ์กฐ ๋ง๋ค๊ธฐ
4-1. ํจํค์ง ์์ฑ
4-2. mapper ๋งค์นญ์ ์ํ ํด๋ ์์ฑ
4-3. ํด๋์ค ํ์ผ ์์ฑ
1) ๋ฐ์ดํฐ (๋ชจ๋ธ)
package com.smhrd.shop.domain;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class Product {
private String ptype;
private String pcode;
private String pname;
private int price;
private String color;
private String img;
}
2) ProductController, ProductService, Product mapper ์ธํฐํ์ด์ค ๋ฐ XML ํ์ผ ์์ฑ
2-1) ProductController
package com.smhrd.shop.controller;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.smhrd.shop.service.ProductService;
@RestController
//CORS : Cross-Origin
@CrossOrigin("http://localhost:3000")
public class ProductController {
//1. ๋ชจ๋ ์ํ ์ ๋ณด ๋ถ๋ฌ์ค๊ธฐ
//2. ํน์ ์ํ 1๊ฐ์ ๋ํ ์ ๋ณด ๋ถ๋ฌ์ค๊ธฐ
//๋ทฐ๋ฅผ ๋ฐํํ์ง ์๊ณ ๋ชจ๋ธ๋ง ๋ฐํํ ๊ฒ! (๋ทฐ๋ react๋ก ๋ณด์ฌ์ค ์์ ) >> RestController
@Autowired
private ProductService service;
//1. ๋ชจ๋ ์ํ ์ ๋ณด ๋ถ๋ฌ์ค๊ธฐ
@GetMapping("/")
public JSONArray productList() {
JSONArray array = service.productList();
return array;
}
//2. ํ๊ฐ ์ํ ์ ๋ณด ๋ถ๋ฌ์ค๊ธฐ
@GetMapping("/{pcode}")
public JSONObject productOne(@PathVariable("pcode") String pcode) {
JSONObject obj = service.productOne(pcode);
return obj;
}
}
๋ฆฌ์กํธ์ ์ฐ๋ํ๊ธฐ ์ํด Cross-Origin ์ด๋ ธํ ์ด์ ์ถ๊ฐ
2-2) ProductService
jsonArray๊ฐ์ ธ๋ก๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ํ์
<dependency>
<groupId>co
m.googlecode.json-simple
</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
package com.smhrd.shop.service;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;
import com.smhrd.shop.converter.ImageToBase64;
import com.smhrd.shop.converter.imageConverter;
import com.smhrd.shop.domain.Product;
import com.smhrd.shop.mapper.ProductMapper;
@Service
public class ProductService {
@Autowired
private ProductMapper mapper;
@Autowired
private ResourceLoader resourceLoader; //ํน์ ๊ฒฝ๋ก์ ์๋ ํ์ผ ๊ฐ์ ธ์ค๊ธฐ
//product ์ ์ฒด ์ ๋ณด ๋ถ๋ฌ์ค๊ธฐ
public JSONArray productList() {
List<Product> list = mapper.productList();
//ํ์ฌ list์์ img๋ ํ์ผ๋ช
๋ง ๊ฐ์ง๊ณ ์์(์ค์ ํ์ผX).
//์ค์ ํ๋ก ํธ์ ๋๊ฒจ์ค ๋๋ ์ด๋ฏธ์ง ์์ฒด๋ฅผ ๋๊ฒจ์ฃผ์ด์ผ ํจ!
//๋ถํธ ์๋ฒ์ ์ด๋ฏธ์ง ์ ์ฅ >> ์ด๋ฏธ์ง ์์ฒด๋ฅผ ๋ฆฌ์กํธ๋ก ๋๊ธธ ์์
//Product์ ์๋ ์ด๋ฏธ์ง๋ฅผ ํตํด์ ์ค์ ํ์ผ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์ค์ ํ์ผ์ ๊ฐ์ง๊ณ ์์ผํจ (static/img/...)
//์คํ๋ง์์ ๋ฆฌ์กํธ๋ก ํ์ผ์ ์๋ตํด์ค ๋ ํ์ผ์ ํํ๊ฐ ๊ต์ฅํ ์ค์ํจ!
//ํ์ผ ์์ฒด๋ฅผ ๋๊ธธ ์๋ ์์
//์ด๋ป๊ฒ ๋ณด๋ด์ผ ํ๋, ์ปดํจํฐ๊ฐ ์์๋ค์ ์ ์๋ ๋ฌธ์(๋ฐ์ดํธ) ํํ๋ก ๋ณ๊ฒฝํด์ผ ํจ
//์ด๋ฏธ์ง ์์ฒด๋ ๋ฌธ์๋ก ๋ฐ๊พธ๋ ๊ฒ!
//์ต์ข
์ ์ผ๋ก๋ Product์ img ํ๋ ๊ฐ(ํ์ผ ์ด๋ฆ)์ ์ด๋ฏธ์ง๋ฅผ byte๋ก ๋ณํ๋ ๋ฌธ์์ด๋ก ๋ฐ๊พผ๊ฑธ๋ก ์์ ํด์ผํจ
//JsonArray์ JsonObject๊ฐ ๋ค์ด์๋ ํ์์ผ๋ก ์๋ต
//List >> JsonArray
JSONArray jsonArray = new JSONArray();
//List์์ Product >> JsonObject
imageConverter<File,String> converter = new ImageToBase64();
for(Product p : list) {
//1. img ํ๋๊ฐ ์์ (ํ์ผ์ด๋ฆ >> ์ด๋ฏธ์ง ๋ฐ์ดํธ ๋ฌธ์์ด ํํ๋ก ๋ณํ)
//1-1. ๋ณํํ ํ์ผ ์ค์ ๊ฒฝ๋ก ์ ์
String filePath = "classpath:/static/img/" + p.getImg();
Resource resource = resourceLoader.getResource(filePath); //ํ์ผ์ ๋ํ ๋ฉํ ๋ฐ์ดํฐ ๋ฐํ
String fileStringValue = null;
try {
fileStringValue = converter.convert(resource.getFile());
}catch(IOException e) {
e.printStackTrace();
}
//๊ฐ์ง๊ณ ์จ product img๋ฅผ ๋ณํ๋ ๋ฐ์ดํธ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝ
p.setImg(fileStringValue);
//2. Product ๊ฐ์ฒด๋ฅผ JSONObject ํํ(key:value)๋ก ๋ณํ
JSONObject obj = new JSONObject(); //๋น์ด์๋ jsonObject ์์ฑ
obj.put("product", p); //jsonObject์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ฅ๋ product ๊ฐ์ฒด ์ ์ฅ
jsonArray.add(obj); //JsonArray์ JsonObject ์ถ๊ฐ
}
return jsonArray;
}
public JSONObject productOne(String pcode) {
Product product = mapper.productOne(pcode);
imageConverter<File,String> converter = new ImageToBase64();
String filePath = "classpath:/static/img/" + product.getImg();
Resource resource = resourceLoader.getResource(filePath);
String fileStringValue = null;
try {
fileStringValue = converter.convert(resource.getFile());
}catch(IOException e) {
e.printStackTrace();
}
product.setImg(fileStringValue);
JSONObject obj = new JSONObject();
obj.put("product", product);
return obj;
}
}
2-3) Product mapper ์ธํฐํ์ด์ค
package com.smhrd.shop.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.json.simple.JSONObject;
import com.smhrd.shop.domain.Product;
@Mapper
public interface ProductMapper {
//Product ์ ์ฒด ์ ๋ณด ๋ถ๋ฌ์ค๊ธฐ
public List<Product> productList();
//Product ํ ๊ฐ ์ ๋ณด ๋ถ๋ฌ์ค๊ธฐ
public Product productOne(String pcode);
}
2-4) Product mapper.XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper๋ ํ์ผ์ด ์ฌ๋ฌ๊ฐ์ผ ์ ์์ ์ด๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด namespace ์์ฑ
namespace๋ mapper ์๋ ๊ฒฝ๋ก ๊ทธ๋๋ก ์์ฑ -->
<mapper namespace="com.smhrd.shop.mapper.ProductMapper">
<select id="productList" resultType="com.smhrd.shop.domain.Product">
select * from product;
</select>
<select id="productOne" resultType="com.smhrd.shop.domain.Product">
select * from product where pcode = #{pcode}
</select>
</mapper>
4-4. img ํ์ผ ๋ณํ์ ์ํ ํด๋์ค ํ์ผ ์์ฑ
//ํ์ฌ list์์ img๋ ํ์ผ๋ช ๋ง ๊ฐ์ง๊ณ ์์(์ค์ ํ์ผX).
//์ค์ ํ๋ก ํธ์ ๋๊ฒจ์ค ๋๋ ์ด๋ฏธ์ง ์์ฒด๋ฅผ ๋๊ฒจ์ฃผ์ด์ผ ํจ!
//๋ถํธ ์๋ฒ์ ์ด๋ฏธ์ง ์ ์ฅ >> ์ด๋ฏธ์ง ์์ฒด๋ฅผ ๋ฆฌ์กํธ๋ก ๋๊ธธ ์์
//Product์ ์๋ ์ด๋ฏธ์ง๋ฅผ ํตํด์ ์ค์ ํ์ผ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์ค์ ํ์ผ์ ๊ฐ์ง๊ณ ์์ผํจ (static/img/...)
//์คํ๋ง์์ ๋ฆฌ์กํธ๋ก ํ์ผ์ ์๋ตํด์ค ๋ ํ์ผ์ ํํ๊ฐ ๊ต์ฅํ ์ค์ํจ!
//ํ์ผ ์์ฒด๋ฅผ ๋๊ธธ ์๋ ์์
//์ด๋ป๊ฒ ๋ณด๋ด์ผ ํ๋, ์ปดํจํฐ๊ฐ ์์๋ค์ ์ ์๋ ๋ฌธ์(๋ฐ์ดํธ) ํํ๋ก ๋ณ๊ฒฝํด์ผ ํจ
//์ด๋ฏธ์ง ์์ฒด๋ ๋ฌธ์๋ก ๋ฐ๊พธ๋ ๊ฒ!
//์ต์ข ์ ์ผ๋ก๋ Product์ img ํ๋ ๊ฐ(ํ์ผ ์ด๋ฆ)์ ์ด๋ฏธ์ง๋ฅผ byte๋ก ๋ณํ๋ ๋ฌธ์์ด๋ก ๋ฐ๊พผ๊ฑธ๋ก ์์ ํด์ผํจ
1) ์ด๋ฏธ์ง ํ์ผ ์๋ฒ์ ์ฌ๋ฆฌ๊ธฐ
resources > static ํด๋ ์๋์ ์ฌ๋ฆฌ๊ธฐ
์ด๋ฏธ์ง ํ์ผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ํด๋์ค ์์ฑ
4-2) ํจํค์ง ์์ฑ
4-3) ํด๋์ค ์์ฑ
imageConverter
file์ String์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ์ถ์ ๋ฉ์๋ ์์ฑ
package com.smhrd.shop.converter;
import java.io.IOException;
//F : ํ์ผ
//S : ํ์ผ์ ์ด๋ค ํํ๋ก ๋ณํํ ์ง ์ง์ (๋ฐ์ดํธ ํํ์ ๋ฌธ์์ด : String)
public abstract class imageConverter<F, S> {
//<> : Generic, ์ฌ์ฉ์๊ฐ ํ์ํ ๋ ํํ๋ฅผ ์ง์ ํ ์ ์์
//์ค์ ๋ณํํ ๋ ์ค๋ฒ๋ผ์ด๋ฉ ํ ์ถ์ ๋ฉ์๋ ์ ์
public abstract S convert(F f) throws IOException;
}
ImageToBase64
imageConverter์ converter๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ
Base64 ๋ผ๋ ํด๋์ค ํ์ฉํ์ฌ ๋ณํ
commons-io ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น >> File ๋ค๋ฃฐ ๋ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
package com.smhrd.shop.converter;
import java.io.File;
import java.io.IOException;
import java.util.Base64;
import org.apache.commons.io.FileUtils;
public class ImageToBase64 extends imageConverter<File, String> {
@Override
public String convert(File f) throws IOException {
//ํ์ผ์ ๋ฌธ์์ด๋ก ๋ณํํ๋ ์ฝ๋
//1. ํ์ผ ๊ฐ์ง๊ณ ์์ ๋ฐ์ดํธ ๋ฐฐ์ด ํํ๋ก ์ฝ๊ธฐ
byte[] fileContent = FileUtils.readFileToByteArray(f);
//2. ๋ฐ์ดํธ๋ฐฐ์ด ํํ๋ฅผ ์ธ์ฝ๋ฉํ์ฌ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝ(Base64)
String result = Base64.getEncoder().encodeToString(fileContent);
return result;
}
}
๊ฒฐ๊ณผํ๋ฉด
add Request