사용자 정보 테이블에 대량의 데이터를 넣어야 하는 경우에 사용했던 방법입니다. 사용자 정보 테이블의 password 필드는 단방향 암호화로 넣어야 하기때문에 db로 그냥 값을 넣는 경우 옳바르지 않는 데이터가 들어가게 됩니다. 이럴 경우 프로그램을 통해서 데이터를 insert 해줘야 합니다. 제공 받은 CVS 파일을 프로젝트내의 resource/cvs 폴더에 넣습니다.

CVS 파일을 줄단위로 읽어들여 , 를 구분자로 분리한 후에 각각의 필드를 insert 하면되는데, 굳히 코드를 구현할 필요 없이 opencsv 라이브러리를 이용했습니다. 우선 build.gradle 에 아래와 같은 라이브러리를 추가 합니다.


dependencies {
    implementation 'com.opencsv:opencsv:5.4'
}

large_user_datas.cvs 이 파일을 라고 가정하고 아래와 같이 코드를 작성합니다.



@Autowired
UserService service;
    
@Test
@DisplayName("사용자 더미 데이터 추가 - 파일로 부터")
@WithMockUser(username = "test@mycompany.com", roles = {"ADMIN"}) // spring security 되어 있는 경우 mockuser가 없으면 에러가 발생할 수 있습니다. 
@Disabled // 빌드/배포시 실행될 수 있음으로 disable 시킴
void saveDummyfromFile() {

    val EXPECT_FIELD_COUNT = 12; // 몇개의 컬럼으로 이루어져 있는지 확인 하여 하드 코딩해 놓습니다.

    String loginId = SecurityContextHolder.getContext().getAuthentication().getName();

    val data = new UserDto();   // 사용자 테이블의 dto

    try {
        val resource = new ClassPathResource("cvs/large_user_datas.cvs").getInputStream();
        val reader = new BufferedReader(new InputStreamReader(resource));
        val csvReader = new CSVReader(reader);
        csvReader.skip(1); // 첫번째 라인은 헤더 데이가 있음으로 skpi 합니다.

        String[] record;

        var cnt = 0;
        while ((record = csvReader.readNext()) !=null) {
            cnt++;
            if (record.length != EXPECT_FIELD_COUNT) {
                // 혹시 잘못된 데이터가 있는 경우 그냥 오류를 발생시킵니다.
                log.error("{}'s row error! check again!",cnt);
                return;
            }
        }

        while ((record = csvReader.readNext()) !=null) {
            data.setEmail(record[0]);       // 이메일
            data.setName(record[1]);        // 이름

            data.setEmpPassword(record[0]); // 비밀번호 아이디와 패스워드를 동일하게 초기화 하도록 했습니다.
            data.setRole("U");              // role
            data.setEmpTelno(record[5]);    // 전화번호
            data.setSDt("20210101");        // 시작일
            data.setEDt("20501231");        // 종료일
            data.setRegistDtm("20210101120000");    // 등록일시
            data.setUpdtDtm("");                    // 수정일시
            data.setRegistId(loginId);              // 등록자 ID 
            data.setUpdtUsername("");               // 수정자 ID
            service.save(data);
        }

    } catch (IOException e) {
        log.error(e.getMessage());
    } catch (CsvValidationException e) {
        log.error("CsvValidationException", e.getMessage());
    } catch (Exception e) {
        log.error(e.getMessage());
    }
}