티스토리 뷰

SMALL

과정은 아래와 같다.

1. spring controller에서 python을 실행

2. python 실행 후 결과로 csv파일 생성

3. service에서 csv파일 내용을 entity형식으로 교체해 db(mysql)에 저장

4. 결과 받기

 

1. controller

 추가 설명 : 나같은 경우 userId로 저장될 csv 파일 내용을 구분하였다.

@RestController
@Slf4j
@RequestMapping(value = "/face")
public class FaceController {

    @Autowired
    private CSVService csvService;

    @Autowired
    private DataRecordRepository dataRecordRepository;

    // 앱에 자신의 면허증 - 얼굴 등록
    @PostMapping("/first")
    public ResponseEntity<String> runPythonAndSaveCSV(@RequestParam("userId") Long userId) {
        try {
            ProcessBuilder pb = new ProcessBuilder("python", "실행시킬 python경로");
            Process process = pb.start();

            // 표준 출력 및 오류 읽기
            BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
            BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));

            StringBuilder output = new StringBuilder();
            StringBuilder errorOutput = new StringBuilder();
            String line;

            // 표준 출력 읽기
            while ((line = stdInput.readLine()) != null) {
                output.append(line).append("\n");
            }

            // 표준 오류 읽기
            while ((line = stdError.readLine()) != null) {
                errorOutput.append(line).append("\n");
            }

            // Python 스크립트 실행 대기
            int exitCode = process.waitFor();
            if (exitCode == 0) {
                // CSV 파일을 데이터베이스에 저장
                csvService.saveCSVToDatabase("python 실행 후 저장된 csv 경로", userId);
                return ResponseEntity.ok("CSV file processed and data saved to database.");
            } else {
                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Python script execution failed");
            }

        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Exception occurred: " + e.getMessage());
        }
    }
    }

 

Entity : User

@Entity
@Builder
@Getter
@Table(name = "user")
@NoArgsConstructor
@AllArgsConstructor
@DynamicInsert
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable= false)
    private Long id;

	... 생략 ...
    
	@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<DataRecord> dataRecords = new ArrayList<>();

    public void setDataRecords(List<DataRecord> dataRecords) {
        this.dataRecords = dataRecords;
    }
}

 

Dto, entity : DataRecordDto

 csv 행렬에 따라 구조를 만들어주면 된다.

 아래 코드는 dto 구조인데, entity 구조랑 그닥 다르지 않아서 dto 코드만 가져왔다.

@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class DataRecordDto {

    private String feature;
    private String col1;
    private String col2;


    //Schedule 엔티티 반환
    public DataRecord toEntity(){
        return DataRecord.builder()
                .feature(this.feature)
                .col1(this.col1)
                .col2(this.col2)
                .build();
    }
}

 

Repository

당연히 userRepositoy도 만들어줬다. userRepository는 만들기 쉬우니까 패스하도록 한다.

@Repository
public interface DataRecordRepository extends JpaRepository<DataRecord, String> {
        List<DataRecord> findByUserId(Long userId);
}

 

2. service

@Service
public class CSVService {

    @Autowired
    private DataRecordRepository dataRecordRepository;

    // CSV 파일을 데이터베이스에 저장하는 메서드
    public void saveCSVToDatabase(String csvFilePath, Long userId) throws IOException {
        try (BufferedReader reader = new BufferedReader(new FileReader(csvFilePath))) {
            String line;
            // CSV 파일의 각 라인을 읽어서 데이터베이스에 저장
            while ((line = reader.readLine()) != null) {
                String[] cols = line.split(","); // CSV 파일의 각 열을 분리

                // DataRecordDto를 사용하여 엔티티로 변환
                DataRecordDto dataRecordDto = new DataRecordDto(cols[0], cols[1], cols[2]);
                DataRecord dataRecord = dataRecordDto.toEntity();

                // User 엔티티와 연결
                User user = new User();
                user.setId(userId); // 주어진 userId로 사용자 설정
                dataRecord.setUser(user);

                // 데이터베이스에 저장
                dataRecordRepository.save(dataRecord);
            	}
        	}
    	}
    }

 

 

 

4. 실행 결과

 

문제

사실 python을 실행시켰을 때, 만들어지는 csv파일의 열이 너무 길어서 entity를 만들기 곤란했다.

그래서 무식하게 해결한 결과물이 csv파일이 저장되기 전에 행렬을 바꾸는 것이었다. (열은 100이 넘는데, 행같은 경우 3행밖에 안됐었다.)

그렇게 만든 결과가 저건데, 내가 찾고싶은 건 python을 실행시켜 나온 결과물 csv 파일을 spring에서 읽지 않고

그대로 db에 저장하는 것이었다.

왜 어제는 aws s3에 파일을 저장하게 하고 aws s3에 저장된 파일 경로를 db에 저장하면 된다는 걸 생각하지 못했는지

알길이 없다...

아무튼 이 코드도 되게 공들여서 한 건데 너무 아깝고 다음에 사용할 수도 있을 것 같아서 코드를 남겨둔다.

이제 다시 저 코드들을 거의 지우고 파일 경로를 저장하는 걸로 바꿔야겠다. 

반응형
LIST
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함