프로젝트/WALFI

[Back-end] 프로젝트 백엔드 DB추가, SELECT * (JSP, MySQL)

코딩하는 공대생 2024. 7. 9. 15:26
반응형

기존에 프로젝트에서 각종 금융 상품 정보를 불러오는 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 만들어줬음. 

 

진짜.. 어쩌다 백엔드....

 


잘 오는걸 볼 수 있다... ㅎ...

반응형