[Back-end] 프로젝트 백엔드 DB추가, SELECT * (JSP, MySQL)
기존에 프로젝트에서 각종 금융 상품 정보를 불러오는 API가 없었고, 웹 버전을 제작하면서 필요하게 되어서 직접 짜봄...
일단 JSP를 거의 모르고 코드만 대충 읽어서 보수하는 수준이었기 때문에 새로 짜려면 여러가지 알아야 했다.
1. DB 추가
JSP에 ddl-auto가 되어 있지만 어떻게 쓰는지 모르기 때문에 직접 추가해 줌.
CREATE TABLE walfi.product_info(
상품명 varchar(100) NOT NULL,
기본금리 float NOT NULL,
우대금리 float NOT NULL,
가입최대기간 INT NOT NULL
);
// PK 설정 안해줘서
ALTER TABLE walfi.product_info ADD constraint pk_product_infoproduct_info primary key(상품명);
// COLUMN 상품 설명 추가.
ALTER TABLE walfi.product_info ADD COLUMN 상품설명 VARCHAR(50);
// 하나씩 추가
INSERT INTO walfi.product_info VALUES ("Top 10 정기예금", 3.7, 0.1 , 12, "시즌 TOP 10을 위한 특별한 혜택");
INSERT INTO walfi.product_info VALUES ("Battle 정기예금", 3.7, 0.1 , 12, "WALFI 이용자들을 위한 화끈한 정기 예금");
INSERT INTO walfi.product_info VALUES ("Land 정기예금", 3.7, 0.1 , 12, "지점 정복자를 위한 점령한 지점 수 * 0.1");
2. Domain 추가
여기서부터 어질어질 했다.. dto dao domain repostiory service 등등... 엄청 많은 폴더 가운데 각 어떤 기능을 하는지 잘 모름...
그래도 해야하는 기능은 간단하게, 위에 생성한 Table에 있는 모든 도메인을 가져오는 SLECT * FROM PRODUCT_INFO 만 수행하면 된다.
일단, 도메인 폴더에서 Entity(DB와 매핑 시키는 클래스) 를 작성해 준다.
혹시 추후에 연동이 안되면 이거 넣어줄 예정.
@Table(name = "`product_info`")
package com.shinhan.walfi.domain.banking;
import lombok.Getter;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
@Getter
public class ProductInfo {
@Id
private String 상품명;
private float 기본금리;
@Column(name="우대금리")
private float 추가금리;
private int 가입최대기간;
private String 상품설명;
}
3. Repository 추가
Domain을 추가해줬기 때문에, DB에 연동해서 query문을 작동시켜야 한다.
package com.shinhan.walfi.repository.banking;
import java.util.List;
import com.shinhan.walfi.domain.banking.ProductInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
public interface ProductRepostiory extends JpaRepository<ProductInfo, String> {
@Query(value = "select * from product_info", nativeQuery = true)
List<ProductInfo> findAllProduct();
}
4. Dto 추가
처음에 한국어로 했다가 영어로 변경
package com.shinhan.walfi.dto.product;
import lombok.Builder;
import lombok.Getter;
import javax.persistence.Column;
@Getter
@Builder
public class ProductDto {
private String productName;
private float baseInterestRate ;
private float plusInterestRate;
private int maxSubscriptionPeriod ;
private String info;
}
5. Service 추가
public interface ProductService {
List<ProductDto> getProductList();
}
private ProductDto getProductDto(ProductInfo product) {
return ProductDto.builder()
.productName(product.get상품명())
.baseInterestRate(product.get기본금리())
.plusInterestRate(product.get추가금리())
.maxSubscriptionPeriod(product.get가입최대기간())
.info(product.get상품설명())
.build();
}
@Override
public List<ProductDto> getProductList() {
List<ProductInfo> productList = productRepostiory.findAllProduct();
List<ProductDto> dto = productList.stream().map(product -> getProductDto(product)).collect(Collectors.toList());
log.info("=== 사용자 리스트 조회 ===");
return dto;
}
이게 lombok으로 Getter 어노테이션 써서 될 줄 알았는데 그러면 class 내부 멤버 변수들을 하나하나 get으로 가져올 수 있는 거였음. 아차차.. 원래 getter가 그런거,...
그래서 getProductDto를 해주는 부분을 따로 만들어야 했다.
6. Controller 추가
@GetMapping("/product-list")
@ApiOperation(value = "금융 상품 목록 조회")
public ResponseEntity<HttpResult> getUserList(){
List<ProductDto> productList = productService.getProductList();
HttpResult res;
res = HttpResult.getSuccess();
res.setData(productList);
return ResponseEntity.status(res.getStatus()).body(res);
}
getMapping으로 /product/product-list 로 API 만들어줬음.
진짜.. 어쩌다 백엔드....
잘 오는걸 볼 수 있다... ㅎ...