관리 메뉴

피터의 개발이야기

[Spring] 항상 동일한 데이터를 DB 호출하는 경우 Bean으로 데이터 생성하여 사용하기 본문

Programming/Spring

[Spring] 항상 동일한 데이터를 DB 호출하는 경우 Bean으로 데이터 생성하여 사용하기

기록하는 백앤드개발자 2021. 2. 1. 08:00
반응형

 

코드를 관리하는 방법은 다양합니다. 대표적으로 enum으로 관리할 수도 있지만, 코드들이 다양하고 정말 변하지 않는 것도 있을 수 있지만

때때로 변경 추가 삭제 작업이 필요한 경우가 있습니다. 이런 코드들을 대부분 동일한 데이터를 디비에서 조회하게 되는데요, 이것을 Bean으로 데이터를 저장하여 관리하는 방법에 대해서 정리하였습니다.

 

 

테스트 코드 테이블 생성

create table code_data
(
    id         int auto_increment
        primary key,
    group_name varchar(10)  not null,
    code_name  varchar(20)  not null,
    code_value varchar(20)  not null,
    memo       varchar(100) null comment '설명',
    constraint group_name
        unique (group_name, code_name, code_value)
);

테스트용으로 테이블을 생성하고 4개의 데이터를 생성합니다.

 

 

DB에서 데이터를 조회하는 방법

    @GetMapping("/getCodeData")
    @ApiOperation(httpMethod = "GET", value = "getCodeData", notes = "getCodeData", tags = "테스트")
    public List<CodeDataVO> getCodeData(){
        return testService.getCodeList();
    }

DB에 직접 접근하여 데이터를 조회할 수 있습니다.

 

 

빈 객체로 데이터 생성된 데이터 조회

 

CodeDataSet.java

@Configuration
@RequiredArgsConstructor
public class CodeDataSet {

    private final TestService testService;

    public List<CodeDataVO> codeDataSetList;

    @Bean
    public void setCodeDataList(){
        this.codeDataSetList = testService.getCodeList();
    }

}

해당 매서드를 빈객체로 지정하게 되면  컨테이너에 CodeDataSet.codeDataSetList에 코드 데이터가 저장되어 있게 됩니다.

@Bean은 컨데이터가 객체의 kife-cycle을 관리하여 줍니다. Bean으로 생성된 객체는 기본적으로 Singleton이기에 한번 생성되면서 필요한 데이터를 받아 객체에 저장해 둡니다. 변하지 않는 데이터의 경우 싱글톤으로 한번 생성되어 메모리상에 존재하기 때문에 반복적인 디비 접속을 방지할 수 있습니다.

 

 

컨트롤러에서 조회

@GetMapping("/getCodeDataFromBean")
@ApiOperation(httpMethod = "GET", value = "getCodeDataFromBean", notes = "getCodeData", tags = "테스트")
public List<CodeDataVO> getCodeDataFromBean(){
    return codeDataSet.codeDataSetList;
}

빈으로 생성되어 있는 코드 데이터를 조회하게 됩니다.

 

스웨거로 테스트해보면 동일한 데이터를 확인할 수 있습니다.

 

 

 

코드 변경 방법

코드가 추가되었다고 가정해 보겠습니다.

기존 코드에서 데이터 하나를 추가하여 디비상에서는 5개의 코드가 존재합니다.

 

하지만 스프링 컨테이너에 빈으로 생성되어 있는 데이터는 기동 당시의 상태가 그대로 보존되어 있습니다.

 

 

 

빈 데이터 갱신

@GetMapping("/updateCodeData")
@ApiOperation(httpMethod = "GET", value = "updateCodeData", notes = "updateCodeData", tags = "테스트")
public String updateCodeData(){
    String result = "suc";
    codeDataSet.codeDataSetList = testService.getCodeList();
    return result;
}

빈 데이터 갱신하기 위해 업데이트 로직을 만들어야합니다.

 

updateCodeData 호출

 

빈으로 생성된 데이터가 업데이트가 되었습니다.

반응형
Comments