본문 바로가기
[SSAFY] 관통 프로젝트

[SSAFY] 관통프로젝트 문제와 해결과정 & 소감 - 1 - Java

by codeomni 2024. 8. 3.
반응형

1. 목표

본 프로젝트의 목표는 객체 지향 개념과 Java의 기본 문장을 이해하고 활용하는 것입니다. 이를 통해 이벤트 처리를 람다 표현식으로 작성하고, XML, JSON, CSV 파일로부터 필요한 정보를 파싱할 수 있는 능력을 배양하는 데 있습니다.

  • 개발 언어: Java
  • 개발 환경: Eclipse, JDK 17

 

2. 개발

  • 구현 목록
    • 공공 데이터 포털의 전국 관광지 정보 표준 데이터를 처리

 

3. 문제점 및 해결 방법

문제점 1: CSV 파일 가공 문제

  • 사전지식 부족: CSV 파일 구조와 처리 방법에 대한 이해가 부족했습니다.
  • 쉼표(,)로 분리된 파일: CSV 파일은 기본적으로 쉼표로 구분되지만, 특정 셀 내에도 쉼표가 포함된 경우 이를 제대로 처리하지 못하는 문제가 발생했습니다.
  • 타이틀 수정: 파일의 첫 번째 줄인 헤더 부분이 적절하지 않아 이를 수정해야 했습니다.
  • 엔터 포함 셀 수정: 셀 내에 줄 바꿈 문자가 포함된 경우 제대로 처리되지 않는 문제가 발생했습니다.
  • 쉼표 포함 데이터 수정: 각 셀이 쉼표를 포함하는 경우에도 정상적으로 데이터를 처리해야 했습니다.

해결 방법:

  • 각 셀을 처리할 때, 쉼표를 단순히 구분자로 사용하지 않고, 쉼표가 포함된 데이터를 정확히 처리할 수 있는 라이브러리를 사용하여 문제를 해결했습니다.

 

문제점 2: 파서 문제

  • 데이터 읽기 문제: 삽입된 데이터 중에서 쉼표나 엔터가 포함된 데이터를 정상적으로 읽어올 수 없는 문제가 발생했습니다.
  • 데이터 깨짐 문제: 파서의 인코딩 문제로 인해, CSV 파일을 읽을 때 데이터가 깨지는 현상이 발생했습니다. EUC-KR 인코딩을 사용한 파일을 UTF-8로 변경할 필요가 있었습니다.
1
try(BufferedReader is = new BufferedReader(new InputStreamReader(new FileInputStream(file), "euc-kr")))

해결 방법:

  • 파싱 시 인코딩 방식을 정확히 지정하여 EUC-KR에서 UTF-8로 변경했습니다. 이를 통해 데이터가 깨지지 않고 정상적으로 읽혀지도록 했습니다.

 

4. 유지보수

수업시간에 배운 내용을 바탕으로 인터페이스를 활용하여 유지보수가 용이한 구조를 설계했습니다. CSVParser라는 공통 인터페이스를 구현함으로써, 다양한 CSV 파일에 대한 파싱 기능을 확장할 수 있도록 했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.List;
 
// CSVParser 인터페이스 정의, 제네릭 타입 T를 사용하여 다양한 데이터 타입을 처리할 수 있도록 설계
public interface CSVParser<T> {
    
    // 데이터를 로드하는 메서드, CSV 파일을 읽고 데이터를 메모리에 로드하는 역할
    void loadData();
    
    // 로드된 데이터를 반환하는 메서드, List 형태로 반환
    List<T> getData();
    
}

이 인터페이스를 구현하여 서로 다른 데이터를 처리하는 두 개의 파서를 작성했습니다. 각각의 파서는 특정 CSV 파일 형식에 맞춰 데이터를 로드하고 이를 List<T> 형태로 반환하도록 설계되었습니다.

 

5. 소감

싸피에 와서 처음 진행한 팀 프로젝트였으며, 자바로 프로젝트를 진행하면서 학습한 내용을 바탕으로 기능을 구현하고 이를 화면에 출력할 수 있었습니다. 화면 구현에는 익숙하지 않은 라이브러리를 사용하여 어려움이 있었으나, 팀원들과의 협업을 통해 문제를 해결할 수 있었습니다.

특히, Git 커밋과 관련된 도구 사용에 익숙해질 필요성을 느꼈습니다. 팀원들이 작성한 코드를 그대로 사용하지 않고 문서화하는 것의 중요성도 깨달았습니다. 앞으로는 최소한의 주석이라도 달아 다른 팀원들이 이해하기 쉽게 해야겠다고 다짐했습니다.

또한, 인코딩 문제를 해결하기 위해 팀원이 작성한 코드를 그대로 사용한 결과, 화면 출력 시 문제가 발생했습니다. 이 문제를 통해 인코딩의 중요성을 깨달았고, 앞으로는 이와 같은 사항에 더 신경 쓸 것입니다.

 

댓글