SpringBoot

SpringBoot - findAllBy, addAll, Between, Cors (2024.05.16)

hminor 2024. 5. 17. 00:10
반응형

2024.05.16(목) 

1. findAllBy
해당 테이블의 PK가 아닌 다른 컬럼에 해당하는 모든 데이터를 조회할 때 사용.
여기서 만약 해당 테이블에 FK가 있고 FK에 해당하는 특정 컬럼으로 조회할 때는
컬럼_컬럼 이렇게 하는데 예시는 아래와 같으며 정정해야할 정보가 있다면 댓글에 남겨주시면 감사하겠습니다.
그리고 지난 인턴과정에서 PK가 아닌 특정 컬럼으로 조회하기 위해 findBy 또는 findAllBy로 조회하려 했는데 안된 경험이 있다.
이유는 컬럼명을 스네이크 케이스로 컬럼명을 작성해서 조회가 안됐으며
JPA를 위해선 보통 카멜 케이스로 작성한다고 한다.


2. addAll
구현하려던 것이 프론트에서 특정 일자를 String 타입으로 서버에 전달하면
StockRepository에 있는 모든 row를 조회해서 해당 row에 있는 createdAt 컬럼과 비교해서 같다면
DetailStockRepository에 있는 FK인 stock의 stockId와 해당 row의 stockId가 같은 모든 detailStockEntity를 
detailStockEntities에 추가하려고 해서 2중 for문으로 작성하려고 하니 노란색 밑줄을 보니 addAll을 사용하라는 말이 있어서
addAll이 뭔지 찾아보니까 Collection에 다른 Collection의 모든 요소를 추가할 때 사용되며
반복문을 사용해서 요소를 하나씩 추가하는 것보다 더 효율적으로 저장되기에 addAll() 메서드를 자주 사용할 듯하다.


3. JPA (Between)
DetailStockRepository의 각 주식 값의 LocalDateTime 타입의 
createdAt과 프론트에서 전달받은 String 타입의 연도-월-일 값과 비교 후 같으면 detailStockEntities에 담아 return 하려고 했는데
문제가 createdAt은 LocalDateTime 타입이고 전달받는 건 연도-월-일의 String 타입이라 
LocalDate로 parse를 해도 원하는대로 조회가 어려울 것 같아서 2가지 방법으로 조회하도록 했는데 
첫 번째 방법은 stockEntities의 각각의 stock에 대한 createdAt을 toString().split("T")[0]과 
전달 받은 clickDate이 같은 경우 조회 다음 배열에 추가하는 방법과 

두 번째 방법은 JPA의 Between을 활용해서 findByCreatedAtBetween을 활용해서 
LocalDate로 변환한 date를 해당 일자의 시작 시간인 atStartOfDaty()와 끝 시간인 date.atTime(23,59,59)로 타입을 LocalDateTime으로 변경 후
조회하면 해당 범위에 있는 모든 데이터를 조회할 수 있기에 좋다.

다만 두 번째 방법은 데이터가 많아질수록 부하가 커질 것이기에 첫 번째로 적용하는게 더 좋을것 같다. 

// 첫 번째
public List<DetailStockEntity> getSpecificDateStockDataService(String clickDate){
        System.out.println(clickDate);
        // 현재 하고자 하는 건
        // 특정 stockId를 찾은 다음 detailStockEntity의 데이터 중 stockId와 같은 모든 데이터를 찾기
        List<StockEntity> stockEntities = stockRepository.findAll();
        List<DetailStockEntity> detailStockEntities = new ArrayList<>();

        for (StockEntity stock: stockEntities) {
            if (stock.getCreatedAt().toString().split("T")[0].equals(clickDate)) {
                detailStockEntities.addAll(detailStockRepository.findAllByStock_StockId(stock.getStockId())); // addAll
            }
        }
        return detailStockEntities;
    }

// 두 번째
    public List<DetailStockEntity> getSpecificDateStockDataService(String clickDate) {
        // 클릭한 날짜를 LocalDate로 변환
        LocalDate date = LocalDate.parse(clickDate);

        // 클릭한 날짜의 시작과 끝 LocalDateTime 계산
        LocalDateTime startDateTime = date.atStartOfDay();
        LocalDateTime endDateTime = date.atTime(23, 59, 59); // 해당 일자의 마지막 시간으로 설정

        List<DetailStockEntity> detailStockEntitiesList = new ArrayList<>();
        // 클릭한 날짜에 해당하는 StockEntity 찾기
        List<StockEntity> stockEntities = stockRepository.findByCreatedAtBetween(startDateTime, endDateTime);
        for (StockEntity stock: stockEntities) {
            List<DetailStockEntity> detailStockEntities = detailStockRepository.findByStock_StockId(stock.getStockId());
            detailStockEntitiesList.addAll(detailStockEntities);
        }
        return detailStockEntitiesList;
    }



4. Cors
지난 토이프로젝트로 작업했던 코드들이 사라져서 살짝 시간이 흘러버려서 작업했었던 코드들이 없어진게 너무 속상해서 끄적...
우선 지난 다른 토이프로젝트에서 작업했었던 cors 문제 해결 방법으로 CorsConfig 클래스를 활용해서 아래와 같이 해결.

// CorsConfig
@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //todo
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:8080", "http://localhost:3000")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .exposedHeaders("Access-Control-Allow-Headers, Authorization, X-Refresh-Token")
                .allowCredentials(true);
    }

}