군만두의 IT 공부 일지

[Java] 패스트캠퍼스 백엔드 개발 부트캠프 8기 토이 프로젝트 1 DAY3 본문

개발일지/패스트캠퍼스

[Java] 패스트캠퍼스 백엔드 개발 부트캠프 8기 토이 프로젝트 1 DAY3

mandus 2024. 4. 4. 01:42

목차

    📅진행기간: 2024년 4월 1일 ~ 2024년 4월 5일

     

    예외 처리 구현 2

     

    ⭐요약


    • 2일차에는 JsonManager의 여행 json 파일 읽기, 쓰기 기능을 구현하고 예외 처리를 어떻게 할지 대해 고민함.
    • 3일차에는 예외 처리를 구현 현황에 대해 공유하고, 수정사항을 반영 후 리팩토링 및 발표회 준비에 대해 생각해야 함.

    ⭐예외 처리 구현


    오늘은 주로 다른 팀원들이 입출력예외 처리에 대한 부분을 진행함. 그리고 리팩토링을 어떻게 할지, 앞으로의 계획에 대해 논의함. 예외 처리 방법, 프로젝트 구조의 최적화, 그리고 차별화 전략에 대해 중점을 두었음.

     

    FileIOException은 파일 입출력(IO) 작업 중에 발생할 수 있는 예외를 나타냄. 파일을 읽거나 쓰는 도중에 오류가 발생하면 이 예외를 발생시킬 수 있음.

    try {
    	// 파일 읽기 로직
    } catch (Exception e) {
    	// 파일 읽기 중 입출력 오류 발생
    	throw new FileIOException("파일 입출력 예외 발생");
    }

     

    오전 10시에 회의했을 때, 파일 입출력에 대한 예외 처리는 다 했지만 날짜 유효성 검사에 대한 예외 처리는 아직 구현하지 못해 오늘 빠르게 구현하기로 함.

     

    팀원의 요청으로 예외 출력할 때, 예외가 발생하는 이유도 출력하도록 함. 예를 들어, 출발 날짜가 도착 날짜에 대해 다음과 같이 startDate와 endDate를 포함시켜서 예외 처리를 던지는 것임.

    thorw new InvalidDateOrderException(startdate + "," + enddate);

     

    이 요청을 받았을 때, 아래와 같이 writeTrip() 메소드에 try-catch 문에서 InvalidDateOrderException으로 에러 메시지를 던짐. InvalidDateOrderException은 날짜 순서가 유효하지 않을 때 발생하는 예외임. 여행의 출발 날짜가 도착 날짜보다 뒤에 있을 경우 이 예외를 발생시키도록 할 수 있음.

    /**
         * 새로운 여행 정보를 JSON 파일로 저장
         * @param trip 저장할 여행 정보가 담긴 Trip 객체
         * @return 저장 성공 여부. 성공적으로 저장되면 true, 그렇지 않으면 false 반환
         */
    public void writeTrip(Trip trip) throws FileIOException {
            LocalDate startDate = trip.getStartDate();
            LocalDate endDate = trip.getEndDate();
    
    	try {
                // 1. 출발 날짜와 도착 날짜의 순서가 잘못된 경우 예외 발생
                if (startDate.isAfter(endDate)) {
                    throw new InvalidDateOrderException("출발 날짜가 도착 날짜보다 이후일 수 없습니다. " + startDate + " > " + endDate);
                }
                
    	// 여행 정보 JSON 객체 생성 및 파일 쓰기 로직
        
        catch (InvalidDateOrderException e) {
                // 1에서 발생한 예외 처리
                System.out.println(e.getMessage());
            }
    }

     

    예외 처리 구현을 하면서 TripJsonManager 클래스의 모든 메소드에 Javadoc을 사용하여 코드를 이해하기 쉽게 정리함. 또한, 팀원의 요청에 맞춰 예외 처리 코드가 어떤 예외를 담고 있는지도 주석으로 작성하려고 함.

     

    Main 클래스를 실행해서 예외 처리된 부분을 테스트하면 사진과 같이 확인할 수 있음.

    ⭐발표회 준비 아이디어


    4월 5일 오후 5시에 있을 발표회 준비를 위해 발표 내용프로젝트 차별화 전략으로 내세울 만한 것들을 생각해야 함.

    1. json-simple 선택 이유

    json 데이터 처리를 위한 자바 라이브러리는 다양함. gson, jackson, 그리고 json-simple 세 가지 라이브러리를 비교하고, 왜 우리 프로젝트에서 Json-Simple을 선택했는지에 대해 정리함.

    1) Gson
    Gson은 Google이 제공하는 json 라이브러리로, Java 객체와 json 데이터 사이의 변환(직렬화와 역직렬화)을 쉽게 해줌. Gson은 API 사용이 간단하며, 필요에 따라 사용자가 직접 json 변환 방법을 정의할 수 있어, 소규모에서 중규모 프로젝트에 적합함.

    *직렬화: 객체를 데이터 스트림으로 변환하여 JSON 형태로 저장하는 과정 ↔ 역직렬화


    2) Jackson
    Jackson은 성능 면에서 매우 빠른 json 라이브러리로, 특히 대규모 데이터를 처리할 때 효과적임. 이 라이브러리는 스트리밍 API를 제공하여, 데이터를 순차적으로 읽고 쓰면서 높은 성능을 발휘함. Jackson은 다양한 방법으로 데이터를 바인딩(연결)할 수 있어, 복잡한 json 구조를 다루는 큰 규모의 애플리케이션에 적합함.

    *스트리밍 API: 데이터를 한 번에 하나씩 순차적으로 처리하는 방식을 제공하는 프로그래밍 인터페이스

    3) Json-Simple
    Json-Simple은 이름에서 알 수 있듯이 간단하고 가벼운 JSON 처리를 목표로 하는 라이브러리임. 이 라이브러리는 사용하기 쉬운 API와 낮은 의존성을 제공하여, 복잡한 설정 없이도 JSON 데이터를 쉽게 파싱(분석)하고 생성할 수 있음. Json-Simple은 그 사용의 단순성으로 인해 소규모에서 중규모 프로젝트에 적합함.

     

    4) 성능 정리

    • 큰 파일: Jackson > Json-Simple > Gson
    • 작은 파일: Json-Simple > Gson > Jackson


    이 프로젝트는 json데이터의 복잡성이 높지 않고, 처리해야 할 데이터도 대규모 데이터가 아니었음. 또한, 팀 모두가 빠르게 익힐 수 있고, 추가적인 성능 부담 없이 사용할 수 있는 라이브러리를 원했기 때문에, 이러한 요구 사항을 충족시키는 Json-Simple을 사용함.

     

    프로젝트 성능 개선을 위해 어떻게 해야 할지도 생각해야 함. 

    2. 인터페이스 활용

    여행과 여정 JsonManger 클래스에서 공통된 메소드 시그니처(매개변수와 리턴 값)를 뽑아서 인터페이스를 구현할 수 있는지에 대한 방안을 고려함. 하지만, 여행과 여정을 각각 다른 사람이 클래스를 구현해서, 매개변수나 리턴 값이 달라 고려해야 할 사항이 많음. 코드의 중복을 줄이고, 유지보수를 용이하게 하는 구조적 최적화에 적절한 것 같음.

    3. Lombok 라이브러리 도입

    Lombok은 자바 개발을 단순화하는 라이브러리로, 반복적으로 작성해야 하는 보일러플레이트 코드(컴퓨터 프로그래밍에서 사용되는 용어로 최소한의 변경으로 여러곳에서 재사용되며, 반복적으로 비슷한 형태를 띄는 코드. 예: getters, setters, toString 등)를 줄여줌. Lombok을 사용하면 @Data, @Getter, @Setter 같은 어노테이션을 클래스에 적용하기만 하면, 컴파일 시점에 필요한 메소드들이 자동으로 생성됨. 코드를 더 깔끔하게 유지하고, 개발 시간을 단축시킬 수 있는 Lombok을 도입하여 리팩토링을 진행하면 코드를 개선할 수 있을 것임.

    4. CRUD 기능

    우리 팀만의 차별점을 도출하기 위해 '훅'에 대한 아이디어를 모색함. 내일까지 차별화할 수 있는 아이디어를 생각하기로 함. 만약, 정하지 못했다면 다른 팀이 구현한 것처럼 기본 CRUD 기능을 구현하여 프로젝트 완성도를 높이는 방향으로 마무리할 예정임.

    ⭐후기


    • 현재까지의 프로젝트의 진행 상황을 점검하고, 앞으로의 방향을 명확히 하도록 회의를 계속 함. 출력까지 끝냈기 때문에 과제 조건을 거의 다 충족했음.
    • 기술적인 문제 뿐만 아니라 프로젝트의 구조적인 최적화와 차별화를 위해 어떻게 해야 할지 방안을 찾아야겠음. 마지막까지 적극적으로 참여해서 개발자에 한 걸음 가까워지고 싶음.

    ⭐참고자료


    1) ming.log, "JavaDoc 주석 알고쓰자!", 2021.10.14, https://velog.io/@ming/JavaDoc-주석-알고쓰자

    2) DYKO, "[Java] Json을 Java 객체로 변환하는 방법(Gson, Jackson, JSON-SIMPLE)", 2023.05.27, https://velog.io/@dyko/json-parser-libraries

    3) 망나니 개발자, "[Java] Lombok이란? 및 Lombok 활용법", 2020. 6. 10, https://mangkyu.tistory.com/78

     

    이 글은 패스트캠퍼스백엔드 개발 캠프에서 공부한 내용을 작성한 것입니다.
    Comments